一,同步调用
从一个程序同步调用其他的 ABAP 程序,有 2 种方式:
1 ,调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行。如:
CALL FUNCTION <function>
SUBMIT <program> AND RETURN
CALL TRANSACTION <tcode>
使用 CALL FUNCTION ‘AAA’ 调用 FM 的时候,相应的 FUNCTION GROUP 被加载到调用程序所在的 internal session 。当 FM 执行完毕,接着执行调用程序。 FUNCTION GROUP 和其 GLOBAL DATA 会一直保存在这个 internal session 直到调用程序结束。当调用程序再次调用这个 FM 的时候,不会再次加载相应的 FUNCTION GROUP 。这个 FUNCTON GROUP 的 GLOBAL DATA 和第一次调用它时的内容是一样的。
使用 SUBMIT <program> AND RETURN 或者 CALL TRANSACTION <tcode> 的时候,实际是插入了一个新的 internal session ,当被调用的程序执行完毕之后,新插入的 internal session 会被删除,继续执行调用程序。可以使用 leave program 语句来结束程序。
2, 调用程序被结束,被调用程序开始执行。如:
SUBMIT <program>
LEAVE TO TRANSACTION <tcode>.
使用 SUBMIT 语句之后,调用程序从所在的 internal session 中被删除了,被调用的程序被加载到这个 internal session 。
使用 LEAVE TO TRANSACTION <tcode> 之后,当前 external session 中的所有 internal session 会被删除,并产生一个新的 internal session ,被调用的 tcode 会加载到这个新的 internal session 中。特别要注意的是,使用这个语句之后, ABAP MEMORY 会被初始化,意思就是你不可以通过 ABAP MEMORY 向被调用的 tcode 传值。
二, FUNCTION MODULE 的异步调用
CALL FUNCTION ‘AAA’ STARTING NEW TASK <taskname>
PERFORMING <subroutine> ON END OF TASK
EXPORTING
…..
使用上面语句之后, AAA 和调用其的程序会并行运行。可以在 <subroutine> 中使用 RECEIVE RESULTS FROM FUNCTION ‘AAA’ 语句来获得 FUNCTION 运行的结果。值得注意的是,用 STARTING NEW TASK 形式的 FM 的 processing type 必须要是 REMOTE-CAPABLE MODULE.
三, LOGICAL MEMORY
一个用户 session 可以有多个 external session ,可以理解你开了几个 SAP 的窗口,就有几个 external session ,一般设置为 6 个。
一个 external session 里可以有多个 internal session (最多 20 个,想想 LIST 的 LSIND 为什么不能超过 20 )。一个程序一般来说是在一个 internal session 里处理的。
可以用 ABAP MEMORY(EXPORT/IMPORT) 和 SAP MEMORY ( GET/SET )在不同的程序之间传递数据。
一个用户 session 有一个 SAP MEMORY ,这个用户 session 里所有 session 都可以访问 SAP MEMORY ,但是 SAP MEMORY 一般用于不同 external session 间的 internal session 传值。
每个 external session 包含一个 ABAP MEMORY ,属于这个 external session 的 internal session 都可以访问这个 ABAP MEMORY , ABAP MEMORY 适合在一个 external session 的不同 internal session 间传值。
当 external session 终止的时候,自动会释放其 ABAP MEMORY 。