rootbin

总是很懒,写不来博客,最近发现可以从onenote同步到博客园,虽然格式丑点,勉强算写博客了吧,可能以后都不干abap,权当纪念一下.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

后台运行

Posted on 2015-04-28 15:59  rootbin  阅读(413)  评论(0)    收藏  举报

在一些日常业务中,总有一些长时间处理的任务,系统运行这些任务需要一晚甚至一个周末。

这就需要后台运行单元(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):

           SM36SM37 SA38

  ABAP 程序:

           SAP系统程序或客户自定义的程序。

外部程序或工具:

         外部工具(第三方)通过BAPI-XBP接口,从外部定义执行后台进程。

后台进程相关的系统表:

TBTCO:   存放后台进程所有的信息和状态。

TBTCP:存放后台进程中定义程序的信息。

TBTCS:    时间驱动进程相关的信息。

BTCEVTJOB:事件驱动进程相关的信息。

后台进程的日志(joblog):

日志存放在文件系统(其是TemSe子系统)中,列如:/usr/sap/<sid>/sys/global/001joblg…

    

一般的问题处理:

问题1  后台进程没有启动。

原因1:系统没有足够的资源。可以用T-cdSm51Rz04SM66Sm37确认。

 原因2:进程调度(Scheduler)没有运行。T-cd:Sm61确认。

原因3:无法生产日志,用Sm21确认系统日志,和ST11确认developer trace

                   可能是有TemSe不整合或有OS文件的访问问题。

原因4TCTCOTCTCP…等一系列表之间的不整合;用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运行状态

  DATAstatus_according_to_db TYPE tbtcjob-status,

        actual_status TYPE tbtcjob-status.

  DATAld_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 gt_dis[] FROM DATABASE indx(hkID memres.

    DELETE FROM DATABASE indx(hkID memres.

  ENDIF.

   

ENDFORM.                    " CREATE_JOB

   

执行结果

2014年12月24日

10:13

   

除了sm36定义后台任务

也可以在程序界面添加到后台任务

还可以通过在程序中通过代码创建JOB

(如果要等待JOB执行完成 : 监控程序

万一JOB超时

调用者会不会超时

SAP的超时的定义是怎样的

   

ALV的SET_FUNCTION_CODE

能否让SAP认为当前的这个session

处于活动?

   

)

   

关于后台任务的执行结果:

  1. 放在cluster table 中 例如 indx
  2. 放在自定义透明表中
  3. 放在文件中

   

跟随事件触发

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的解释通过 自定义格式之类的来解决

   



亲爱的P.I.G 你应该是不会到这里来的吧 ? I'm always 怀挺!