SAP_ABAP程序優化-多線程並行處理 ( 一 )

實際項目實施過程中,我們會遇到程序性能優化的問題,這裏介紹一種方法:通過RFC接口進行遠程函數的異步調用實現程序的並行處理。

同步/異步調用函數語法

同步調用:CALL FUNCTION ‘AAA’ ;

同步調用的實質:程序進行單線程執行。

異步調用:CALL FUNCTION ‘AAA’ STARTING NEWTASK "任務名稱

DESTINATION IN GROUP

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

異步調用的實質:程序進行多線程執行。

一些關於函數異步調用實現程序並行處理的文章,沒有介紹如下問題:

⒈ 爲了避免相同程序重複運行產生的後臺任務相互衝突,需要保證在相同時間段同一程序只被一個用戶佔用;

⒉ 異步調用獲取的最終結果數據與同步調用獲取的結果存在差異;

⒊ 固定RFC Server Group如system = ‘parallel_generators’,無法保證程序在不同服務器中通用性。

問題1分析:從MD01中運行MRP我們可以知道,系統爲了避免相同程序併發執行,導致後臺任務衝突, MD01在並行模式下是不允許被兩個用戶同時執行的。如下圖

在這裏插入圖片描述

解決方法:通過在程序中利用鎖對象來達到程序相同時間段只被同一用戶佔用的目的。

問題2分析:在LOOP循環中採用異步調用函數的模式,通過SY-SUBRC = 0來判斷任務啓動成功,當SY-SUBRC <> 0時,則獲取先前啓動的進程返回的值,但是這樣就遇到一個問題:如第N次循環正好分配給程序的進程被佔用完,這樣本次無法啓動一個任務進程,導致本次的原始數據通過函數無法獲取目標,從而最終結果出現數據不完整和數值不斷變化的現象。

解決方法:犧牲部分性能保證數據的完整。通過RZ12獲取服務器的Max. requests in queue 的值,LOOP循環的時候統計啓動的啓動的進程數是否 = Max. requests inqueue,如果等於則獲取先前啓動的進程返回的值,然後再重新啓動進程,重複此操作。系統分配給每個程序的最大進程數> Max. requests in queue,但是把啓動的進程數限制在Max.requests in queue的水平可以保證獲取結果的完整性。如下圖所示

在這裏插入圖片描述

問題3分析:一般系統直接指定 =’ parallel_generators ',如上圖的“服務器組”對應的內容,爲了保持一般性通過如下邏輯段獲取

CALL ‘C_SAPGPARAM’ "#EC CI_CCALL ID ‘NAME’ FIELD ‘rdisp/myname’
ID ‘VALUE’ FIELD g_applserver. "
SELECT SINGLE classname
FROM rzllitab
INTO g_classname "Server Group Name
WHERE applserver = g_applserver
AND grouptype = ‘S’. "S:服務器組,空:登陸組

下面通過例子來說明函數異步調用,這裏使用函數

'MD_STOCK_REQUIREMENTS_LIST_API’獲取MD04中的物料+工廠 MRP數據明細。首先我們使用同步調用的方法,然後再使用異步調用的方法,比較二者在同等條件下的執行效率。

(假設需求:從物料工廠表MARC中獲取一定的行項目,這裏設定爲18000條,然後通過調用函數獲取物料工廠對應的MRP清單,將物料工廠與獲取的對應清單整合輸出)
同步調用:(完整程序在程序最後)

select matnr werks

UP TO 18000 ROWS               "數據條目18000
INTO CORRESPONDING FIELDS OF TABLE it_marc
FROM marc
WHERE matnr IN s_matnr
AND   werks IN s_werks.

LOOP AT it_marc INTO wa_marc.
CLEAR it_md.
CALL FUNCTION ‘MD_STOCK_REQUIREMENTS_LIST_API’
EXPORTING
MATNR = wa_marc-matnr
WERKS = wa_marc-werks
TABLES
MDEZX = it_md
EXCEPTIONS
MATERIAL_PLANT_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
OTHERS = 3.

