一、代码
当一个报表程序ALV数据过多,点击功能按钮执行过慢时可以选择提交后台JOB执行。如下为提交后台执行的form
FORM frm_submit_job . DATA: lv_jobname LIKE tbtcjob-jobname, lv_jobcount LIKE tbtcjob-jobcount, lt_stable TYPE TABLE OF rsparams. DATA: lv_str TYPE string. lv_jobname = sy-cprog. "程序名 CALL FUNCTION 'JOB_OPEN' EXPORTING jobname = lv_jobname IMPORTING jobcount = lv_jobcount EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3 OTHERS = 99. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. "获取当前选择屏幕值情况存临时变式 CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' EXPORTING curr_report = sy-cprog TABLES selection_table = lt_stable EXCEPTIONS not_found = 1 no_report = 2 OTHERS = 3. "用临时变式后台执行当前程序并返回 SUBMIT (sy-cprog) WITH SELECTION-TABLE lt_stable VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN. IF sy-subrc = 0. CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname strtimmed = 'X' EXCEPTIONS OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. MESSAGE s112(bt) WITH lv_jobname 'Released'. "跳转SM37 CONCATENATE 'BTCH2170-JOBNAME=' lv_jobname INTO lv_str. CALL FUNCTION 'TH_CREATE_MODE' EXPORTING transaktion = 'SM37' del_on_eot = 0 parameters = lv_str EXCEPTIONS OTHERS = 4. ENDIF. ENDIF. ENDFORM. " FRM_SUBMIT_JOB二、注意事项
2.1 选择屏幕勾选后台执行时
如下图,直接执行时因为主程序END-OF-SELECTION事件还未完全执行完,所以后台的JOB能获取到当前ALV的数据,可以不用再取数据,可直接执行功能并输出(注意输出ALV JOB假脱机才能看到执行情况,如下图2)。
2.2 按钮提交JOB时
当提交后台job为状态栏按钮时,sy-batch = 'X' 时也需要查询数据并且输出ALV,因为当前程序已经执行完,后台JOB无法获取当前程序数据。