在ABAP中,我們有時候需要通過ABAP來定義JOB並執行它,也就是說,我們不使用SM36的GUI來創建Job。
自己親身經歷的一個case:我們有一個程序performance“很差”(並不是程序的問題,而是傳遞給其的數據量巨大),也就是說,我們外面有一個程序需要傳遞一個特別”巨大”的XML string流給該程序去解析,然而這個程序耗時也很可觀,在運行時,”貌試”SAP死掉。所以,最後,solution方案就是通過一個ABAP操作Job,當然有數據的傳遞,使用SAP Memory.
一. JOB相關信息
例如,作爲例子,我們需要一個job:去執行ZTEST_JOB_STEP1與ZTEST_JOB_STEP2這兩個ABAP程序。
ZTEST_JOB_STEP1的程序:
REPORT ZTEST_JOB_STEP1.
PARAMETERS: p_user type sy-uname.
write:/ ‘job step 1′.
WRITE:/ ‘Proceed User:’, p_user.
|
其中效果爲:帶有一個variant供我們後面job用。
結果:
ZTEST_JOB_STEP2的程序:
REPORT ZTEST_JOB_STEP2 NO STANDARD PAGE HEADING.
write:/ ‘job step 2′.
|
其中效果爲:
二. 使用ABAP操作JOB
我們的JOB-ABAP代碼實現。
*&———————————————————————*
*& Report ZTEST_ABAP_JOB
*&
*&———————————————————————*
*& test using ABAP to trigger Job and manipulate Job
*&
*&———————————————————————*
REPORT ZTEST_ABAP_JOB.
DATA:
w_jobid type tbtcjob-jobcount,
w_stepnm type TBTCJOB-STEPCOUNT.
PARAMETERS:
p_job_nm type tbtcjob-jobname OBLIGATORY,
p_var_st type raldb-variant.
START-OF-SELECTION.
*1. using JOB_OPEN to open job
clear:w_jobid.
CALL FUNCTION ‘JOB_OPEN’
EXPORTING
* DELANFREP = ’ ’
* JOBGROUP = ’ ’
JOBNAME = p_job_nm
* SDLSTRTDT = NO_DATE
* SDLSTRTTM = NO_TIME
* JOBCLASS =
IMPORTING
JOBCOUNT = w_jobid
* CHANGING
* RET =
EXCEPTIONS
CANT_CREATE_JOB = 1
INVALID_JOB_DATA = 2
JOBNAME_MISSING = 3
OTHERS = 4
.
IF SY-SUBRC <> 0.
write:/ ‘JOB_OPEN faild!’.
else.
write:/ ‘JOB_OPEN Successed!’.
write:/ ‘———–Job Name:’, p_job_nm.
write:/ ‘———–Job Count:’, w_jobid.
ENDIF.
*2. using JOB_SUMMIT to insert step
clear:w_stepnm.
CALL FUNCTION ‘JOB_SUBMIT’
EXPORTING
* ARCPARAMS =
AUTHCKNAM = sy-uname
* COMMANDNAME = ’ ’
* OPERATINGSYSTEM = ’ ’
* EXTPGM_NAME = ’ ’
* EXTPGM_PARAM = ’ ’
* EXTPGM_SET_TRACE_ON = ’ ’
* EXTPGM_STDERR_IN_JOBLOG = ’X’
* EXTPGM_STDOUT_IN_JOBLOG = ’X’
* EXTPGM_SYSTEM = ’ ’
* EXTPGM_RFCDEST = ’ ’
* EXTPGM_WAIT_FOR_TERMINATION = ’X’
JOBCOUNT = w_jobid
JOBNAME = p_job_nm
* LANGUAGE = SY-LANGU
* PRIPARAMS = ’ ’
REPORT = ‘ZTEST_JOB_STEP1′
VARIANT = p_var_st
IMPORTING
STEP_NUMBER = w_stepnm
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.
write:/ ‘JOB_SUBMIT faild!’.
else.
write:/ ‘JOB_SUBMIT Successed!’.
write:/ ‘———–Step:’, w_stepnm.
ENDIF.
clear:w_stepnm.
CALL FUNCTION ‘JOB_SUBMIT’
EXPORTING
* ARCPARAMS =
AUTHCKNAM = sy-uname
* COMMANDNAME = ’ ’
* OPERATINGSYSTEM = ’ ’
* EXTPGM_NAME = ’ ’
* EXTPGM_PARAM = ’ ’
* EXTPGM_SET_TRACE_ON = ’ ’
* EXTPGM_STDERR_IN_JOBLOG = ’X’
* EXTPGM_STDOUT_IN_JOBLOG = ’X’
* EXTPGM_SYSTEM = ’ ’
* EXTPGM_RFCDEST = ’ ’
* EXTPGM_WAIT_FOR_TERMINATION = ’X’
JOBCOUNT = w_jobid
JOBNAME = p_job_nm
* LANGUAGE = SY-LANGU
* PRIPARAMS = ’ ’
REPORT = ‘ZTEST_JOB_STEP2′
* VARIANT =
IMPORTING
STEP_NUMBER = w_stepnm
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.
write:/ ‘JOB_SUBMIT faild!’.
else.
write:/ ‘———–Step:’, w_stepnm.
ENDIF.
*3. using JOB_CLOSE to close job
CALL FUNCTION ‘JOB_CLOSE’
EXPORTING
* AT_OPMODE = ’ ’
* AT_OPMODE_PERIODIC = ’ ’
* CALENDAR_ID = ’ ’
* EVENT_ID = ’ ’
* EVENT_PARAM = ’ ’
* EVENT_PERIODIC = ’ ’
JOBCOUNT = w_jobid
JOBNAME = p_job_nm
* LASTSTRTDT = NO_DATE
* LASTSTRTTM = NO_TIME
* PRDDAYS = 0
* PRDHOURS = 0
* PRDMINS = 0
* PRDMONTHS = 0
* PRDWEEKS = 0
* PREDJOB_CHECKSTAT = ’ ’
* PRED_JOBCOUNT = ’ ’
* PRED_JOBNAME = ’ ’
* SDLSTRTDT = NO_DATE
* SDLSTRTTM = NO_TIME
* STARTDATE_RESTRICTION = BTC_PROCESS_ALWAYS
STRTIMMED = ‘X’
* TARGETSYSTEM = ’ ’
* START_ON_WORKDAY_NOT_BEFORE = SY-DATUM
* START_ON_WORKDAY_NR = 0
* WORKDAY_COUNT_DIRECTION = 0
* RECIPIENT_OBJ =
* TARGETSERVER = ’ ’
* DONT_RELEASE = ’ ’
* TARGETGROUP = ’ ’
* DIRECT_START =
* IMPORTING
* JOB_WAS_RELEASED =
* CHANGING
* RET =
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.
write:/ ‘JOB_CLOSE faild!’.
else.
write:/ ‘JOB_CLOSE Successed!’.
ENDIF.
|
說明:
JOB_OPEN: 意思爲:declare一個JOB並返回這個job的“內存ID”。
JOB_SUBMIT: 意思爲:insert step for job。注意,這裏需要爲每一個step進行submit(如上面是兩個program).
JOB_Close: 意思爲:Release剛創建的job.然後可以在SM37中查看.
然後,我們執行:
最後結果:
然後,我們去SM37中可以check:
可以再看一下spool:
如其中ZTEST_JOB_STEP1的spool :
而ZTEST_JOB_STEP2的spool :