LOOP AT it_md INTO wa_md.
  MOVE-CORRESPONDING wa_md TO wa_output.
  wa_output-matnr = wa_marc-matnr.
  wa_output-werks = wa_marc-werks.
  APPEND wa_output TO it_output.
  CLEAR:wa_output,wa_md.
ENDLOOP.
CLEAR wa_marc.

ENDLOOP.
很顯然在同步執行情況下,只有一個進程是執行我們調用的函數,其他的進程處於idle狀態。

異步調用:

解決問題1:爲了達到當前用戶可以獨佔程序,進入選擇界面即鎖定程序:

AT SELECTION-SCREEN.
"鎖定程序
CALL FUNCTION ‘ENQUEUE_EZZSOPR0032’
EXPORTING
mode_trdir = ‘E’ "鎖類型
name = ‘ZSOPR0032’ "鎖對象名稱
x_name = ’ ’
_scope = ‘2’
_wait = ’ ’
_collect = ’ ’
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ‘對象已被鎖定,請稍後執行’ TYPE ‘E’.
ENDIF.
解決問題1:當程序異步調用函數的操作結束後,即可接觸對程序的鎖定:

END OF SELECTION.
"解除程序的鎖定
CALL FUNCTION ‘DEQUEUE_EZZSOPR0032’
EXPORTING
mode_trdir = ‘E’
name = ‘ZSOPR0032’
x_name = ’ ’
_scope = ‘3’
_synchron = ’ ’
_collect = ’ '.

解決問題3:獲取RFC Serve Group name

  • 獲取 RFC Serve Group name Start–*

  • 一般系統默認g_classname = ‘parallel_generators’,但爲了通用性按照如下方法獲取
    CALL ‘C_SAPGPARAM’ "#EC CI_CCALL
    ID ‘NAME’ FIELD ‘rdisp/myname’
    ID ‘VALUE’ FIELD g_applserver.

    SELECT SINGLE classname
    FROM rzllitab
    INTO g_classname "Server Group Name
    WHERE applserver = g_applserver
    AND grouptype = ‘S’. "S:服務器組,空:登陸組

  • 獲取 RFC Serve Group name End–*

解決問題2:通過 最大請求隊列的值 來控制啓動進程數

SELECT matnr werks

UP TO 18000 ROWS               "數據條目18000
INTO CORRESPONDING FIELDS OF TABLE it_marc
FROM marc
WHERE matnr IN s_matnr

AND werks IN s_werks.

LOOP AT it_marc INTO wa_marc.

  • 生成任務名稱 = ‘Task’ + sy-tabix Start–*

    WRITE sy-tabix TO g_taskname.

    CONDENSE g_taskname.

    CONCATENATE ‘Task’ g_taskname INTO g_taskname.

  • 生成任務名稱 = ‘Task’ + sy-tabix End–*

    lw_marc-taskname = g_taskname.

    lw_marc-matnr = wa_marc-matnr.

    lw_marc-werks = wa_marc-werks.

    APPEND wa_marc TO lt_marc.

  • 異步調用函數 Start–*

    CALL FUNCTION ‘MD_STOCK_REQUIREMENTS_LIST_API’ STARTINGNEW TASK g_taskname

    DESTINATION INGROUPg_classname
    
    PERFORMING frm_subroutine_done ONEND OF TASK"子程序
    
  •  只要將函數的EXPORTING參數放在此處,其他參數放到子程序中
    
      EXPORTING
    
        matnr                 = wa_marc-matnr
    
        werks                 = wa_marc-werks
    
  •   系統標準報錯信息
    
      EXCEPTIONS
    
        communication_failure = 1  MESSAGE mess
    
        system_failure        = 2 MESSAGE mess
    
        resource_failure      = 3.
    
      IF sy-subrc = 0.
    
        snd_jobs = snd_jobs + 1.
    
      ENDIF.
    
  • 異步調用函數 End–*

    open_task_num = open_task_num + 1. "記錄啓動的進程數量

    IF open_task_num = p_wp. "p_wp = RZ12中的 Max. requests in queue

  • 獲取併發進程返回的結果

    WAIT UNTIL rcv_jobs >= snd_jobs.

    CLEAR:open_task_num,rcv_jobs,snd_jobs.

    FREE:lt_marc.

