SAP 高级应用开发 学习笔记 1 -- RFC NO.4

 异步RFC方式RFM调用:

 

CALL FUNCTION rfm_name STARTING NEW TASK taskname [DESTINATION dest] [EXPORTING p1 = a1 ... pn = an ... ] [TABLES t1 = itab1 ... tn = itabn ... ] [EXCEPTIONS exc1 = e1 ... [MESSAGE mess] ... excn = en ... [MESSAGE mess] ... [OTHERS = n_others]].

 

STARTING NEW TASK 指明异步调用模式,功能模块在新的工作过程中执行,也可以再后台模式处理异步RFC调用过程,在后台处理时,每个异步RFC调用也将占据一个对话工作过程

 REPORT Z_ARFC_USERGET. DATA: user_addr TYPE user_addr, system_id TYPE sysysid, user_para LIKE TABLE OF usr05 WITH HEADER LINE, msg_text(128). CALL FUNCTION 'ZRFC_USER_READ' STARTING NEW TASK 'B1' DESTINATION 'GS4CLNT100' EXPORTING user_name = 'JIAH' TABLES user_para = user_para EXCEPTIONS communication_failure = 1 MESSAGE msg_text system_failure = 2 MESSAGE msg_text. IF user_para IS INITIAL. WRITE: 'No output from aRFC.'. ELSE. LOOP AT user_para. WRITE:/ user_para-bname, user_para-parid, user_para-parva. ENDLOOP. ENDIF.

 

异步RFC调用过程只能使用TABLESEXPORTING(对应功能模块设定中的Import参数)、EXCEPTIONS参数。调用程序并不等待该模块的返回结果,因而不能指定IMPORTING 参数,即不能直接接收从被调用功能中的返回信息。调用的同时只能接收系统标准异常,对于功能模块中抛出的其他特点异常则不能直接接收

 

异步远程对话处理和调试

  1. 异步 RFC 调用过程也支持远程对话处理,在异步 RFC 调用时,系统总是打开新的工作进程,因而如果被调用功能模块包含对话程序(屏幕调用处理),则在该功能模块执行时,调用系统中将出现新的外部会话窗口,若调用功能时打开的会话数自己达到 6 个, 则试图打开新窗口时触发 system_failure.
  2. 异步 RFC 调用时,对 RFM 进行 step in 的调试过程,调用程序本身的调试会话不会进入 RFM 内部,系统也打开新的会话,单独增加一个窗口,进行目标系统中 RFM 的调试,将断点放在 RFM CALL FUNCTION 语句处,在异步 RFC 模式下进行调试

异步RFC调用时接收结果

通过语句中的附加项PERFORMING return_form on end of task 实现

CALL FUNCTION rfm_name STARTING NEW TASK taskname PERFORMING return_form ON END OF TASK ... FORM return_form USING taskname. RECEIVE RESULTS FROM FUNCTION rfm_name ENDFORM.

子程序必须存在于调用程序中,如果回调子程序中包含任何使当前程序执行中断的语句,call screensubmitcommit workwaitRFC调用及W或I类型的消息等,则不能成功返回结果。

REPORT Z_ARFC_GETRESULT_RETURN. DATA: user_addr TYPE user_addr, system_id TYPE sysysid, user_para LIKE TABLE OF usr05 WITH HEADER LINE, msg_text(128). CALL FUNCTION 'ZRFC_USER_READ' DESTINATION 'GS4CLNT100' STARTING NEW TASK 'B1' PERFORMING return_user ON END OF TASK EXPORTING user_name = 'JIAH' 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. IF user_para IS INITIAL. WRITE:/ 'Destination not ready yet.'. ELSE. WRITE:/ 'Destination is reached.'. ENDIF. AT USER-COMMAND. * Return from FORM routine RETURN_USER via SET USER-COMMAND IF sy-ucomm = 'OKCD'. IF msg_text = space. WRITE: / 'Destination system', system_id. LOOP AT user_para. WRITE:/ user_para-bname, user_para-parid, user_para-parva. ENDLOOP. ELSE. WRITE msg_text. ENDIF. ENDIF. *&---------------------------------------------------------------------* *& Form RETURN_USER *&---------------------------------------------------------------------* FORM return_user USING taskname. RECEIVE RESULTS FROM FUNCTION 'ZRFC_USER_READ' IMPORTING user_addr = user_addr system_id = system_id TABLES user_para = user_para EXCEPTIONS communication_failure = 1 MESSAGE msg_text system_failure = 2 MESSAGE msg_text. SET USER-COMMAND 'OKCD'. ENDFORM. "return_info

Receive results from functionRFM中接收结果.

程序在运行时的行为如下:主程序运行期间,RFM在其他工作过程中运行,因此系统变量sy-subrc和程序变量不会被更新,主程序将文本发送至输出列表的缓冲区中。

语句WAIT UNTILL用于异步RFC调用中等待结果的返回,该项必须与performing附加项配合使用,否则没有意义:

WAIT UNTIL log_exp [UP TO sec SECONDS].

当满足log_exp条件后,程序继续执行,否则程序将挂起,并等待异步RFC调用的返回结果,当功能模块调用结束时,系统将自动执行回调子程序,在其中接收返回结果并设定相关的逻辑条件变量值,子程序结束后将回到wait untill语句,在多个异步RFC调用存在的情况下,等待过程将反复重复,直到等待条件被满足,或不再有其他开发的异步RFC调用

WAIT UNTILL NOT FLAG1 IS INITIAL AND NOT FLAG2 IS INITIAL.

保持远程上下文:

receive语句中,通过keeping task附加项可以使已经加载的远程上下文保持至调用程序结束,直到远程连接终止为止。

FORM return_form USING taskname. ... RECEIVE RESULTS FROM FUNCTION rfm_name KEEPING TASK. ENDFORM.

RFM中的交互对话处理都将保持至调用程序结束。

通过performing接收结果的异步RFC调用不能进行内存滚动区的切换或进入内部模式,因为将导致异步返回结果无法传递给调用程序,可以通过submitcall transaction语句进行内存滚动区的切换

你可能感兴趣的:(function,report,user,System,SAP,远程连接)