此博客为原创博客,都是个人工作经历所得,转载请注明出处

异步调用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调用过程只能使用 TABLESEXPORTING(对应功能模块设定中的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.
View Code

要想将结果输出到屏幕上,这里一定要在 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调用示例代码段可参考这里

posted @ 2019-06-05 17:21  Rainystuday  阅读(582)  评论(0)    收藏  举报