ENDIF.

CLEAR wa_marc.

ENDLOOP.

&---------------------------------------------------------------------

*& Form FRM_SUBROUTINE_DONE

&---------------------------------------------------------------------

FORM frm_subroutine_done USING g_taskname.

rcv_jobs = rcv_jobs + 1. "Receiving data

CLEAR:it_md[].

RECEIVE RESULTS FROMFUNCTION ‘MD_STOCK_REQUIREMENTS_LIST_API’

 TABLES

   mdezx                    = it_md

 EXCEPTIONS

   material_plant_not_found = 1

   plant_not_found          = 2

   OTHERS                   = 3.

functioncall1 = done.

SORT lt_marc BY taskname.

LOOP AT it_md INTO wa_md.

READ TABLE lt_marc INTO lw_marc WITH KEY taskname = g_taskname BINARYSEARCH.

MOVE-CORRESPONDING wa_md TO wa_output.

wa_output-matnr = lw_marc-matnr.

wa_output-werks = lw_marc-werks.

APPEND wa_output TO it_output.



CLEAR:wa_output,wa_md,lw_marc.

ENDLOOP.

ENDFORM. " FRM_SUBROUTINE_DONE

                                                                        同步調用運行時間

異步調用運行時間
在這裏插入圖片描述
在這裏插入圖片描述

SE30中截取的兩張運行時間圖,

同步用時429s = 83sABAP程序使用時間 + 346s數據訪問消耗時間;

異步用時75s = 74sABAP 程序使用時間 + <1s的數據庫訪問消耗時間。

本服務器Max.requests in queue = 5. 運行時間429 / 75 = 5.7,即提升了5倍多的執行效率。

同步調用完整程序:

福大

Description: 同步調用函數獲取MRP明細列表DEMO

&---------------------------------------------------------------------
*& 程序名稱:同步調用函數獲取MRP明細列表DEMO
*& 程 序 名:ZDEMO_MXQ_TB
*& 開發日期:2013-05-15
*& 創 建 者:漢得
*& 申 請 者:
&---------------------------------------------------------------------
*& 摘要說明
&--------
*& 從物料工廠表MARC中獲取一定的行項目,然後通過調用函數獲取物料工廠對應的
*& MRP清單,將物料工廠與獲取的對應清單整合輸出
&---------------------------------------------------------------------
*& 變更記錄
*& 日期 修改者 傳輸請求號 修改內容及原因
&--------------- ---------- -------------------- ------------------
*
&---------------------------------------------------------------------

REPORT ZDEMO_MXQ_TB.

----------------------------------------------------------------------

  •   Type-pools                                                     *
    

----------------------------------------------------------------------
TYPE-POOLS: slis.

----------------------------------------------------------------------

  •   Table                                                    *
    

----------------------------------------------------------------------
TABLES:marc.

----------------------------------------------------------------------

  •   Internal Tables and Work Areas
    

----------------------------------------------------------------------

DATA:BEGIN OF wa_marc,
matnr TYPE marc-matnr, "物料號
werks TYPE marc-werks, "工廠
END OF wa_marc.

DATA:it_marc LIKE TABLE OF wa_marc.

"函數調用參數
DATA:it_md TYPE STANDARD TABLE OF mdez,
wa_md LIKE LINE OF it_md.

DATA:BEGIN OF wa_output.
INCLUDE STRUCTURE mdez.
DATA:matnr TYPE marc-matnr. "物料號
DATA:werks TYPE marc-werks. "工廠
DATA:END OF wa_output.

DATA:it_output LIKE TABLE OF wa_output.

----------------------------------------------------------------------

  •   Variables
    

----------------------------------------------------------------------

----------------------------------------------------------------------

  •   ALV層級關係定義
    

----------------------------------------------------------------------
DATA: it_fieldcat TYPE slis_t_fieldcat_alv,
wa_layout TYPE slis_layout_alv.
DATA: wa_fieldcat TYPE slis_fieldcat_alv.
DATA gv_grid TYPE REF TO cl_gui_alv_grid.

