在一些日常业务中,总有一些长时间处理的任务,系统运行这些任务需要一晚甚至一个周末。
这就需要后台运行单元(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
处于活动?
? ?
)
? ?
关于后台任务的执行结果:
? ?
跟随事件触发
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的解释通过 自定义格式之类的来解决
? ?
原文:http://www.cnblogs.com/rootbin/p/4463246.html