并发程序代码

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.

*&-------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值