DATA: git_events TYPE slis_t_event, "ALV 事件
git_listheader TYPE slis_t_listheader. "ALV 表頭

DATA wa_header TYPE slis_listheader.

&---------------------------------------------------------------------
*& Define marco
&---------------------------------------------------------------------
DEFINE macro_fill_fcat.

clear wa_fieldcat.

&1 = &1 + 1.
wa_fieldcat-col_pos = &1.
wa_fieldcat-fieldname = &2.
wa_fieldcat-seltext_l = &3.
wa_fieldcat-seltext_m = &3.
wa_fieldcat-seltext_s = &3.

append wa_fieldcat to it_fieldcat.

END-OF-DEFINITION.

----------------------------------------------------------------------

  •   SELECTION-SCREEN
    

----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
*PARAMETERS:p_wp TYPE c . "進程數
SELECT-OPTIONS:s_matnr FOR marc-matnr,
s_werks FOR marc-werks.

SELECTION-SCREEN END OF BLOCK blk1.

*initialialization
INITIALIZATION.

*at selection screen
AT SELECTION-SCREEN.

*start of selection
START-OF-SELECTION.

CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
EXPORTING
PERCENTAGE = 10
TEXT = ‘數據獲取中…’.

PERFORM frm_get_date.

*END OF SELECTION
END-OF-SELECTION.
PERFORM frm_init_fieldcat.
PERFORM frm_init_layout.
PERFORM frm_alv_output.

&---------------------------------------------------------------------
*& Form FRM_GET_DATE
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM FRM_GET_DATE .

SELECT matnr werks
UP TO 18000 ROWS "最多獲取20條數據
INTO CORRESPONDING FIELDS OF TABLE it_marc
FROM marc
WHERE matnr IN s_matnr
AND werks IN s_werks.

LOOP AT it_marc INTO wa_marc.

CLEAR it_md.
CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
  EXPORTING
    MATNR                    = wa_marc-matnr
    WERKS                    = wa_marc-werks
  TABLES
    MDEZX                    = it_md
  EXCEPTIONS
    MATERIAL_PLANT_NOT_FOUND = 1
    PLANT_NOT_FOUND          = 2
    OTHERS                   = 3.

LOOP AT it_md INTO wa_md.
  MOVE-CORRESPONDING wa_md TO wa_output.
  wa_output-matnr = wa_marc-matnr.
  wa_output-werks = wa_marc-werks.
  APPEND wa_output TO it_output.
  CLEAR:wa_output,wa_md.
ENDLOOP.

CLEAR wa_marc.

ENDLOOP.

ENDFORM. " FRM_GET_DATE

&---------------------------------------------------------------------
*& Form FRM_INIT_FIELDCAT
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_init_fieldcat.

DATA: l_colpos TYPE lvc_s_fcat-col_pos VALUE 0.

macro_fill_fcat l_colpos ‘MATNR’ ‘物料號’ .
macro_fill_fcat l_colpos ‘WERKS’ ‘工廠’ .
macro_fill_fcat l_colpos ‘DELKZ’ ‘MRP元素’ .
macro_fill_fcat l_colpos ‘MNG01’ ‘數量’ .
macro_fill_fcat l_colpos ‘DAT00’ ‘日期’ .

ENDFORM. " FRM_INIT_FIELDCAT

&---------------------------------------------------------------------
*& Form FRM_INIT_LAYOUT
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_init_layout .

wa_layout-zebra = ‘X’.
wa_layout-f2code = ‘&ETA’. "雙擊顯示詳細信息
wa_layout-detail_popup = ‘X’.
wa_layout-colwidth_optimize = ‘X’.

  • wa_layout-box_fieldname = ‘BOX’."將BOX字段作爲選擇標記列

