該程序在運行時會創建一個JOB,並且將該自己以JOB后台方式運行,並且可以從前台傳遞參數到后台JOB
REPORT ymais_sust.
TABLES vbap.
PARAMETERS: p_back .
SELECT-OPTIONS: s_vbeln FOR vbap-vbeln .
DATA: l_number TYPE tbtcjob-jobcount,
l_name TYPE tbtcjob-jobname .
DATA: run_flg."當前程序是否已在后台運行過了
l_name = sy-repid."當前程序名
START-OF-SELECTION.
DATA: c_tmp(20).
DATA:l_jobcount TYPE tbtcm-jobcount,
l_jobname TYPE tbtcm-jobname.
"如果當前程序是在后台運行時,從SAP內存中讀取前台共享的參數
IF sy-batch IS NOT INITIAL.
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'"獲取當前后台Job名與Job編號
IMPORTING
jobcount = l_jobcount
jobname = l_jobname.
CONCATENATE 'YMAIS_SUST' l_jobcount INTO c_tmp RESPECTING BLANKS.
"讀取從前台傳遞過來的參數
IMPORT run_flg FROM SHARED BUFFER indx(fi) ID c_tmp.
IF sy-subrc <> 0.
MESSAGE e001(00) WITH 'import data unsuccessful'.
ELSE.
"所有輸出的 message 可以在假脫機日志里看到
MESSAGE i001(00) WITH '從前台讀取來的值 run_flg = ' run_flg.
"共享內存使用后即時刪除,否則要等到服務器重啟再消失
DELETE FROM SHARED BUFFER indx(fi) ID c_tmp.
ENDIF.
ELSE."如果是通過前台運行時
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = l_name
IMPORTING
jobcount = l_number
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
"直接采用 SUBMIT 的方式,讓報表程序在后台運行
SUBMIT ymais_sust
WITH p_back = p_back"Paramters參數
WITH s_vbeln IN s_vbeln"Selection-option參數
* WITH s_bukrs BETWEEN '1106' AND '1111' SIGN 'I'"如果Selection-option只有一行時,可以這樣使用,如果是單個值,還可以這樣使用:
* WITH bukrs eq '1106' SIGN 'I'
VIA JOB l_name NUMBER l_number AND RETURN.
"由於 Shared Buffer是整個服務器都可以共享的,所以每個后台Job需要自己的 Buffer,所以
"使用各自Job的編號來區分。該方式用來在前台程序與后台Job之間傳遞參數
CONCATENATE 'YMAIS_SUST' l_number INTO c_tmp RESPECTING BLANKS.
EXPORT run_flg FROM 'X' TO SHARED BUFFER indx(fi) ID c_tmp.
"也可以通過下面標准函數來提交Job,但此標准函數不能直接將前台參數傳遞給后台Job程序(除通過變式
"參數 VARIANT 外)。所以只能采用上面 EXPORT ... SHARED BUFFER 語句來共享服務器內存來實現
* CALL FUNCTION 'JOB_SUBMIT'
* EXPORTING
* authcknam = sy-uname
* jobcount = l_number
* jobname = l_name
** PRIPARAMS = ' '打印參數
* report = 'YMAIS_SUST'
** VARIANT = ' '可通過變式來傳遞參數
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = l_number
jobname = l_name
strtimmed = 'X'.
ENDIF.
ENDIF.
END-OF-SELECTION.
"如果當前程序是在后台運行時
IF sy-batch IS NOT INITIAL.
"會輸出到假脫機輸出列表中
WRITE: / '后台輸出'.
"后面還可以寫在后台運行時需要執行的代碼邏輯及輸出
......
ELSE.
MESSAGE '當前程序已經通過后台運行' TYPE 'I'.
LEAVE PROGRAM.
ENDIF.