SAP 函数的异步调用

时间:2022-10-24 19:47:45

写在头部:异步调用函数,前提是该函数是RFC型函数,才能异步调用,常用函数不可进行异步调用!!!(很重要)

注意:

A.异步调用时不能有IMPORTING参数,函数的返回结果可在子程序中查看并处理;

B.只要有STARTING NEW TASK选项,即为异步调用;

C.如果是异步调用同一目标端的RFC函数,则可以省略DESTINATION

参考文档:http://blog.csdn.net/zhongguomao/article/details/8963815/

1.相关语法:

同步调用:CALL FUNCTION 'FUN ;

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

异步调用:CALL FUNCTION 'FUN' STARTING NEWTASK <taskname> "任务名称

DESTINATION IN GROUP <RFC Serve Group>

                        PERFORMING <subroutine>ON END OF TASK。"子程序

    异步调用的实质:程序进行多线程执行。

等待多个异步调用的返回结果:WAIT UNTIL log_exp[UP TO sec SECONDS].

2  DESTINATION 取值

l  目标NONE:当前程序所在应用服务器作为目标系统,但调用过程还是RFC远程方式来调用,这与SPACE是同的

l  目标SPACE DESTINATION选项将会被忽略,被调功能函数将作为普通函数在本机调用

l  目标BACK:用于被远程调用的RFM程序内部的CALL FUNCTION语句中的目标指定,通过已建立的RFC连接反过来调用该函数的

主调者系统中的其他功能模块(即主调程序—>远程系统中的RFM—>又回调主调程序所在系统中的其他函数)

案例:

我以项目上PM模块的物料溯源的函数为例

本案例由于查询的数据较多,使用了(5条)多线程的方式进行数据的溯源,使用方法如下

在普通调用函数的基础上加上异步,在子程序中查看函数获得的结果

*   异步调用函数     start--*
      CALL FUNCTION 'ZZ_MD_PEGGING_NODIALOG' STARTING NEW TASK G_TASKNAME
        DESTINATION IN GROUP G_CLASSNAME
        PERFORMING FRM_PEGGING_DONE ON END OF TASK "子程序
        EXPORTING
          EDELET = GS_EDELET
          EDELKZ = GS_EDELKZ
          EDELNR = GS_EDELNR
          EDELPS = GS_EDELPS
          EMATNR = GS_EMATNR
          EWERKS = GS_EWERKS.
      IF SY-SUBRC = 0.
        SND_JOBS = SND_JOBS + 1.
      ENDIF.
*   异步调用函数     End--*
      OPEN_TASK_NUM = OPEN_TASK_NUM + 1.   "记录启动的进程数量
**     获取并发进程返回的结果

      IF TAB < 5.
        WAIT UNTIL RCV_JOBS >= SND_JOBS.  "等待多个异步调用的返回结果
        CLEAR:OPEN_TASK_NUM,RCV_JOBS,SND_JOBS.
        FREE:LT_MD2.
      ELSE.


本项目中再溯源的时候发现了一个问题,就是调用溯源函数Function:MD_PEGGING_NODIALOG不是RFC模式的函数,

但又想优化该函数查询数据。

方法如下:自定义一个函数,导入导出以及表都参考标准函数的字段,属性设置为RFC模式,在源代码中调用标准函数,

最后在程序中调用自定义函数就可以了。