ABAP实现后台JOB

1、 关于后台JOB

简单来说,后台JOB就是在SAP应用服务器后台异步运行的ABAP程序(或程序步骤集合)。它与你在SAP GUI中直接运行程序(前台运行)有本质区别:

  1. 异步执行: 提交JOB后,会话可以立即释放去做其他事情,无需等待JOB完成。

  2. 独立于用户会话: JOB运行在专用的后台工作进程上,与任何具体用户的登录状态无关。即使用户退出系统,JOB也能继续运行。

  3. 计划性: JOB可以设定具体的开始时间(立即、某个具体日期时间、定期重复)和运行条件(如某个前置JOB成功结束后)。

  4. 资源管理: SAP系统有专门的后台作业调度器来管理和分配后台工作进程资源。

  5. 结果监控: 可以方便地查看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.
"--------------------@斌将军--------------------

运行则弹出消息

image

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.
"--------------------@斌将军--------------------

运行结果

image

2.2、带变式的调用

为被调程序设置变式

image

打开和关闭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的介绍

定期更文,欢迎关注

posted @ 2025-07-30 19:01  斌将军  阅读(492)  评论(0)    收藏  举报