异步调用RFC 并等待返回结果
2019-06-05 17:23:20
RFC回调技术:
1.新开线程,执行RFC函数,
CALL FUNCTION 'ZMMFM0154' STARTING NEW TASK pv_ub
2.等待执行结果,再执行后续的代码
PERFORMING return_itreturn1 ON END OF TASK
WAIT UNTIL gs_return IS NOT INITIAL UP TO 10 SECONDS.
**异步调用RFC 并等待返回结果 DATA: pv_ub LIKE zmmt0033-zdjh03. DATA: gs_return TYPE zmms0021, ls_return TYPE zmms0021. DATA: lt_item LIKE TABLE OF zmms0112, ls_item LIKE zmms0112. CALL FUNCTION 'ZMMFM0154' STARTING NEW TASK pv_ub PERFORMING return_itreturn1 ON END OF TASK TABLES it_item = lt_item. WAIT UNTIL gs_return IS NOT INITIAL UP TO 10 SECONDS. IF gs_return IS NOT INITIAL. MOVE-CORRESPONDING gs_return TO ls_return. CLEAR:gs_return. ELSE. ls_return-type = 'E'. ls_return-message = '交货单创建结果未返回,请重新处理执行!'. ENDIF. *&---------------------------------------------------------------------* *& Form RETURN_ITRETURN1 *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> IT_ITEM *& --> = *& --> LT_ITEM *&---------------------------------------------------------------------* FORM return_itreturn1 USING taskname. CLEAR:gs_return. RECEIVE RESULTS FROM FUNCTION 'ZMMFM0154' IMPORTING o_return = gs_return. ENDFORM.
异步RFC调用
参数限制
异步RFC调用过程只能使用 TABLES、EXPORTING(对应功能模块设定中的Import参数)和EXCEPIONS参数。调用程序并不等待该模块返回结果,因而不能指定IMPORTING参数(其返回结果需要在回调子程序中进行处理)。而且,调用的同时只能接收系统标准异常COMMUNICATION_FAILURE和SYSTEM_FAILURE,对于功能模块中抛出的其他特定异常则不能直接接收,也需要在回调子程序中处理。
接收返回结果
如果需要在异步RFC模式下接收远程模块的返回结果或者特定异常,可以通过调用语句中的附加项
PERFORMING refurn_form ON END OF TASK 实现:
CALL FUNCTION rfm_name STARTING NEW TASK taskname PERFORMING return_form ON END OF TASK
其中指定的子程序必须存在于调用程序中,并包含RECEIVE语句:
FORM return_form USING taskname. ... RECEIVE RESULTS FROM FUNCTION rfm_name ... ENDFORM.
当被调用RFM功能模块执行结束后,系统将自动执行回调子程序return_form, return_form子程序
必须包含任意的名称、类型的形式参数,以接收对应异步RFC调用的任务名称。
注:回调子程序return_form中不能包含任何使当前程序执行中断的语句,例如:CALL SCREEN、SUBMIT、COMMIT WORK、WAIT、RFC调用及W或I类型的消息等,否则是不能成功将结果输出到屏幕上,此外,子程序中的WRITE语句也将失效。
例子:
DATA: msg_text(128). DATA: gt_protocol TYPE btcxpm OCCURS 0 WITH HEADER LINE. CALL FUNCTION 'SXPG_COMMAND_EXECUTE' * DESTINATION 'SAPECC6_ECC_00' STARTING NEW TASK 'B1' PERFORMING return_frm ON END OF TASK EXPORTING commandname = 'ZDIR' additional_parameters = 'd:\ /w' EXCEPTIONS communication_failure = 1 MESSAGE msg_text system_failure = 2 MESSAGE msg_text. IF sy-subrc = 0. WRITE: 'Wait for reply.'. ELSE. WRITE msg_text. ENDIF. AT USER-COMMAND. IF sy-ucomm = 'OK'."此处的FunctionCode为 return_frm 函数所触发 IF msg_text = space. LOOP AT gt_protocol. WRITE: / gt_protocol-message. ENDLOOP. ELSE. WRITE : '--' , msg_text. ENDIF. ENDIF. FORM return_frm USING taskname. RECEIVE RESULTS FROM FUNCTION 'SXPG_COMMAND_EXECUTE' TABLES exec_protocol = gt_protocol EXCEPTIONS communication_failure = 1 message msg_text system_failure = 2 message msg_text. " WAIT UP TO 1 SECONDS."在接收Form中不能出现中断语句,否则抛异常 SET USER-COMMAND 'OK'."接收到异步返回结果后,自动触发一个列表事件,如果有输出,将会显示下一级别的List屏幕 ENDFORM.
要想将结果输出到屏幕上,这里一定要在 AT USER-COMMAND事件中输出
等待多个异步调用的返回结果
语句WAIT UNTIL用于异步RFC调用中等待结果的返回,该项必须与PERFORMING附加项配合使用,否则没有意义,也无任何效果:
WAIT UNTIL log_exp [UP TO sec SECONDS].
注:WAIT UP TO 1 SECONDS.不需要与PERFORMING选项配合使用,也就是说可以使用在普通的ABAP程序中,用来暂停当前会话线程
该语句执行时,log_exp中的条件将被检查(或者到达指定的等待时间sec),仅当条件满足时,主调程序继续执行;否则程序将挂起,并等待异步RFC调用的返回结果。
使用WAIT UNTIL语句等待多个RFM返回结果的异步RFC调用示例代码段可参考这里

浙公网安备 33010602011771号