有时候,处理某个功能,需要通过异步来执行。相对需要实时,但又不需要很实时,那可以考虑背景执行。以下是曾经某个项目上的真实案例。
REPORT ZPP_XXX_01.
DATA:C_VARIANT LIKE RALDB-VARIANT VALUE 'ZPP_XXX_TASK',
C_REPID LIKE SY-REPID VALUE 'ZPP_XXX',
C_UNAME LIKE SY-UNAME VALUE 'igor_admin'.
DATA:I_VALUTAB LIKE RSPARAMS OCCURS 0 WITH HEADER LINE ,
I_OBJECTS LIKE VANZ OCCURS 0 WITH HEADER LINE,
W_VARID_DESC LIKE VARID,
W_JOB LIKE TBTCJOB.
FORM CALL_BACK_MO_JOB TABLES TX_AUFNR STRUCTURE RNG_AUFNR.
IF TX_AUFNR[] IS NOT INITIAL.
CALL FUNCTION 'RS_VARIANT_CONTENTS'
EXPORTING
REPORT = C_REPID
VARIANT = C_VARIANT
TABLES
VALUTAB = I_VALUTAB
OBJECTS = I_OBJECTS
EXCEPTIONS
VARIANT_NON_EXISTENT = 01
VARIANT_OBSOLETE = 02
OTHERS = 03.
CLEAR I_VALUTAB[].
LOOP AT TX_AUFNR.
CLEAR I_VALUTAB.
I_VALUTAB-SELNAME = 'S_AUFNR'.
I_VALUTAB-KIND = 'S' .
I_VALUTAB-SIGN = TX_AUFNR-SIGN.
I_VALUTAB-OPTION = TX_AUFNR-OPTION.
I_VALUTAB-LOW = TX_AUFNR-LOW.
I_VALUTAB-HIGH = TX_AUFNR-HIGH.
APPEND I_VALUTAB.
ENDLOOP.
CLEAR I_VALUTAB.
I_VALUTAB-SELNAME = 'S_ERDAT'.
I_VALUTAB-KIND = 'S' .
I_VALUTAB-SIGN = 'I'.
I_VALUTAB-OPTION = 'EQ'.
I_VALUTAB-LOW = SY-DATUM.
I_VALUTAB-HIGH = ''.
APPEND I_VALUTAB.
CLEAR I_VALUTAB.
I_VALUTAB-SELNAME = 'R_JS'.
I_VALUTAB-KIND = 'P' .
I_VALUTAB-SIGN = ''.
I_VALUTAB-OPTION = ''.
I_VALUTAB-LOW = 'X'.
I_VALUTAB-HIGH = ''.
APPEND I_VALUTAB.
W_VARID_DESC-MANDT = SY-MANDT.
W_VARID_DESC-REPORT = C_REPID.
W_VARID_DESC-VARIANT = C_VARIANT.
CALL FUNCTION 'RS_CHANGE_CREATED_VARIANT'
EXPORTING
CURR_REPORT = C_REPID
CURR_VARIANT = C_VARIANT
VARI_DESC = W_VARID_DESC
TABLES
VARI_CONTENTS = I_VALUTAB
OBJECTS = I_OBJECTS
EXCEPTIONS
ILLEGAL_REPORT_OR_VARIANT = 01
ILLEGAL_VARIANTNAME = 02
NOT_AUTHORIZED = 03
NOT_EXECUTED = 04
REPORT_NOT_EXISTENT = 05
REPORT_NOT_SUPPLIED = 06
VARIANT_DOESNT_EXIST = 07
VARIANT_LOCKED = 08
SELECTIONS_NO_MATCH = 09
others = 10.
WAIT UP TO 1 SECONDS.
W_JOB-JOBNAME = C_VARIANT.
*--------------------------------------------------------------
"定义后台作业
*--------------------------------------------------------------
CALL FUNCTION 'JOB_OPEN'
EXPORTING
JOBNAME = W_JOB-JOBNAME
JOBCLASS = 'B'
SDLSTRTDT = SY-DATUM
SDLSTRTTM = SY-UZEIT
IMPORTING
JOBCOUNT = W_JOB-JOBCOUNT
EXCEPTIONS
CANT_CREATE_JOB = 01
INVALID_JOB_DATA = 02
JOBNAME_MISSING = 03.
*--------------------------------------------------------------
"提交后台作业
*--------------------------------------------------------------
IF SY-SUBRC EQ 0.
CALL FUNCTION 'JOB_SUBMIT'
EXPORTING
AUTHCKNAM = C_UNAME
JOBCOUNT = W_JOB-JOBCOUNT
JOBNAME = W_JOB-JOBNAME
REPORT = C_REPID
VARIANT = C_VARIANT
EXCEPTIONS
BAD_PRIPARAMS = 01
BAD_XPGFLAGS = 02
INVALID_JOBDATA = 03
JOBNAME_MISSING = 04
JOB_NOTEX = 05
JOB_SUBMIT_FAILED = 06
LOCK_FAILED = 07
PROGRAM_MISSING = 08
PROG_ABAP_AND_EXTPG_SET = 09
OTHERS = 10.
ENDIF.
*--------------------------------------------------------------
"释放后台作业,立即执行
*--------------------------------------------------------------
IF SY-SUBRC EQ 0.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
JOBCOUNT = W_JOB-JOBCOUNT
JOBNAME = W_JOB-JOBNAME
STRTIMMED = 'X'
EXCEPTIONS
CANT_START_IMMEDIATE = 01
INVALID_STARTDATE = 02
JOBNAME_MISSING = 03
JOB_CLOSE_FAILED = 04
JOB_NOSTEPS = 05
JOB_NOTEX = 06
LOCK_FAILED = 07
INVALID_TARGET = 08.
ENDIF.
ENDIF.
ENDFORM.