是否可以在使用 TABLES 参数的 RFC 并行处理期间更改 ITAB?
Is it possible to change ITAB during aRFC parallel processing using TABLES parameter?
我目前正在为大规模 GI 作业设计并行处理(通过使用 aRFC)。
问题是 - 我怎样才能得到每个工作结果的 return?
我使用了在主报告 (gt_result) 中声明的 TABLES 参数,并且当 aRFC 完成时,每个 FM 在函数内部执行 MODIFY itab。
问题是 - 在每个作业中,我检查了数据是否已更改(在 gt_result 中),但是当作业完成并且 return 到主报告程序时,ITAB 没有更改!
是否可以使用RFC 并行处理更改ITAB 值?还是从每项工作中获得结果的其他方式?
如有任何帮助,我们将不胜感激。谢谢!
编辑:这是一个代码片段
主要报告:
DATA: g_task(20) TYPE n VALUE '100', "Task name administration
g_progs TYPE i, "Number of task in progress
g_sprog TYPE i, "Number of task started
g_eprog TYPE i, "Number of task finished
pa_wpnum TYPE int4 VALUE 5,
jobs TYPE int4 VALUE 100. "Number of task to be proceeded
TYPES : BEGIN OF gs_target,
matnr TYPE matnr_d,
cnt TYPE i,
END OF gs_target.
DATA : gt_target TYPE STANDARD TABLE OF gs_target,
wa_target TYPE gs_target.
DATA : gt_6040_para TYPE STANDARD TABLE OF zspp6040_para,
wa_6040_para TYPE zspp6040_para.
DATA : lv_cnt_seqno TYPE i,
lv_flag TYPE c.
DATA : gt_para_test TYPE STANDARD TABLE OF zpara_test,
wa_para_test TYPE zpara_test.
DATA : gv_fs_name(10) TYPE c.
** Test Data Append **
wa_target-matnr = 'A'.
wa_target-cnt = 300.
APPEND wa_target TO gt_target.
wa_target-matnr = 'B'.
wa_target-cnt = 657.
APPEND wa_target TO gt_target.
wa_target-matnr = 'C'.
wa_target-cnt = 1231.
APPEND wa_target TO gt_target.
wa_target-matnr = 'D'.
wa_target-cnt = 831.
APPEND wa_target TO gt_target.
wa_target-matnr = 'E'.
wa_target-cnt = 918.
APPEND wa_target TO gt_target.
** Test Data Append END **
** Split target into 1:300 ratio - for later use?
LOOP AT gt_target INTO wa_target.
DO.
lv_cnt_seqno = 1.
wa_target-cnt = wa_target-cnt - 300.
wa_6040_para-matnr = wa_target-matnr.
wa_6040_para-seqno = lv_cnt_seqno.
APPEND wa_6040_para TO gt_6040_para.
IF wa_target-cnt > 0.
lv_cnt_seqno = lv_cnt_seqno + 1.
ELSEIF wa_target-cnt <= 0.
CLEAR lv_cnt_seqno.
lv_flag = 'X'.
ENDIF.
IF lv_flag = 'X'.
CLEAR : lv_flag.
EXIT.
ENDIF.
ENDDO.
CLEAR : wa_6040_para.
ENDLOOP.
CLEAR : lv_flag.
** End Spliting Part **
** Making 'Data' Part - In real use, it should be the 'item' part of looping BAPI,
** Which are used for making GI document, containing 300 items.
LOOP AT gt_target INTO wa_target.
lv_cnt_seqno = 1.
DO.
wa_para_test-seqno = lv_cnt_seqno.
wa_para_test-matnr = wa_target-matnr.
APPEND wa_para_test TO gt_para_test.
lv_cnt_seqno = lv_cnt_seqno + 1.
IF lv_cnt_seqno = wa_target-cnt.
wa_para_test-seqno = lv_cnt_seqno.
wa_para_test-matnr = wa_target-matnr.
APPEND wa_para_test TO gt_para_test.
lv_flag = 'X'.
ENDIF.
IF lv_flag = 'X'.
CLEAR : lv_flag.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
** End of 'Data Making' Part.
** aRFC part, sending job for 'Matnr', looping 300 items AND changing gt_6040_para, which are used for checking Success, or Error.
LOOP AT gt_target INTO wa_target.
WAIT UNTIL g_progs LE pa_wpnum.
ADD 1 TO g_progs.
CALL FUNCTION 'Z_PP_PARA_TEST'
STARTING NEW TASK g_task DESTINATION IN GROUP DEFAULT
PERFORMING return_z_pp_para_test ON END OF TASK
EXPORTING
lv_matnr = wa_target-matnr
TABLES
zpara_target = gt_para_test
ztpp6040_change = gt_6040_para.
ADD 1 TO g_task.
ADD 1 TO g_sprog.
ENDLOOP.
** End of aRFC part.
WAIT UNTIL g_sprog <= g_eprog.
LOOP AT gt_6040_para INTO wa_6040_para.
WRITE : wa_6040_para-matnr, wa_6040_para-seqno, wa_6040_para-msgtx, wa_6040_para-msgty.
ENDLOOP.
aRFC 函数部分:
FUNCTION z_pp_para_test.
DATA : lv_cnt TYPE int4.
DATA : lv_concat_data(10) TYPE c.
DATA : lv_index TYPE int4.
LOOP AT zpara_target WHERE matnr = lv_matnr.
lv_cnt = lv_cnt + 1.
zpara_target-msgtx = sy-tabix.
MODIFY zpara_target.
IF lv_cnt = 300.
lv_index = lv_index + 1.
READ TABLE ZTPP6040_CHANGE WITH KEY matnr = zpara_target-matnr
seqno = lv_index.
IF sy-subrc = 0.
ZTPP6040_CHANGE-msgty = 'S'.
ZTPP6040_CHANGE-msgtx = lv_index.
MODIFY ZTPP6040_CHANGE index sy-index.
ENDIF.
lv_cnt = 0.
ENDIF.
ENDLOOP.
ENDFUNCTION.
返回零件
FORM return_z_pp_para_test USING taskname.
RECEIVE RESULTS FROM FUNCTION 'Z_PP_PARA_TEST'.
SUBTRACT 1 FROM g_progs.
ADD 1 TO g_eprog.
ENDFORM.
ZSPP6040_PARA结构
MATNR MATNR_D
SEQNO INT4
MSGTX BAPI_MTYPE
MSGTY BAPI_MSG
ZPARA_TEST结构
MATNR MATNR_D
SEQNO INT4
MSGTX BAPI_MTYPE
The RECEIVE RESULTS FROM FUNCTION
instruction 要求您说明您希望接收哪些参数以及希望将结果存储在何处。不幸的是,所有参数都是可选的,那些你没有明确提及的参数只会被丢弃。所以用 no 参数调用它(就像你在这里做的那样)是没有意义的,但仍然合法。
您可能将传递给 aRFC 调用的 table 声明为全局变量(不要那样做!),然后在您的 FORM return_z_pp_para_test
中再次访问该全局变量 table 尚未更改。
为了接收函数调用的实际结果,请执行以下操作:
DATA: lt_results_target TYPE STANDARD TABLE OF gs_target,
lt_results_6040 TYPE STANDARD TABLE OF zspp6040_para.
RECEIVE RESULTS FROM FUNCTION 'Z_PP_PARA_TEST'
TABLES
zpara_target = lt_results_target
ztpp6040_change = lt_results_6040.
现在 local tables lt_results_target
和 lt_results_6040
应该包含数据被异步函数更改后的副本-call.
我目前正在为大规模 GI 作业设计并行处理(通过使用 aRFC)。
问题是 - 我怎样才能得到每个工作结果的 return?
我使用了在主报告 (gt_result) 中声明的 TABLES 参数,并且当 aRFC 完成时,每个 FM 在函数内部执行 MODIFY itab。
问题是 - 在每个作业中,我检查了数据是否已更改(在 gt_result 中),但是当作业完成并且 return 到主报告程序时,ITAB 没有更改!
是否可以使用RFC 并行处理更改ITAB 值?还是从每项工作中获得结果的其他方式?
如有任何帮助,我们将不胜感激。谢谢!
编辑:这是一个代码片段
主要报告:
DATA: g_task(20) TYPE n VALUE '100', "Task name administration
g_progs TYPE i, "Number of task in progress
g_sprog TYPE i, "Number of task started
g_eprog TYPE i, "Number of task finished
pa_wpnum TYPE int4 VALUE 5,
jobs TYPE int4 VALUE 100. "Number of task to be proceeded
TYPES : BEGIN OF gs_target,
matnr TYPE matnr_d,
cnt TYPE i,
END OF gs_target.
DATA : gt_target TYPE STANDARD TABLE OF gs_target,
wa_target TYPE gs_target.
DATA : gt_6040_para TYPE STANDARD TABLE OF zspp6040_para,
wa_6040_para TYPE zspp6040_para.
DATA : lv_cnt_seqno TYPE i,
lv_flag TYPE c.
DATA : gt_para_test TYPE STANDARD TABLE OF zpara_test,
wa_para_test TYPE zpara_test.
DATA : gv_fs_name(10) TYPE c.
** Test Data Append **
wa_target-matnr = 'A'.
wa_target-cnt = 300.
APPEND wa_target TO gt_target.
wa_target-matnr = 'B'.
wa_target-cnt = 657.
APPEND wa_target TO gt_target.
wa_target-matnr = 'C'.
wa_target-cnt = 1231.
APPEND wa_target TO gt_target.
wa_target-matnr = 'D'.
wa_target-cnt = 831.
APPEND wa_target TO gt_target.
wa_target-matnr = 'E'.
wa_target-cnt = 918.
APPEND wa_target TO gt_target.
** Test Data Append END **
** Split target into 1:300 ratio - for later use?
LOOP AT gt_target INTO wa_target.
DO.
lv_cnt_seqno = 1.
wa_target-cnt = wa_target-cnt - 300.
wa_6040_para-matnr = wa_target-matnr.
wa_6040_para-seqno = lv_cnt_seqno.
APPEND wa_6040_para TO gt_6040_para.
IF wa_target-cnt > 0.
lv_cnt_seqno = lv_cnt_seqno + 1.
ELSEIF wa_target-cnt <= 0.
CLEAR lv_cnt_seqno.
lv_flag = 'X'.
ENDIF.
IF lv_flag = 'X'.
CLEAR : lv_flag.
EXIT.
ENDIF.
ENDDO.
CLEAR : wa_6040_para.
ENDLOOP.
CLEAR : lv_flag.
** End Spliting Part **
** Making 'Data' Part - In real use, it should be the 'item' part of looping BAPI,
** Which are used for making GI document, containing 300 items.
LOOP AT gt_target INTO wa_target.
lv_cnt_seqno = 1.
DO.
wa_para_test-seqno = lv_cnt_seqno.
wa_para_test-matnr = wa_target-matnr.
APPEND wa_para_test TO gt_para_test.
lv_cnt_seqno = lv_cnt_seqno + 1.
IF lv_cnt_seqno = wa_target-cnt.
wa_para_test-seqno = lv_cnt_seqno.
wa_para_test-matnr = wa_target-matnr.
APPEND wa_para_test TO gt_para_test.
lv_flag = 'X'.
ENDIF.
IF lv_flag = 'X'.
CLEAR : lv_flag.
EXIT.
ENDIF.
ENDDO.
ENDLOOP.
** End of 'Data Making' Part.
** aRFC part, sending job for 'Matnr', looping 300 items AND changing gt_6040_para, which are used for checking Success, or Error.
LOOP AT gt_target INTO wa_target.
WAIT UNTIL g_progs LE pa_wpnum.
ADD 1 TO g_progs.
CALL FUNCTION 'Z_PP_PARA_TEST'
STARTING NEW TASK g_task DESTINATION IN GROUP DEFAULT
PERFORMING return_z_pp_para_test ON END OF TASK
EXPORTING
lv_matnr = wa_target-matnr
TABLES
zpara_target = gt_para_test
ztpp6040_change = gt_6040_para.
ADD 1 TO g_task.
ADD 1 TO g_sprog.
ENDLOOP.
** End of aRFC part.
WAIT UNTIL g_sprog <= g_eprog.
LOOP AT gt_6040_para INTO wa_6040_para.
WRITE : wa_6040_para-matnr, wa_6040_para-seqno, wa_6040_para-msgtx, wa_6040_para-msgty.
ENDLOOP.
aRFC 函数部分:
FUNCTION z_pp_para_test.
DATA : lv_cnt TYPE int4.
DATA : lv_concat_data(10) TYPE c.
DATA : lv_index TYPE int4.
LOOP AT zpara_target WHERE matnr = lv_matnr.
lv_cnt = lv_cnt + 1.
zpara_target-msgtx = sy-tabix.
MODIFY zpara_target.
IF lv_cnt = 300.
lv_index = lv_index + 1.
READ TABLE ZTPP6040_CHANGE WITH KEY matnr = zpara_target-matnr
seqno = lv_index.
IF sy-subrc = 0.
ZTPP6040_CHANGE-msgty = 'S'.
ZTPP6040_CHANGE-msgtx = lv_index.
MODIFY ZTPP6040_CHANGE index sy-index.
ENDIF.
lv_cnt = 0.
ENDIF.
ENDLOOP.
ENDFUNCTION.
返回零件
FORM return_z_pp_para_test USING taskname.
RECEIVE RESULTS FROM FUNCTION 'Z_PP_PARA_TEST'.
SUBTRACT 1 FROM g_progs.
ADD 1 TO g_eprog.
ENDFORM.
ZSPP6040_PARA结构
MATNR MATNR_D
SEQNO INT4
MSGTX BAPI_MTYPE
MSGTY BAPI_MSG
ZPARA_TEST结构
MATNR MATNR_D
SEQNO INT4
MSGTX BAPI_MTYPE
The RECEIVE RESULTS FROM FUNCTION
instruction 要求您说明您希望接收哪些参数以及希望将结果存储在何处。不幸的是,所有参数都是可选的,那些你没有明确提及的参数只会被丢弃。所以用 no 参数调用它(就像你在这里做的那样)是没有意义的,但仍然合法。
您可能将传递给 aRFC 调用的 table 声明为全局变量(不要那样做!),然后在您的 FORM return_z_pp_para_test
中再次访问该全局变量 table 尚未更改。
为了接收函数调用的实际结果,请执行以下操作:
DATA: lt_results_target TYPE STANDARD TABLE OF gs_target,
lt_results_6040 TYPE STANDARD TABLE OF zspp6040_para.
RECEIVE RESULTS FROM FUNCTION 'Z_PP_PARA_TEST'
TABLES
zpara_target = lt_results_target
ztpp6040_change = lt_results_6040.
现在 local tables lt_results_target
和 lt_results_6040
应该包含数据被异步函数更改后的副本-call.