ABAP实现后台JOB
1、 关于后台JOB
简单来说,后台JOB就是在SAP应用服务器后台异步运行的ABAP程序(或程序步骤集合)。它与你在SAP GUI中直接运行程序(前台运行)有本质区别:
-
异步执行: 提交JOB后,会话可以立即释放去做其他事情,无需等待JOB完成。
-
独立于用户会话: JOB运行在专用的后台工作进程上,与任何具体用户的登录状态无关。即使用户退出系统,JOB也能继续运行。
-
计划性: JOB可以设定具体的开始时间(立即、某个具体日期时间、定期重复)和运行条件(如某个前置JOB成功结束后)。
-
资源管理: SAP系统有专门的后台作业调度器来管理和分配后台工作进程资源。
-
结果监控: 可以方便地查看JOB的执行状态(R 活动的(运行中) Y 就绪的 P 已调度的 S 已释放 A 已取消(出错终止) F 已完成(结束))、日志(Spool)和最终结果。
核心价值:
-
解放用户: 用户提交耗时任务后即可离开,提高工作效率。
-
避免超时: 彻底解决长运行时间导致的
SESSION_TIMEOUT问题。 -
利用空闲资源: 可将大型任务安排在系统负载低的时段(如夜间、周末)自动执行,优化系统性能。
-
实现自动化: 构建自动化业务流程(如定期报表、数据同步、批量接口处理)。
-
提高可靠性: 通过状态监控和日志,更容易追踪和管理任务的执行情况。
2、代码实现
首先创建一个测试程序,用于后台JOB调用
"--------------------@斌将军-------------------- REPORT ybintest010. SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE text-001. PARAMETERS:c_test AS CHECKBOX."测试 SELECTION-SCREEN END OF BLOCK blk0. START-OF-SELECTION. IF c_test = 'X'. MESSAGE '测试运行' TYPE 'S'. ENDIF. "--------------------@斌将军--------------------
运行则弹出消息

2.1、无变式的调用
创建后台JOB
"--------------------@斌将军-------------------- DATA:lv_jobcount TYPE tbtcjob-jobcount, lv_jobname TYPE tbtcjob-jobname. lv_jobname = '这是后台JOB的名称'."作业名称 "创建后台JOB 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 = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. RETURN. ENDIF. "--------------------@斌将军--------------------
调用程序
"--------------------@斌将军-------------------- SUBMIT ybintest010 WITH c_test = 'X' VIA JOB lv_jobname NUMBER lv_jobcount AND RETURN. "--------------------@斌将军--------------------
关闭后台JOB
"--------------------@斌将军-------------------- "关闭后台JOB CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_jobcount jobname = lv_jobname strtimmed = 'X' EXCEPTIONS cant_start_immediate = 1 invalid_startdate = 2 jobname_missing = 3 job_close_failed = 4 job_nosteps = 5 job_notex = 6 lock_failed = 7 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. ENDIF. "--------------------@斌将军--------------------
运行结果

2.2、带变式的调用
为被调程序设置变式

打开和关闭JOB的代码不变,只需将SUBMIT代码更换为函数JOB_SUBMIT
"--------------------@斌将军-------------------- CALL FUNCTION 'JOB_SUBMIT' EXPORTING authcknam = sy-uname jobcount = lv_jobcount jobname = lv_jobname report = 'YBINTEST010' "调用程序名 variant = 'ZTEST01' "变式名称 * IMPORTING * STEP_NUMBER = EXCEPTIONS bad_priparams = 1 bad_xpgflags = 2 invalid_jobdata = 3 jobname_missing = 4 job_notex = 5 job_submit_failed = 6 lock_failed = 7 program_missing = 8 prog_abap_and_extpg_set = 9 OTHERS = 10. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. "--------------------@斌将军--------------------
2.3、获取JOB执行状态
从表中获取
"--------------------@斌将军-------------------- "查找作业执行状态 CLEAR:ls_tbtco. SELECT SINGLE status "状态 R 活动的(运行中) Y 就绪的 P 已调度的 S 已释放 A 已取消(出错终止) F 已完成(结束) strtdate strttime enddate endtime FROM tbtco INTO ls_tbtco WHERE jobname = lv_jobname AND jobcount = lv_jobcount. "--------------------@斌将军--------------------
从函数中获取
"--------------------@斌将军-------------------- DATA:lv_status TYPE tbtco-status. CALL FUNCTION 'BDL_READ_JOB_STATUS' EXPORTING jobname = lv_jobname jobnumber = lv_jobcount IMPORTING jobstatus = lv_status EXCEPTIONS job_not_found = 1 OTHERS = 2. IF sy-subrc <> 0. ENDIF. "--------------------@斌将军--------------------
2.4、获取JOB日志
"--------------------@斌将军-------------------- DATA: lt_joblog TYPE TABLE OF tbtc5, ls_joblog TYPE tbtc5. CALL FUNCTION 'BP_JOBLOG_READ' EXPORTING jobname = lv_jobname jobcount = lv_jobcount TABLES joblogtbl = lt_joblog EXCEPTIONS cant_read_joblog = 1 joblog_does_not_exist = 2 jobname_missing = 3 job_does_not_exist = 4 OTHERS = 5. "--------------------@斌将军--------------------
2.5、获取假脱机
"--------------------@斌将军-------------------- DATA:lt_objcont TYPE soli OCCURS 0 WITH HEADER LINE, lv_spool LIKE rspotype-rqnumber, lv_desired_type LIKE sood-objtp, lv_real_type LIKE sood-objtp, lv_otf TYPE c. CALL FUNCTION 'SO_WIND_SPOOL_LIST' EXPORTING owner = sy-uname IMPORTING spool_number = lv_spool. IF lv_spool IS INITIAL. EXIT. ENDIF. CALL FUNCTION 'RSPO_GET_TYPE_SPOOLJOB' EXPORTING rqident = lv_spool IMPORTING is_otf = lv_otf EXCEPTIONS can_not_access = 1. IF NOT lv_otf IS INITIAL. MOVE 'OTF' TO lv_desired_type. ELSE. MOVE 'RAW' TO lv_desired_type. ENDIF. CALL FUNCTION 'RSPO_RETURN_SPOOLJOB' EXPORTING rqident = lv_spool desired_type = lv_desired_type IMPORTING real_type = lv_real_type TABLES buffer = lt_objcont EXCEPTIONS no_such_job = 1 type_no_match = 2 job_contains_no_data = 3 no_permission = 4 can_not_access = 4 read_error = 5. IF sy-subrc <> 0. ENDIF. "--------------------@斌将军--------------------
以上就是ABAP实现后台JOB的介绍
定期更文,欢迎关注


浙公网安备 33010602011771号