ENDFORM. " FRM_INIT_LAYOUT
&---------------------------------------------------------------------
*& Form FRM_ALV_OUTPUT
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text

  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_alv_output .
    CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
    EXPORTING
    i_callback_program = sy-repid
    is_layout = wa_layout
    it_fieldcat = it_fieldcat
    i_save = ‘A’

  •  it_events                = git_events[]
    
  • i_callback_pf_status_set = 'PF_STATUS_SET'
    
  • i_callback_user_command  = 'USER_COMMAND'
    

    TABLES
    t_outtab = it_output
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.

    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    ENDFORM. " FRM_ALV_OUTPUT

*Selection texts
*----------------------------------------------------------

  • S_MATNR D .
  • S_WERKS D .
    Extracted by Direct Download Enterprise version 1.3.1 - E.G

異步調用完整程序:

Code listing for: ZDEMO_MXQ_YB
Description: 異步調用函數獲取MRP明細列表DEMO

&---------------------------------------------------------------------
*& 程序名稱:異步調用函數獲取MRP明細列表DEMO
*& 程 序 名:ZDEMO_MXQ_YB
*& 開發日期:2013-05-15
*& 創 建 者:漢得
*& 申 請 者:
&---------------------------------------------------------------------
*& 摘要說明
&--------
*& 從物料工廠表MARC中獲取一定的行項目,然後通過調用函數獲取物料工廠對應的
*& MRP清單,將物料工廠與獲取的對應清單整合輸出
&---------------------------------------------------------------------
*& 變更記錄
*& 日期 修改者 傳輸請求號 修改內容及原因
&--------------- ---------- -------------------- ------------------
*
&---------------------------------------------------------------------

REPORT zdemo_mxq_yb.

----------------------------------------------------------------------

  •   Type-pools                                                     *
    

----------------------------------------------------------------------
TYPE-POOLS: slis.

----------------------------------------------------------------------

  •   Table                                                    *
    

----------------------------------------------------------------------
TABLES:marc.

----------------------------------------------------------------------

  •   Internal Tables and Work Areas
    

----------------------------------------------------------------------

DATA:BEGIN OF wa_marc,
matnr TYPE marc-matnr, "物料號
werks TYPE marc-werks, "工廠
taskname(10) TYPE c, "任務名
END OF wa_marc.

DATA:it_marc LIKE TABLE OF wa_marc.

DATA:lt_marc LIKE TABLE OF wa_marc, "存放臨時數據
lw_marc LIKE wa_marc.

"函數調用參數
DATA:it_md TYPE STANDARD TABLE OF mdez,
wa_md LIKE LINE OF it_md.

DATA:BEGIN OF wa_output.
INCLUDE STRUCTURE mdez.
DATA:matnr TYPE marc-matnr. "物料號
DATA:werks TYPE marc-werks. "工廠
DATA:END OF wa_output.

DATA:it_output LIKE TABLE OF wa_output.

----------------------------------------------------------------------

  •   Variables
    

----------------------------------------------------------------------
DATA:g_taskname(10) TYPE c, "task name(同時運行的任務名稱必須保持唯一)
g_classname TYPE rzlli_apcl, "Server Group Name
g_applserver TYPE rzllitab-applserver,"RFC Serve Group
excp_flag(1) TYPE c. "Number of RESOURCE_FAILUREs

DATA:snd_jobs TYPE i,
rcv_jobs TYPE i,
functioncall1(1) TYPE c.

CONSTANTS: done(1) TYPE c VALUE ‘X’.

----------------------------------------------------------------------

  •   ALV層級關係定義
    

----------------------------------------------------------------------
DATA: it_fieldcat TYPE slis_t_fieldcat_alv,
wa_layout TYPE slis_layout_alv.
DATA: wa_fieldcat TYPE slis_fieldcat_alv.
DATA gv_grid TYPE REF TO cl_gui_alv_grid.

DATA: git_events TYPE slis_t_event, "ALV 事件
git_listheader TYPE slis_t_listheader. "ALV 表頭

DATA wa_header TYPE slis_listheader.

&---------------------------------------------------------------------
*& Define marco
&---------------------------------------------------------------------
DEFINE macro_fill_fcat.

clear wa_fieldcat.

&1 = &1 + 1.
wa_fieldcat-col_pos = &1.
wa_fieldcat-fieldname = &2.
wa_fieldcat-seltext_l = &3.
wa_fieldcat-seltext_m = &3.
wa_fieldcat-seltext_s = &3.

