병렬처리 예제
#######################################################################
DO.
CALL FUNCTION 'ZCKM8N_ML_DATA_PROCESS'
STARTING NEW TASK taskname
DESTINATION IN GROUP p_rfcgr "GROUP
PERFORMING get_data_routine ON END OF TASK
EXPORTING
i_bdatj = g_bdatj
i_poper = g_poper
TABLES
it_item = pt_item
EXCEPTIONS
communication_failure = 1 MESSAGE msg
system_failure = 2 MESSAGE msg
resource_failure = 3.
CASE sy-subrc.
WHEN 0.
taskname = taskname + 1.
snd_jobs = snd_jobs + 1.
jobs = jobs + 1.
EXIT. "Job processing finished
WHEN OTHERS.
WRITE:/ msg.
IF excp_flag = space.
excp_flag = 'X'.
WAIT UNTIL rcv_jobs >= snd_jobs UP TO '0.1' SECONDS.
ELSE.
WAIT UNTIL rcv_jobs >= snd_jobs UP TO '0.1' SECONDS.
IF sy-subrc = 0.
CLEAR excp_flag.
ENDIF.
ENDIF.
ENDCASE.
ENDDO.
FORM get_data_routine USING p_taskname.
DATA : l_count LIKE sy-tabix.
*&
RECEIVE RESULTS FROM FUNCTION 'ZCKM8N_ML_DATA_PROCESS'
IMPORTING
e_count = l_count
EXCEPTIONS
communication_failure = 1
system_failure = 2 .
IF sy-subrc = 0.
g_total = g_total + l_count.
ENDIF.
*&
rcv_jobs = rcv_jobs + 1. "Receiving data
jobs = jobs - 1.
ENDFORM. " get_data_routinE
#######################################################################
lv_nr_of_tasks = pa_ntask.
DESCRIBE TABLE gt_zcov_001 LINES sy-tfill.
lv_rsnum_entries = sy-tfill / lv_nr_of_tasks.
LOOP AT gt_zcov_001.
ADD 1 TO lv_counter.
APPEND gt_zcov_001 TO lt_zcov_001.
IF lv_counter = lv_rsnum_entries.
ADD 1 TO lv_task.
lv_task_id = lv_task.
CALL FUNCTION 'Z_CO_COLLECT_ML_P'
STARTING NEW TASK lv_task_id
DESTINATION IN GROUP pa_group
PERFORMING ret_data_collect_ml ON END OF TASK
EXPORTING
i_bdatj = pa_spmon+0(4)
i_poper = gv_pa_poper
i_bukrs = pa_bukrs
i_curtp = gv_check
i_untper = gv_untper
TABLES
i_itab = lt_zcov_001
e_collect_ml = lt_ml_temp1
e_mlast = lt_ml_temp2.
CLEAR lv_counter.
REFRESH lt_zcov_001.
ENDIF.
ENDLOOP.
FORM ret_data_collect_ml USING taskname.
DATA lt_zcov_001 LIKE zcov_001 OCCURS 0 WITH HEADER LINE.
DATA lt_ml_temp1 LIKE zcos_collect_ml OCCURS 0 WITH HEADER LINE.
DATA lt_ml_temp2 LIKE zcos_collect_ml OCCURS 0 WITH HEADER LINE.
RECEIVE RESULTS FROM FUNCTION 'Z_CO_COLLECT_ML_P'
TABLES
i_itab = lt_zcov_001
e_collect_ml = lt_ml_temp1
e_mlast = lt_ml_temp2.
LOOP AT lt_ml_temp1 .
MOVE-CORRESPONDING lt_ml_temp1 TO gt_collect_ml.
COLLECT gt_collect_ml. CLEAR gt_collect_ml.
ENDLOOP.
LOOP AT lt_ml_temp2 .
MOVE-CORRESPONDING lt_ml_temp2 TO gt_mlast.
COLLECT gt_mlast. CLEAR gt_mlast.
ENDLOOP.
ADD 1 TO gv_answers_received.
REFRESH: lt_zcov_001, lt_ml_temp1, lt_ml_temp2.
ENDFORM. " RET_DATA_COLLECT_ML
#######################################################################
FORM call_rfc_function TABLES lt_keko STRUCTURE gt_keko
USING value(p_times) LIKE sy-index.
DATA : msg_text(80) TYPE c,
l_index LIKE sy-tabix,
lv_serial LIKE sy-tabix.
lv_serial = gv_counts * gv_process_count. "현재 돌아갈 개수
DO.
READ TABLE it_task WITH KEY status = 'I'.
IF sy-subrc = 0.
l_index = sy-tabix.
CALL FUNCTION 'ZCO_C041_GETEXPLOSION'
STARTING NEW TASK it_task-name
DESTINATION IN GROUP DEFAULT
PERFORMING get_keko_data ON END OF TASK
EXPORTING
referenceobject = c_ref_object
costingtype = p_cost_type
costingversion = p_tvers
valuationvariant = p_variant
enteredmanually = '' "KKZMA
cost_component_view = c_cost_view
* EXPLOSION_DEPTH = DEPTH
lot_size = p_lot
TABLES
im_keko = lt_keko
EXCEPTIONS
communication_failure = 1
system_failure = 2
RESOURCE_FAILURE = 3.
.
CASE sy-subrc.
WHEN 0.
* Administration of asynchronous tasks
snd_jobs = snd_jobs + 1.
it_task-status = 'W'.
MODIFY it_task INDEX l_index.
EXIT.
WHEN 1 OR 2.
* Handling of communication and system failure
...
EXIT.
WHEN 3. "No resources available at present
* Receive reply to asynchronous RFC calls
IF excp_flag = space.
excp_flag = 'X'.
* First attempt for RESOURCE_FAILURE handling
WAIT UNTIL rcv_jobs >= snd_jobs UP TO '0.01' SECONDS.
ELSE.
* Second attempt for RESOURCE_FAILURE handling
WAIT UNTIL rcv_jobs >= snd_jobs UP TO '0.1' SECONDS.
ENDIF.
IF sy-subrc = 0.
CLEAR excp_flag. "Reset flag
ELSE. "No replies
"Endless loop handling
...
ENDIF.
ENDCASE.
ELSE.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
ENDFORM. "CALL_RFC_FUNCTION
*&--------------------------------------------------------------------*
*& Form GET_KEKO_DATA
*&--------------------------------------------------------------------*
* Remote Call Function 결과값 처리
*---------------------------------------------------------------------*
FORM get_keko_data USING taskname.
DATA : lt_return LIKE zcos_041_return OCCURS 0 WITH HEADER LINE,
lt_explosion_list LIKE zcos_041_explosionlist
OCCURS 0 WITH HEADER LINE.
RECEIVE RESULTS FROM FUNCTION 'ZCO_C041_GETEXPLOSION'
TABLES
ex_return = lt_return
ex_explosion_list = lt_explosion_list
EXCEPTIONS
OTHERS = 0.
rcv_jobs = rcv_jobs + 1. "Receiving data
APPEND LINES OF lt_explosion_list TO gt_rfc_explosion_list.
APPEND LINES OF lt_return TO gt_rfc_return.
READ TABLE it_task WITH KEY name = taskname.
it_task-status = 'I'.
MODIFY it_task INDEX sy-tabix.
ENDFORM. "GET_KEKO_DATA
#######################################################################
FORM parallel_processing USING p_count TYPE i
p_insert.
DO.
WAIT UNTIL g_running_arfc_wps < g_jobnum.
CALL FUNCTION 'ZQSA_GET_ZCE1_BACKUP'
STARTING NEW TASK g_taskname
DESTINATION IN GROUP p_rfcgrp
PERFORMING return_get_zce1 ON END OF TASK
EXPORTING
i_insert = p_insert
i_tabname = g_tabname
i_perio = gt_perio-perio
i_versi = p_versi
is_qsadic = gs_qsadic
TABLES
it_uniqu = gt_key_t.
CASE sy-subrc.
WHEN 0.
g_taskname = g_taskname + 1.
g_sendjobs = g_sendjobs + 1.
g_running_arfc_wps = g_running_arfc_wps + 1.
EXIT.
ENDCASE.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form RETURN_GET_ZCE1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
* -->P_IT_UNIQU text
* -->P_= text
* -->P_GT_KEY_T text
*&---------------------------------------------------------------------*
FORM return_get_zce1 USING p_taskname.
DATA: l_processed_count TYPE zqsa_srcnt,
l_tab01 TYPE tabname VALUE 'SY-SUBRC = '.
RECEIVE RESULTS FROM FUNCTION 'ZQSA_GET_ZCE1_BACKUP'
IMPORTING
e_process_count = l_processed_count
EXCEPTIONS
communication_failure = 1 MESSAGE g_message
system_failure = 2 MESSAGE g_message.
g_running_arfc_wps = g_running_arfc_wps - 1.
g_recvjobs = g_recvjobs + 1. " Receiving data
g_processed_count = g_processed_count + l_processed_count.
IF sy-subrc <> 0.
MESSAGE a003 WITH l_tab01 sy-subrc g_message.
ENDIF.
ENDFORM.
#######################################################################
FORM CREATE_PROD_VERSION_PARA .
DATA: LT_MATNR LIKE GT_OUTTAB OCCURS 0 WITH HEADER LINE,
LT_DATA LIKE GT_OUTTAB OCCURS 0 WITH HEADER LINE.
DATA: LT_SEND LIKE TABLE OF ZPPS_0030 WITH HEADER LINE.
DATA: L_CNT_OK TYPE I,
L_CNT_ERROR TYPE I.
DATA: LV_TIME LIKE SY-UZEIT.
LOOP AT GT_OUTTAB WHERE MARK EQ C_X.
MOVE-CORRESPONDING GT_OUTTAB TO LT_DATA.
APPEND LT_DATA. CLEAR LT_DATA.
ENDLOOP.
CHECK LT_DATA[] IS NOT INITIAL.
CLEAR: GV_SEND, GV_RECEIVE, GV_TOTAL_SEND.
CLEAR: GT_SNTASK[], GV_COUNT, GT_ADDTAB[], GT_ADDTAB.
GET TIME FIELD LV_TIME.
DO PA_CNT TIMES.
GV_COUNT = GV_COUNT + 1.
GT_SNTASK-STATUS = 'I'.
CONCATENATE 'Prod_Vers_' LV_TIME GV_COUNT INTO GT_SNTASK-NAME.
APPEND GT_SNTASK.
ENDDO.
LT_MATNR[] = LT_DATA[].
SORT LT_MATNR BY WERKS MATNR.
DELETE ADJACENT DUPLICATES FROM LT_MATNR COMPARING WERKS MATNR.
SORT LT_DATA BY WERKS MATNR.
LOOP AT LT_MATNR.
CLEAR LT_SEND[].
FREE LT_SEND.
READ TABLE LT_DATA WITH KEY WERKS = LT_MATNR-WERKS
MATNR = LT_MATNR-MATNR
BINARY SEARCH.
IF SY-SUBRC = 0.
LOOP AT LT_DATA FROM SY-TABIX.
IF LT_DATA-WERKS <> LT_MATNR-WERKS OR
LT_DATA-MATNR <> LT_MATNR-MATNR.
EXIT.
ENDIF.
CLEAR LT_SEND.
MOVE-CORRESPONDING LT_DATA TO LT_SEND.
APPEND LT_SEND.
ENDLOOP.
ENDIF.
CHECK LT_SEND[] IS NOT INITIAL.
DO.
READ TABLE GT_SNTASK WITH KEY STATUS = 'I'.
IF SY-SUBRC = 0.
GT_SNTASK-STATUS = 'U'.
MODIFY GT_SNTASK INDEX SY-TABIX.
DO.
CALL FUNCTION 'Z_PP_PARA_VERSION'
STARTING NEW TASK GT_SNTASK-NAME
DESTINATION IN GROUP PA_CLASS
PERFORMING RECEIVE_FUNCTION ON END OF TASK
TABLES
T_DATA = LT_SEND
EXCEPTIONS
SYSTEM_FAILURE = 1
COMMUNICATION_FAILURE = 2
RESOURCE_FAILURE = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
WAIT UP TO 1 SECONDS.
WAIT UNTIL GV_TOTAL_SEND <= GV_RECEIVE.
ELSE.
GV_SEND = GV_SEND + 1.
GV_TOTAL_SEND = GV_TOTAL_SEND + 1.
EXIT.
ENDIF.
ENDDO.
EXIT.
ELSE.
WAIT UP TO 1 SECONDS.
WAIT UNTIL GV_TOTAL_SEND <= GV_RECEIVE.
ENDIF.
ENDDO.
* IF GV_SEND = PA_CNT.
** WAIT UNTIL GV_SEND = PA_CNT.
* WAIT UNTIL GV_TOTAL_SEND <= GV_RECEIVE.
* CLEAR GV_SEND.
* ENDIF.
ENDLOOP.
WAIT UNTIL GV_TOTAL_SEND <= GV_RECEIVE.
* WAIT UNTIL GV_SEND <= GV_RECEIVE.
SORT GT_ADDTAB BY WERKS MATNR PLNNR PLNAL STLAL STEUS.
LOOP AT GT_OUTTAB WHERE MARK EQ C_X.
READ TABLE GT_ADDTAB WITH KEY WERKS = GT_OUTTAB-WERKS
MATNR = GT_OUTTAB-MATNR
PLNNR = GT_OUTTAB-PLNNR
PLNAL = GT_OUTTAB-PLNAL
STLAL = GT_OUTTAB-STLAL
BINARY SEARCH.
IF SY-SUBRC = 0.
GT_OUTTAB-ICON = GT_ADDTAB-ICON.
GT_OUTTAB-VERID = GT_ADDTAB-VERID.
GT_OUTTAB-MDV02 = GT_ADDTAB-MDV02.
GT_OUTTAB-LINE = GT_ADDTAB-LINE.
GT_OUTTAB-WC_ICON = GT_ADDTAB-WC_ICON.
GT_OUTTAB-ERRTYP = GT_ADDTAB-ERRTYP.
GT_OUTTAB-ERRMSG = GT_ADDTAB-ERRMSG.
MODIFY GT_OUTTAB.
IF GT_OUTTAB-ERRTYP IS INITIAL.
L_CNT_OK = L_CNT_OK + 1.
ELSE.
L_CNT_ERROR = L_CNT_ERROR + 1.
ENDIF.
ENDIF.
ENDLOOP.
MESSAGE S071 WITH L_CNT_OK L_CNT_ERROR.
GV_GET_TOT = L_CNT_OK + L_CNT_ERROR.
GV_OK = L_CNT_OK .
GV_ERROR = L_CNT_ERROR.
ENDFORM.
**&---------------------------------------------------------------------*
**& Form RECEIVE_FUNCTION
**&---------------------------------------------------------------------*
FORM RECEIVE_FUNCTION USING PV_TASKNAME.
DATA: LT_SEND LIKE TABLE OF ZPPS_0030 WITH HEADER LINE.
RECEIVE RESULTS FROM FUNCTION 'Z_PP_PARA_VERSION'
TABLES
T_DATA = LT_SEND
EXCEPTIONS
SYSTEM_FAILURE = 1
COMMUNICATION_FAILURE = 2
RESOURCE_FAILURE = 3
OTHERS = 4.
GV_RECEIVE = GV_RECEIVE + 1.
APPEND LINES OF LT_SEND TO GT_ADDTAB.
READ TABLE GT_SNTASK WITH KEY NAME = PV_TASKNAME.
IF SY-SUBRC = 0.
GT_SNTASK-STATUS = 'I'.
MODIFY GT_SNTASK INDEX SY-TABIX.
ENDIF.
ENDFORM.
#######################################################################
WAIT UNTIL RESULT_JOB_COUNT >= SEND_JOB_COUNT. 사용은 어떠신지.
던져놓은 작업들이 끝날때까지 기다렸다가 다음 병렬처리를 수행하도록 합니다.
도움이 되셨으면 좋겠네요.
Ex) EXE_JOB_COUNT 는 한번에 실행시킬 작업수입니다.
CLEAR : SEND_JOB_COUNT, RESULT_JOB_COUNT.
DO EXE_JOB_COUNT TIMES.
CALL FUNCTION ~
STARTING NEW TASK ~
DESTINATION IN GROUP DEFAULT
CALLING form_result ON END OF TASK
.....
CASE SY-SUBRC.
WHEN 0. ADD 1 TO SEND JOB_COUNT.
WHEN 1.
...
WHEN OTHERS.
ENDDO.
WAIT UNTIL RESULT_JOB_COUNT >= SEND_JOB_COUNT.
~~~~~Next process.
FORM form_result.
ADD 1 TO RESULT_JOB_COUNT.
RECEIVING RESULTS FROM FUNCTION 'function_name'
....
ENDFORM.
#######################################################################
DO.
IF LT_BWKEY[] IS INITIAL.
EXIT.
ENDIF.
_INIT LT_CBWKEY.
IF LV_RETRY IS INITIAL.
APPEND LINES OF LT_BWKEY[]
FROM LV_SLINE TO LV_ELINE TO LT_CBWKEY.
_INIT : LT_WERKS.
LOOP AT LT_CBWKEY.
_RANGES : LT_WERKS ZGCOZ_I ZGCOZ_EQ LT_CBWKEY-BWKEY SPACE.
ENDLOOP.
DELETE LT_BWKEY FROM LV_SLINE TO LV_ELINE.
GV_INDEX = GV_INDEX + 1.
ENDIF.
CLEAR LV_RETRY.
CONCATENATE 'TASK' GV_INDEX INTO GV_TASK.
CALL FUNCTION 'Z_CO_GET_ENDING_STOCK'
STARTING NEW TASK GV_TASK DESTINATION IN GROUP P_RFCGRP
PERFORMING RETURN_GET_ENDING_STOCK ON END OF TASK
EXPORTING
IV_PFLAG = LV_PFLAG
IV_KOKRS = P_KOKRS
IV_BUKRS = P_BUKRS
IV_SPMON = P_SPMON
IT_BWKEY = LT_WERKS[]
IT_BKLAS = LT_BKLAS[]
IT_MATNR = LT_MATNR[]
TABLES
T_STOCK = LT_STOCK
EXCEPTIONS
SYSTEM_FAILURE = 1 MESSAGE GV_MSG_TEXT
COMMUNICATION_FAILURE = 2 MESSAGE GV_MSG_TEXT
RESOURCE_FAILURE = 3
INVALID_PERIOD = 4
NOT_FOUND = 5.
CASE SY-SUBRC.
WHEN 0.
GV_SNJOBS = GV_SNJOBS + 1.
GV_TOJOBS = GV_TOJOBS + 1.
WHEN 1 OR 2.
* Handling of communication and system failure
GV_ERROR = ZGCOZ_X.
* Some Logging about this status...
CONCATENATE 'Main Call Function Error: ' GV_MSG_TEXT
INTO GV_MSG_TEXT.
MESSAGE S000(ZMC_CO02) WITH GV_MSG_TEXT DISPLAY LIKE ZGCOZ_E.
LEAVE LIST-PROCESSING.
WHEN 3. "No resources available at present
* IF gv_snjobs >= 1.
WAIT UNTIL GV_RCJOBS >= GV_SNJOBS
UP TO 5 SECONDS.
* ENDIF.
LV_RETRY = ZGCOZ_X.
CONTINUE.
WHEN 4.
*-- INVALID PERIOD
MESSAGE S000(ZMC_CO02) WITH TEXT-TM2 DISPLAY LIKE ZGCOZ_E.
GV_ERROR = ZGCOZ_X.
EXIT.
WHEN 5.
MESSAGE S166(ZMC_CO02) DISPLAY LIKE ZGCOZ_E.
GV_ERROR = ZGCOZ_X.
EXIT.
ENDCASE.
IF GV_TOJOBS >= P_WPNUM.
WAIT UNTIL GV_TOJOBS < P_WPNUM.
ENDIF.
ENDDO.
IF GV_ERROR IS INITIAL.
WAIT UNTIL GV_RCJOBS >= GV_SNJOBS.
ENDIF.
#######################################################################