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的介绍
9612

被折叠的 条评论
为什么被折叠?



