aRFC并行处理中是否可通过TABLES参数修改主程序ITAB值?
问题根本原因
aRFC并行执行时,每个任务都会启动独立的用户会话,你调用aRFC时传入的内表是值拷贝,并非主程序内表的引用。每个FM里修改的只是当前会话里的内表副本,如果你没有主动接收任务返回的结果,这些修改自然不会同步到主程序的原内表中,你之前的写法是不支持直接修改主程序内表的。
解决方案
按以下步骤调整代码即可正常获取并行任务的返回结果:
步骤1:确认aRFC函数接口配置
检查函数Z_PP_PARA_TEST的接口属性,确保zpara_target和ztpp6040_change两个TABLES参数的「passed by value」选项没有勾选(默认不勾选即可支持返回)。
步骤2:修改返回接收子程序,主动接收返回结果
你当前的RECEIVE RESULTS FROM FUNCTION语句没有指定接收参数,是无法获取FM处理后的内表数据的,调整代码如下:
FORM return_z_pp_para_test USING taskname. DATA: lt_task_6040 TYPE STANDARD TABLE OF zspp6040_para, ls_task_6040 TYPE zspp6040_para. " 主动接收aRFC返回的内表数据到临时内表 RECEIVE RESULTS FROM FUNCTION 'Z_PP_PARA_TEST' TABLES ztpp6040_change = lt_task_6040. " 将当前任务的处理结果合并到主程序的总表中 LOOP AT lt_task_6040 INTO ls_task_6040. MODIFY gt_6040_para FROM ls_task_6040 TRANSPORTING msgty msgtx WHERE matnr = ls_task_6040-matnr AND seqno = ls_task_6040-seqno. IF sy-subrc <> 0. APPEND ls_task_6040 TO gt_6040_para. ENDIF. ENDLOOP. SUBTRACT 1 FROM g_progs. ADD 1 TO g_eprog. ENDFORM.
优化建议(可选)
- 现在你每次调用aRFC都传入了全量的
gt_para_test,建议拆分后只传入当前任务需要处理的对应物料的行,减少数据传输开销,提升并行效率。 - 可以在RECEIVE语句中增加异常捕获,避免个别任务执行异常导致整个主程序dump。
内容的提问来源于stack exchange,提问作者Park Chan Seul
相关产品推荐
相关产品推荐

