同步调用

同步调用的实质:程序进行单线程执行。

中断执行

调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行。

  • CALL FUNCTION [function].
  • SUBMIT [program] AND RETURN.
  • CALL TRANSACTION [TCode].

CALL FUNCTION [function]

使用 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

使用 SUBMIT [program] AND RETURN 或者 CALL TRANSACTION [tcode] 的时候,实际是插入了一个新的 internal session,当被调用的程序执行完毕之后,新插入的 internal session 会被删除,继续执行调用程序。可以使用 LEAVE PROGRAM 语句来结束程序。

  • 如果省略 AND RETURN 选项,主调程序的所有数据与所有级别的 List 都会从 internal session 中删除。在被调程序执行完后,会返回到主调程序启动的地方。

  • 如果带 AND RETURN 选项,系统将会保持主调程序的所有数,并在被调程序执行完后返回到主调程序调用处(SUBMIT…AND RETURN 语句调用处),然后系统会继续执行主调程序 SUBMIT…AND RETURN 后面的语句。

CALL TRANSACTION、LEAVE TO TRANSACTION

1、 如果调用后不需要返回到主调程序,则可以使用下面这种方式:

  • LEAVE TO TRANSACTION |()[AND SKIP FIRST SCREEN].

该语句会结束当前主调程序去执行事务码,并且会将主调程序从 internal sessions 中删除,而被调用事物码将会在该 external session 中新开一个 internal session 再运行,并且被调程序执行后,并不会回到主调程序调用处继续往下执行,而是系统返回到区域菜单,从该菜单开始调用堆栈中的原始程序。

2、 如果调用后还要返回到主调程序,则使用下面这种方式:

  • SET PARAMETER ID ‘[Screen Parameter ID]’ FIELD [field_value].

  • CALL TRANSACTION |() [AND SKIP FIRST SCREEN] [USING <bdc_tab >].

系统会重新开启一个 internal session, 当被调程序结束后,被调事物码所在的这个 internal session 会被 delete 掉,然后返回到主调程序调用处,继续运行主调程序后面的语句 <bdc_tab> 用在 BDC 调用输入参数传递。

3、 退出程序:LEAVE PROGRAM.

退出整个程序,并删除所在内部会话、包括加载的程序、实例、数据。

顺序执行

  • 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 传值。

异步调用

异步调用函数,前提是该函数的 processing type 必须要是 REMOTE-CAPABLE MODULE 才能异步调用,常用函数不可进行异步调用。

  • 异步调用时不能有 IMPORTING 参数,函数的返回结果可在子程序中查看并处理
  • 只要有 STARTING NEW TASK 选项,即为异步调用
  • 如果是异步调用同一目标端的 RFC 函数,则可以省略 DESTINATION
CALL FUNCTION 'AAA' 
  STARTING NEW TASK <taskname>           "开启事务"
  DESTINATION IN GROUP <RFC Serve Group>
  PERFORMING <subroutine> ON END OF TASK "子程序"
  EXPORTING
  TABLES
 .....

DESTINATION 取值

  • NONE:当前程序所在应用服务器作为目标系统,但调用过程还是 RFC 远程方式来调用,与 SPACE 相同
  • SPACE:DESTINATION 选项将会被忽略,被调功能函数将作为普通函数在本机调用
  • BACK:用于被远程调用的 RFM 程序内部的 CALL FUNCTION 语句中的目标指定,通过已建立的 RFC 连接反过来调用该函数的主调者系统中的其他功能模块
    • 主调程序 —> 远程系统中的RFM —> 又回调主调程序所在系统中的其他函数

使用异步执行语句之后,FM:AAA 和调用它的程序会并行运行。可以在 subroutine 中使用 RECEIVE RESULTS FROM FUNCTION 'AAA' 语句来获得 FM:AAA 运行的结果。

FORM subroutine USING name.
  RECEIVE RESULTS FROM FUNCTION 'AAA'.
ENDFORM.

等待异步调用的返回结果:

  • WAIT UNTIL log_exp [UP TO sec SECONDS].

关联文档