在一些日常业务中,总有一些长时间处理的任务,系统运行这些任务需要一晚甚至一个周末。
这就需要后台运行单元(background work process)来完成,而且其是不会发生超时(time out) 错误的。
进程(job)有下面几种类型:
时间驱动(Time-driven job):按照用户预先设定的有时间启动进程。
事件驱动(Event-Driven job):在一个事件或另一个进程后,该进程启动。
周期型(periodic job) :在每时或每天,定时执行的进程。
删除型(deleting job): 为删除系统中盈余的数据的进程,可能会执行较长时间,需要在
后台进行。
进程的属性:
Job name:进程的名最长为32字符。
Job count:为了去该进程在系统中的唯一性。比如周期性进程的名都是一样的,
Job name+Job count就能确定其的唯一性。
Step:在该进程内中定义的程序数量。
Start data:启动的时间点有:立即(immediatlly),指定时间(data/time),
时间(event)…等等。
Job owner:产生该进程的用户。
Job class:该进程在系统中的执行等级。
Client:决定该进程在哪个Client中执行,有些系统进程必须在Client000中执行。
Target sever:决定该进程在那个服务器中执行,这有助于合理的分配系统资源
进程状态:
Planned:进程已经被定义,但是还没有开始。
Release:进程已经开始,但是进程中定义的程序还没有被执行。
Ready: 进程已经开始,所有程序开始的条件(启动时间)也已满足,等候系统分配运行资源
(运行所需的后台进程处理单元<BTC-WP>)。
Active: 进程开始,而且定义的每一个程序(STEP)都被按序执行。
Finished: 进程顺利完成。
Cancelled:因为错误,进程没有正常完成。
各个进程的关系:
Planned <> Release > Ready -> Active --> finished or Cancelled
执行后台进程的方法:
事务执行命令(transaction code):
SM36,SM37, SA38
ABAP 程序:
SAP系统程序或客户自定义的程序。
外部程序或工具:
外部工具(第三方)通过BAPI-XBP接口,从外部定义执行后台进程。
后台进程相关的系统表:
TBTCO: 存放后台进程所有的信息和状态。
TBTCP:存放后台进程中定义程序的信息。
TBTCS: 时间驱动进程相关的信息。
BTCEVTJOB:事件驱动进程相关的信息。
后台进程的日志(joblog):
日志存放在文件系统(其是TemSe子系统)中,列如:/usr/sap/<sid>/sys/global/001joblg…
一般的问题处理:
问题1: 后台进程没有启动。
原因1:系统没有足够的资源。可以用T-cd:Sm51,Rz04,SM66,Sm37确认。
原因2:进程调度(Scheduler)没有运行。T-cd:Sm61确认。
原因3:无法生产日志,用Sm21确认系统日志,和ST11确认developer trace。
可能是有TemSe不整合或有OS文件的访问问题。
原因4:TCTCO,TCTCP…等一系列表之间的不整合;用SM65->Goto->Additional test->
选择:Perform TemSe check
Consistency check DB Table
Remove inconsistencies
->执行
问题2:后台进程在执行的过程中,发生互锁。
原因1:确认应用程序的逻辑,一般情况下这个问题都是有应用程序本身导致的。
原因2:数据库的原因,但是这样的情况较少。
原因3:两个周期进程,间隔时间太短,以至于第一个还没有执行完,第二个已开始执行。
建议·: 根据note-16083中的说明,设定标准进程,以减少系统负担和数据盈余。
From <http://www.cnblogs.com/t-bug/archive/2012/05/07/2487081.html>
参考程序
2014年8月14日
13:42
FORM create_job .
CONCATENATE sy-repid 'DIS' sy-datum sy-uzeit INTO memres.
DATA:
lv_job_name TYPE tbtcjob-jobname,
lv_job_count TYPE tbtcjob-jobcount.
* 启动Background Job
CONCATENATE sy-repid '_' sy-datum sy-uzeit INTO lv_job_name.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_job_name
IMPORTING
jobcount = lv_job_count
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE '后台运行出错' TYPE 'S'.
ENDIF.
* 提交后台的报表
SUBMIT zppr022
WITH s_matnr IN s_matnr
WITH p_werks = p_werks
WITH s_dispo IN s_dispo
WITH s_aufnr IN s_aufnr
WITH p_date = p_date
WITH sh_only = sh_only
WITH p_bgjob = p_bgjob
WITH memres = memres
USER sy-uname
VIA JOB lv_job_name
NUMBER lv_job_count
AND RETURN.
IF sy-subrc <> 0.
MESSAGE '后台运行错误' TYPE 'S'.
RETURN.
ELSE.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_job_count
jobname = lv_job_name
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
invalid_target = 8
OTHERS = 9.
IF sy-subrc <> 0.
MESSAGE '后台运行出错' TYPE 'S'.
RETURN.
ENDIF.
ENDIF.
*- 检测JOB运行状态
DATA: status_according_to_db TYPE tbtcjob-status,
actual_status TYPE tbtcjob-status.
DATA: ld_exit TYPE flag.
DO 100 TIMES.
CALL FUNCTION 'BP_JOB_CHECKSTATE'
EXPORTING
dialog = 'N'
jobname = lv_job_name
jobcount = lv_job_count
* START_ASAP = 'X'
IMPORTING
status_according_to_db = status_according_to_db
actual_status = actual_status
EXCEPTIONS
job_does_not_exist = 1
no_check_privilege_given = 2
ready_switch_too_dangerous = 3
OTHERS = 99.
IF 'AF' CS actual_status AND actual_status <> ''.
ld_exit = 'X'.
EXIT. "--->>> EXIT
ELSE.
WAIT UP TO 10 SECONDS.
ENDIF.
ENDDO.
IF ld_exit = 'X'.
IMPORT r = gt_dis[] FROM DATABASE indx(hk) ID memres.
DELETE FROM DATABASE indx(hk) ID memres.
ENDIF.
ENDFORM. " CREATE_JOB
执行结果
2014年12月24日
10:13
除了sm36定义后台任务
也可以在程序界面添加到后台任务
还可以通过在程序中通过代码创建JOB
(如果要等待JOB执行完成 : 监控程序
万一JOB超时
调用者会不会超时
SAP的超时的定义是怎样的
ALV的SET_FUNCTION_CODE
能否让SAP认为当前的这个session
处于活动?
)
关于后台任务的执行结果:
- 放在cluster table 中 例如 indx
- 放在自定义透明表中
- 放在文件中
跟随事件触发
2014年12月24日
13:18
SM62中定义事件
Sm36定义JOB的时候 选择after event
其他一些触发的方式:
1.在程序中 菜单中选择后台执行
2.SA38
另外可以通过在普通的report中
触发预定义的事件
达到触发后台任务的目的
BP_EVENT_RAISE
默认的执行结果
2015年1月28日
8:54
对于ALV输出
write的结果
后台执行在spool list中可以查看到
显示list的内容时
可能因为打印任务中的格式
导致超过255 col的数据无法输出
解决方案
另外,
note的解释通过 自定义格式之类的来解决
浙公网安备 33010602011771号