SAP ABAP程序优化-多线程并行处理
轉載請標明出處:http://blog.csdn.net/wanglei880526/article/details/8949754
實際項目實施過程中,我們會遇到程序性能優化的問題,這里介紹一種方法:通過RFC接口進行遠程函數的異步調用實現程序的并行處理。
???同步/異步調用函數語法
同步調用:CALL FUNCTION 'AAA' ;
同步調用的實質:程序進行單線程執行。
異步調用:CALL FUNCTION 'AAA' STARTING NEWTASK <taskname>?"任務名稱
DESTINATION IN GROUP <RFC Serve 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分析:一般系統直接指定<RFC Serve Group> =' 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'EXPORTINGPERCENTAGE = 10TEXT = '數據獲取中...'.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 werksUP TO 18000 ROWS "最多獲取20條數據INTO CORRESPONDING FIELDS OF TABLE it_marcFROM marcWHERE matnr IN s_matnrAND werks IN s_werks.LOOP AT it_marc INTO wa_marc.CLEAR it_md.CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'EXPORTINGMATNR = wa_marc-matnrWERKS = wa_marc-werksTABLESMDEZX = it_mdEXCEPTIONSMATERIAL_PLANT_NOT_FOUND = 1PLANT_NOT_FOUND = 2OTHERS = 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'EXPORTINGi_callback_program = sy-repidis_layout = wa_layoutit_fieldcat = it_fieldcati_save = 'A' * it_events = git_events[] * i_callback_pf_status_set = 'PF_STATUS_SET' * i_callback_user_command = 'USER_COMMAND'TABLESt_outtab = it_outputEXCEPTIONSprogram_error = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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 Nameg_applserver TYPE rzllitab-applserver,"RFC Serve Groupexcp_flag(1) TYPE c. "Number of RESOURCE_FAILUREsDATA: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'EXPORTINGmode_trdir = 'E'name = 'ZSOPR0032'x_name = ' '_scope = '2'_wait = ' '_collect = ' 'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3.IF sy-subrc <> 0. * Implement suitable error handling hereMESSAGE '對象已被鎖定,請稍后執行' TYPE 'E'.ELSE."鎖定成功ENDIF.*start of selection START-OF-SELECTION.CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'EXPORTINGpercentage = 10text = '數據獲取中...'.PERFORM frm_get_date.*END OF SELECTION END-OF-SELECTION."解除程序的鎖定CALL FUNCTION 'DEQUEUE_EZZSOPR0032'EXPORTINGmode_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 werksUP TO 18000 ROWS ""數據條目18000INTO CORRESPONDING FIELDS OF TABLE it_marcFROM marcWHERE matnr IN s_matnrAND werks IN s_werks.* 獲取 RFC Serve Group name Start--* * 一般系統默認g_classname = 'parallel_generators',但為了通用性按照如下方法獲取CALL 'C_SAPGPARAM' "#EC CI_CCALLID 'NAME' FIELD 'rdisp/myname'ID 'VALUE' FIELD g_applserver.SELECT SINGLE classnameFROM rzllitabINTO g_classname "Server Group NameWHERE applserver = g_applserverAND 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_tasknameDESTINATION IN GROUP g_classnamePERFORMING frm_subroutine_done ON END OF TASK "子程序 * 只要將函數的EXPORTING參數放在此處,其他參數放到子程序中EXPORTINGmatnr = wa_marc-matnrwerks = wa_marc-werks* 系統標準報錯信息EXCEPTIONScommunication_failure = 1 MESSAGE messsystem_failure = 2 MESSAGE messresource_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 dataCLEAR:it_md[].RECEIVE RESULTS FROM FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'TABLESmdezx = it_mdEXCEPTIONSmaterial_plant_not_found = 1plant_not_found = 2OTHERS = 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'EXPORTINGi_callback_program = sy-repidis_layout = wa_layoutit_fieldcat = it_fieldcati_save = 'A' * it_events = git_events[] * i_callback_pf_status_set = 'PF_STATUS_SET' * i_callback_user_command = 'USER_COMMAND'TABLESt_outtab = it_outputEXCEPTIONSprogram_error = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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 * 對象已被鎖定,請稍后執行
總結
以上是生活随笔為你收集整理的SAP ABAP程序优化-多线程并行处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Business ByDesig
- 下一篇: SAP 调用smartforms打印如何