是否可以在使用 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_targetlt_results_6040 应该包含数据被异步函数更改后的副本-call.