写在头部:异步调用函数,前提是该函数是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模式,在源代码中调用标准函数,
最后在程序中调用自定义函数就可以了。