前言
在项目中,销售订单发票IDOC输出有时候因为某些未知原因,没有执行完毕,在SM35中发现是会话没有处理,因此有必要设置一个JOB去自动处理这些会话。
代码示例
REPORT zsdp161.
TABLES: apqi.DATA: gt_qid TYPE STANDARD TABLE OF apqi-qid.DATA: gt_rsparams TYPE TABLE OF rsparams.DATA: gv_jobname TYPE tbtcjob-jobname.DATA: gv_jobcount TYPE tbtcjob-jobcount.DATA: gv_eventid TYPE tbtcjob-eventid.DATA: gv_eventparm TYPE tbtcjob-eventparm.DATA: gv_date LIKE sy-datum.DATA: gv_time LIKE sy-uzeit.*&---------------------------------------------------------------------**& 选择屏幕 / SELECTION SCREEN*&---------------------------------------------------------------------*SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: sgroupid FOR apqi-groupid."会话名称 SELECT-OPTIONS: sqid FOR apqi-qid."队列ID
SELECTION-SCREEN END OF BLOCK blk1.INITIALIZATION. APPEND 'ICPIV*' TO sgroupid.
START-OF-SELECTION. SELECT qid INTO TABLE @gt_qid FROM apqi WHERE datatyp = 'BDC' AND groupid IN @sgroupid AND qid IN @sqid. IF gt_qid[] IS INITIAL. MESSAGE '无数据' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF.
END-OF-SELECTION . LOOP AT gt_qid INTO DATA(lv_qid). gt_rsparams = VALUE #( ( selname = 'QUEUE_ID' kind = 'P' low = lv_qid ) ). IF sy-tabix = 1. gv_date = sy-datum. gv_time = sy-uzeit + 10."10秒后执行,只有已释放和已调度的JOB才能作为前趋作业 ELSE. CLEAR: gv_date, gv_time. ENDIF. DATA(ls_return) = zcl_common=>start_job( jobname = |SM35_{ lv_qid }| report = 'RSBDCBTC' params = gt_rsparams start_date = gv_date start_time = gv_time eventid = gv_eventid eventparm = gv_eventparm ). IF ls_return-return-type = 'S'. gv_jobname = ls_return-jobname. gv_jobcount = ls_return-jobcount. gv_eventid = `SAP_END_OF_JOB`. gv_eventparm = |{ ls_return-jobname WIDTH = 32 ALIGN = LEFT }{ ls_return-jobcount }|. ENDIF. ENDLOOP.程序逻辑:从 apqi 表中取出满足条件的未处理会话ID,然后启动JOB依次执行 rsbdcbtc 报表程序。
如果不设置多个JOB,在LOOP中直接submit ' RSBDCBTC ',程序只执行一个会话就自动停止了。
总结
最后根据实际需求和频率,设置一个后台JOB定时执行这个报表程序就可以了。