SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:
s_zbukr FOR zepict_pay_head-zbukr OBLIGATORY ,
s_hbkid FOR zepict_pay_head-hbkid OBLIGATORY,
s_hktid FOR zepict_pay_head-hktid.
PARAMETERS: p_sdate TYPE zepic_s_cn_icbc_qhd_dp-startdate DEFAULT sy-datum.
PARAMETERS: p_edate TYPE zepic_s_cn_icbc_qhd_dp-enddate DEFAULT sy-datum.
PARAMETERS:p_cover TYPE c AS CHECKBOX ."如果底表数据没有更新过 勾选覆盖更新的话 将数据全部覆盖更新
PARAMETERS:p_test TYPE c AS CHECKBOX ."测试运行
SELECTION-SCREEN END OF BLOCK b1 .
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS:p_para TYPE c AS CHECKBOX DEFAULT 'X'.
PARAMETERS: jobs TYPE i DEFAULT '10'.
PARAMETERS p_rfcgr LIKE rzllitab-classname OBLIGATORY DEFAULT 'parallel_generator'.
SELECTION-SCREEN END OF BLOCK b2 .
FORM frm_set_paraller .
max_proc_num = jobs.
IF max_proc_num <= 1 .
* MESSAGE i899 WITH text-009.
jobs = 1.
max_proc_num = 1.
ENDIF.
* * initialization of the server group
CALL FUNCTION 'SPBT_INITIALIZE'
EXPORTING
group_name = p_rfcgr
IMPORTING
max_pbt_wps = max_pbt_wps
EXCEPTIONS
invalid_group_name = 1
internal_error = 2
pbt_env_already_initialized = 3
currently_no_resources_avail = 4
no_pbt_resources_found = 5
cant_init_different_pbt_groups = 6
OTHERS = 7.
IF sy-subrc NE 0.
EXIT.
ELSE.
** "进程池中最多的进程数小于设定的并发数量,那么并发数量必须改为最大进程数
IF max_pbt_wps < max_proc_num.
max_proc_num = max_pbt_wps.
jobs = max_pbt_wps.
ENDIF.
ENDIF.
proc_num_limit = max_proc_num."限制最大进程数量
ENDFORM.
FORM frm_get_zift_1201_data_para .
DATA ls_epic_input TYPE zepic_s_balance_item_req_input.
DATA lt_epic_output TYPE zepic_s_balance_item_rsp_tt.
DATA lt_epic_return TYPE BAPIRET2_T.
DATA: tab_idx(4) TYPE n,
idx_char(20),
taskname(20).
LOOP AT gt_epic_bcd.
** 并行更新
idx_char = sy-tabix.
CONDENSE idx_char NO-GAPS .
running = started - returned. "运行进程数量 = 开始的 - 返回的
IF running >= proc_num_limit. "要超过限定最大进程数,需要等待到运行的进程数量少于限定最大进程数量
" maximum number of running jobs is active
" => wait until at least one has finished
WAIT UNTIL running < proc_num_limit.
ENDIF.
proc_num_limit = max_proc_num.
taskname = idx_char.
CLEAR ls_epic_input.
REFRESH lt_epic_output.
REFRESH lt_epic_return.
MOVE-CORRESPONDING gt_epic_bcd TO ls_epic_input.
ls_epic_input-startdate = p_sdate.
ls_epic_input-enddate = p_edate.
CALL FUNCTION 'ZEPIC_BALANCE_ITEM_QUERY'
STARTING NEW TASK taskname
DESTINATION IN GROUP p_rfcgr
PERFORMING frm_feedback ON END OF TASK
EXPORTING
input = ls_epic_input
EXCEPTIONS
resource_failure = 1
system_failure = 2
communication_failure = 3
OTHERS = 4.
.
rc = sy-subrc.
CASE rc.
WHEN 0.
started = started + 1.
running = running + 1.
WHEN 1.
proc_num_limit = started - returned.
IF started = returned.
EXIT.
ENDIF.
WHEN OTHERS.
rc = 2.
EXIT.
ENDCASE.
ENDLOOP.
WAIT UNTIL returned >= started.
ENDFORM.
*&----------
IF gt_zfit_1201[] IS NOT INITIAL.
SELECT *
FROM zfit_1201
INTO CORRESPONDING FIELDS OF TABLE lt_1201_db
FOR ALL ENTRIES IN gt_zfit_1201
WHERE zbukr = gt_zfit_1201-zbukr
AND hbkid = gt_zfit_1201-hbkid
AND hktid = gt_zfit_1201-hktid
AND bankn = gt_zfit_1201-bankn
AND onlysequence = gt_zfit_1201-onlysequence
.
ENDIF.
SORT lt_1201_db BY zbukr hbkid hktid bankn onlysequence.
IF p_cover IS INITIAL.
LOOP AT gt_zfit_1201 INTO gs_zfit_1201.
lv_tabix = sy-tabix.
** 如果数据库中已经存在此条数据 那么就不再进行更新!!!!!!!!!!
READ TABLE lt_1201_db WITH KEY zbukr = gs_zfit_1201-zbukr
hbkid = gs_zfit_1201-hbkid
hktid = gs_zfit_1201-hktid
bankn = gs_zfit_1201-bankn
onlysequence = gs_zfit_1201-onlysequence
.
IF sy-subrc NE 0.
MOVE-CORRESPONDING gs_zfit_1201 TO lt_1201_ins.
lt_1201_ins-status = 'X'."下载
APPEND lt_1201_ins.
ELSE.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT gt_zfit_1201 INTO gs_zfit_1201.
lv_tabix = sy-tabix.
** 如果数据库中已经存在此条数据 那么就不再进行更新!!!!!!!!!!
READ TABLE lt_1201_db WITH KEY zbukr = gs_zfit_1201-zbukr
hbkid = gs_zfit_1201-hbkid
hktid = gs_zfit_1201-hktid
bankn = gs_zfit_1201-bankn
onlysequence = gs_zfit_1201-onlysequence
.
IF sy-subrc NE 0.
MOVE-CORRESPONDING gs_zfit_1201 TO lt_1201_ins.
lt_1201_ins-status = 'X'."下载
APPEND lt_1201_ins.
ELSE."数据库存在此数据
IF lt_1201_db-belnr IS INITIAL.
MOVE-CORRESPONDING gs_zfit_1201 TO lt_1201_upd.
lt_1201_ins-status = 'X'."下载
APPEND lt_1201_upd.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
IF p_test IS INITIAL.
IF lt_1201_ins[] IS NOT INITIAL.
CLEAR lt_1201_ins.
CALL FUNCTION 'ZBC_SET_BC001_LINE'
EXPORTING
iv_updkz = 'I'
CHANGING
cs_data = lt_1201_ins.
MODIFY lt_1201_ins TRANSPORTING
crdat
crtim
crnam
crtcd
WHERE crdat IS INITIAL.
INSERT zfit_1201 FROM TABLE lt_1201_ins ACCEPTING DUPLICATE KEYS.
COMMIT WORK AND WAIT.
ENDIF.
IF lt_1201_upd[] IS NOT INITIAL..
CLEAR lt_1201_upd.
CALL FUNCTION 'ZBC_SET_BC001_LINE'
EXPORTING
iv_updkz = 'I'
CHANGING
cs_data = lt_1201_upd.
MODIFY lt_1201_upd TRANSPORTING
chdat
chtim
chnam
chtcd
WHERE zbukr IS NOT INITIAL .
MODIFY zfit_1201 FROM TABLE lt_1201_upd.
COMMIT WORK AND WAIT.
ENDIF.
ENDIF.
LOOP AT lt_1201_ins .
CLEAR gt_out.
MOVE-CORRESPONDING lt_1201_ins TO gt_out.
APPEND gt_out.
ENDLOOP.
LOOP AT lt_1201_upd .
CLEAR gt_out.
MOVE-CORRESPONDING lt_1201_upd TO gt_out.
APPEND gt_out.
ENDLOOP.
IF gt_out[] IS INITIAL.
MESSAGE '没有更新的数据' TYPE 'S'.
ENDIF.
GET TIME STAMP FIELD gv_end_time.
gv_time = gv_end_time - gv_start_time.
ENDFORM.
*&-------------