日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SAP ABAP程序优化-多线程并行处理

發(fā)布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SAP ABAP程序优化-多线程并行处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉載請標明出處:http://blog.csdn.net/wanglei880526/article/details/8949754

實際項目實施過程中,我們會遇到程序性能優(yōu)化的問題,這里介紹一種方法:通過RFC接口進行遠程函數(shù)的異步調用實現(xiàn)程序的并行處理。

???同步/異步調用函數(shù)語法

同步調用:CALL FUNCTION 'AAA' ;

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

異步調用:CALL FUNCTION 'AAA' STARTING NEWTASK <taskname>?"任務名稱

DESTINATION IN GROUP <RFC Serve Group>

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

??? 異步調用的實質:程序進行多線程執(zhí)行。

一些關于函數(shù)異步調用實現(xiàn)程序并行處理的文章,沒有介紹如下問題:

⒈ 為了避免相同程序重復運行產生的后臺任務相互沖突,需要保證在相同時間段同一程序只被一個用戶占用;

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

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

問題1分析:從MD01中運行MRP我們可以知道,系統(tǒng)為了避免相同程序并發(fā)執(zhí)行,導致后臺任務沖突, MD01在并行模式下是不允許被兩個用戶同時執(zhí)行的。如下圖



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


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

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



問題3分析:一般系統(tǒng)直接指定<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:服務器組,空:登陸組


下面通過例子來說明函數(shù)異步調用,這里使用函數(shù)????????

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

(假設需求:從物料工廠表MARC中獲取一定的行項目,這里設定為18000條,然后通過調用函數(shù)獲取物料工廠對應的MRP清單,將物料工廠與獲取的對應清單整合輸出)

同步調用:(完整程序在程序最后)

select matnr werks

??? UP TO 18000 ROWS?????????????? "數(shù)據條目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.

很顯然在同步執(zhí)行情況下,只有一個進程是執(zhí)行我們調用的函數(shù),其他的進程處于idle狀態(tài)。


異步調用

解決問題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 '對象已被鎖定,請稍后執(zhí)行' TYPE 'E'. ? ENDIF.

解決問題1:當程序異步調用函數(shù)的操作結束后,即可接觸對程序的鎖定:

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--* * 一般系統(tǒng)默認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:通過 最大請求隊列的值 來控制啟動進程數(shù)

SELECT matnr werks

??? UP TO 18000 ROWS?????????????? "數(shù)據條目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.

*?? 異步調用函數(shù)??? Start--*

??? CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API' STARTINGNEW TASK g_taskname

??????? DESTINATION INGROUPg_classname

??????? PERFORMING frm_subroutine_done ONEND OF TASK"子程序

*????? 只要將函數(shù)的EXPORTING參數(shù)放在此處,其他參數(shù)放到子程序中

??????? EXPORTING

????????? matnr???????????????? = wa_marc-matnr

????????? werks???????????????? = wa_marc-werks

*?????? 系統(tǒng)標準報錯信息

??????? EXCEPTIONS

????????? communication_failure = 1? MESSAGE mess

????????? system_failure??????? = 2?MESSAGE mess

????????? resource_failure????? = 3.

??????? IF sy-subrc = 0.

????????? snd_jobs = snd_jobs + 1.

??????? ENDIF.

*?? 異步調用函數(shù)???? End--*

??? open_task_num = open_task_num + 1.?? "記錄啟動的進程數(shù)量

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

*??? 獲取并發(fā)進程返回的結果

????? 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數(shù)據訪問消耗時間;

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

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


同步調用完整程序:

福大

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


*&---------------------------------------------------------------------* *& 程序名稱:同步調用函數(shù)獲取MRP明細列表DEMO *& 程 序 名:ZDEMO_MXQ_TB *& 開發(fā)日期:2013-05-15 *& 創(chuàng) 建 者:漢得 *& 申 請 者: *&---------------------------------------------------------------------* *& 摘要說明 *&--------* *& 從物料工廠表MARC中獲取一定的行項目,然后通過調用函數(shù)獲取物料工廠對應的 *& 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."函數(shù)調用參數(shù) 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 . "進程數(shù) 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 = '數(shù)據獲取中...'.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條數(shù)據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' '數(shù)量' .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: 異步調用函數(shù)獲取MRP明細列表DEMO


*&---------------------------------------------------------------------* *& 程序名稱:異步調用函數(shù)獲取MRP明細列表DEMO *& 程 序 名:ZDEMO_MXQ_YB *& 開發(fā)日期:2013-05-15 *& 創(chuàng) 建 者:漢得 *& 申 請 者: *&---------------------------------------------------------------------* *& 摘要說明 *&--------* *& 從物料工廠表MARC中獲取一定的行項目,然后通過調用函數(shù)獲取物料工廠對應的 *& 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, "存放臨時數(shù)據lw_marc LIKE wa_marc."函數(shù)調用參數(shù) 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 . "進程數(shù) SELECT-OPTIONS:s_matnr FOR marc-matnr,s_werks FOR marc-werks.PARAMETERS:p_wp TYPE c . "并發(fā)進程數(shù)(根據RZ12中的最大請求隊列數(shù)設置)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 '對象已被鎖定,請稍后執(zhí)行' TYPE 'E'.ELSE."鎖定成功ENDIF.*start of selection START-OF-SELECTION.CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'EXPORTINGpercentage = 10text = '數(shù)據獲取中...'.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. "并發(fā)執(zhí)行出錯信息DATA:open_task_num TYPE i. "啟動任務數(shù)量SELECT matnr werksUP TO 18000 ROWS ""數(shù)據條目18000INTO CORRESPONDING FIELDS OF TABLE it_marcFROM marcWHERE matnr IN s_matnrAND werks IN s_werks.* 獲取 RFC Serve Group name Start--* * 一般系統(tǒng)默認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.* 異步調用函數(shù) Start--*CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API' STARTING NEW TASK g_tasknameDESTINATION IN GROUP g_classnamePERFORMING frm_subroutine_done ON END OF TASK "子程序 * 只要將函數(shù)的EXPORTING參數(shù)放在此處,其他參數(shù)放到子程序中EXPORTINGmatnr = wa_marc-matnrwerks = wa_marc-werks* 系統(tǒng)標準報錯信息EXCEPTIONScommunication_failure = 1 MESSAGE messsystem_failure = 2 MESSAGE messresource_failure = 3.IF sy-subrc = 0.snd_jobs = snd_jobs + 1.ENDIF. * 異步調用函數(shù) End--*open_task_num = open_task_num + 1. "記錄啟動的進程數(shù)量IF open_task_num = p_wp. "p_wp = RZ12中的 Max. requests in queue* 獲取并發(fā)進程返回的結果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' '數(shù)量' .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 并發(fā)進程數(shù) * S_MATNR D . * S_WERKS D .*Messages *---------------------------------------------------------- * * Message class: Hard coded * 對象已被鎖定,請稍后執(zhí)行

總結

以上是生活随笔為你收集整理的SAP ABAP程序优化-多线程并行处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。