append wa_fieldcat to it_fieldcat.

END-OF-DEFINITION.

----------------------------------------------------------------------

  •   SELECTION-SCREEN
    

----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
*PARAMETERS:p_wp TYPE c . "進程數
SELECT-OPTIONS:s_matnr FOR marc-matnr,
s_werks FOR marc-werks.

PARAMETERS:p_wp TYPE c . "併發進程數(根據RZ12中的最大請求隊列數設置)

SELECTION-SCREEN END OF BLOCK blk1.

*initialialization
INITIALIZATION.
p_wp = 5.

*at selection screen
AT SELECTION-SCREEN.

"鎖定程序
CALL FUNCTION ‘ENQUEUE_EZZSOPR0032’
EXPORTING
mode_trdir = ‘E’
name = ‘ZSOPR0032’
x_name = ’ ’
_scope = ‘2’
_wait = ’ ’
_collect = ’ ’
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.

IF sy-subrc <> 0.

  • Implement suitable error handling here
    MESSAGE ‘對象已被鎖定,請稍後執行’ TYPE ‘E’.
    ELSE.
    "鎖定成功
    ENDIF.

*start of selection
START-OF-SELECTION.

CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
EXPORTING
percentage = 10
text = ‘數據獲取中…’.

PERFORM frm_get_date.

*END OF SELECTION
END-OF-SELECTION.

"解除程序的鎖定
CALL FUNCTION ‘DEQUEUE_EZZSOPR0032’
EXPORTING
mode_trdir = ‘E’
name = ‘ZSOPR0032’
x_name = ’ ’
_scope = ‘3’
_synchron = ’ ’
_collect = ’ '.

PERFORM frm_init_fieldcat.
PERFORM frm_init_layout.
PERFORM frm_alv_output.

&---------------------------------------------------------------------
*& Form FRM_GET_DATE
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_get_date .

DATA:mess(40) TYPE c. "併發執行出錯信息

DATA:open_task_num TYPE i. "啓動任務數量

SELECT matnr werks
UP TO 18000 ROWS ""數據條目18000
INTO CORRESPONDING FIELDS OF TABLE it_marc
FROM marc
WHERE matnr IN s_matnr
AND werks IN s_werks.

  • 獲取 RFC Serve Group name Start–*

  • 一般系統默認g_classname = ‘parallel_generators’,但爲了通用性按照如下方法獲取
    CALL ‘C_SAPGPARAM’ "#EC CI_CCALL
    ID ‘NAME’ FIELD ‘rdisp/myname’
    ID ‘VALUE’ FIELD g_applserver.

    SELECT SINGLE classname
    FROM rzllitab
    INTO g_classname "Server Group Name
    WHERE applserver = g_applserver
    AND grouptype = ‘S’. "S:服務器組,空:登陸組

  • 獲取 RFC Serve Group name End–*

CLEAR open_task_num.

LOOP AT it_marc INTO wa_marc.

  • 生成任務名稱 = ‘Task’ + sy-tabix Start–*
    WRITE sy-tabix TO g_taskname.
    CONDENSE g_taskname.
    CONCATENATE ‘Task’ g_taskname INTO g_taskname.

  • 生成任務名稱 = ‘Task’ + sy-tabix End–*

    lw_marc-taskname = g_taskname.
    lw_marc-matnr = wa_marc-matnr.
    lw_marc-werks = wa_marc-werks.
    APPEND wa_marc TO lt_marc.

  • 異步調用函數 Start–*
    CALL FUNCTION ‘MD_STOCK_REQUIREMENTS_LIST_API’ STARTING NEW TASK g_taskname
    DESTINATION IN GROUP g_classname
    PERFORMING frm_subroutine_done ON END OF TASK "子程序

  •  只要將函數的EXPORTING參數放在此處,其他參數放到子程序中
      EXPORTING
        matnr                 = wa_marc-matnr
        werks                 = wa_marc-werks
    
  •   系統標準報錯信息
      EXCEPTIONS
        communication_failure = 1  MESSAGE mess
        system_failure        = 2  MESSAGE mess
        resource_failure      = 3.
    
      IF sy-subrc = 0.
        snd_jobs = snd_jobs + 1.
      ENDIF.
    
  • 異步調用函數 End–*

    open_task_num = open_task_num + 1. "記錄啓動的進程數量

    IF open_task_num = p_wp. "p_wp = RZ12中的 Max. requests in queue

  • 獲取併發進程返回的結果
    WAIT UNTIL rcv_jobs >= snd_jobs.
    
    CLEAR:open_task_num,rcv_jobs,snd_jobs.
    FREE:lt_marc.
    

    ENDIF.

    CLEAR wa_marc.

    ENDLOOP.

ENDFORM. " FRM_GET_DATE

&---------------------------------------------------------------------
*& Form FRM_SUBROUTINE_DONE
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_subroutine_done USING g_taskname.

rcv_jobs = rcv_jobs + 1. ""Receiving data

CLEAR:it_md[].
RECEIVE RESULTS FROM FUNCTION ‘MD_STOCK_REQUIREMENTS_LIST_API’
TABLES
mdezx = it_md
EXCEPTIONS
material_plant_not_found = 1
plant_not_found = 2
OTHERS = 3.

functioncall1 = done.

SORT lt_marc BY taskname.

LOOP AT it_md INTO wa_md.
READ TABLE lt_marc INTO lw_marc WITH KEY taskname = g_taskname BINARY SEARCH.
MOVE-CORRESPONDING wa_md TO wa_output.
wa_output-matnr = lw_marc-matnr.
wa_output-werks = lw_marc-werks.
APPEND wa_output TO it_output.

CLEAR:wa_output,wa_md,lw_marc.

ENDLOOP.

ENDFORM. " FRM_SUBROUTINE_DONE

&---------------------------------------------------------------------
*& Form FRM_INIT_FIELDCAT
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_init_fieldcat.

DATA: l_colpos TYPE lvc_s_fcat-col_pos VALUE 0.

macro_fill_fcat l_colpos ‘MATNR’ ‘物料號’ .
macro_fill_fcat l_colpos ‘WERKS’ ‘工廠’ .
macro_fill_fcat l_colpos ‘DELKZ’ ‘MRP元素’ .
macro_fill_fcat l_colpos ‘MNG01’ ‘數量’ .
macro_fill_fcat l_colpos ‘DAT00’ ‘日期’ .

ENDFORM. " FRM_INIT_FIELDCAT

&---------------------------------------------------------------------
*& Form FRM_INIT_LAYOUT
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text
  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_init_layout .

wa_layout-zebra = ‘X’.
wa_layout-f2code = ‘&ETA’. "雙擊顯示詳細信息
wa_layout-detail_popup = ‘X’.
wa_layout-colwidth_optimize = ‘X’.

  • wa_layout-box_fieldname = ‘BOX’."將BOX字段作爲選擇標記列

ENDFORM. " FRM_INIT_LAYOUT
&---------------------------------------------------------------------
*& Form FRM_ALV_OUTPUT
&---------------------------------------------------------------------

  •   text
    

----------------------------------------------------------------------

  • –> p1 text

  • <-- p2 text
    ----------------------------------------------------------------------
    FORM frm_alv_output .
    CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
    EXPORTING
    i_callback_program = sy-repid
    is_layout = wa_layout
    it_fieldcat = it_fieldcat
    i_save = ‘A’

  • it_events                = git_events[]
    
  • i_callback_pf_status_set = 'PF_STATUS_SET'
    
  • i_callback_user_command  = 'USER_COMMAND'
    

    TABLES
    t_outtab = it_output
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.

    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    ENDFORM. " FRM_ALV_OUTPUT
    在這裏插入圖片描述
    在這裏插入圖片描述
    *Selection texts
    *----------------------------------------------------------

  • P_WP 併發進程數

  • S_MATNR D .

  • S_WERKS D .

*Messages
*----------------------------------------------------------
*

  • Message class: Hard coded
  • 對象已被鎖定,請稍後執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章