У меня для этих целей написан ФМ
Code:
FUNCTION z_job_submit.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(I_IMMEDIATE) TYPE C
*" VALUE(I_REPID) TYPE PROGRAM
*" VALUE(I_SERVER_CHOOSE) TYPE C OPTIONAL
*" EXCEPTIONS
*" REPORT_DOES_NOT_EXIST
*" PROGRAM_IS_NOT_EXECUTA
*" CANT_CREATE_JOB
*" INVALID_JOB_DATA
*" JOBNAME_MISSING
*" SEL_SCREEEN_DOES_NOT_EXIST
*"----------------------------------------------------------------------
PERFORM check_report USING i_repid
l_exists
l_exec.
IF l_exists <> 'X'.
RAISE report_does_not_exist.
ENDIF.
IF l_exec <> 'X'.
RAISE program_is_not_executable.
ENDIF.
*получаем селекционный экран из запущенной программы
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = i_repid
* IMPORTING
* SP =
TABLES
selection_table = it_rsparams[]
EXCEPTIONS
not_found = 1
no_report = 2
OTHERS = 3
.
CASE sy-subrc.
WHEN1.
RAISE sel_screeen_does_not_exist.
WHEN 3.
RAISE others.
ENDCASE.
*Выбор сервера приложений
IF i_server_choose = 'X'.
CLEAR: selected_server, target_system.
PERFORM get_btc_systems USING rc.
IF rc = 0.
FREE btc_sys_srv_tbl.
LOOP AT btc_sys_tbl INTO wa_btc_sys_tbl.
wa_btc_sys_srv_tbl-srvname = wa_btc_sys_tbl-instname.
APPEND wa_btc_sys_srv_tbl TO btc_sys_srv_tbl.
ENDLOOP.
FREE field_tbl.
wa_field_tbl-tabname = 'BTCTGTSRVR'.
wa_field_tbl-fieldname = 'SRVNAME'.
wa_field_tbl-selectflag = 'X'.
APPEND wa_field_tbl TO field_tbl.
CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE'
EXPORTING
tabname = wa_field_tbl-tabname
fieldname = wa_field_tbl-fieldname
IMPORTING
select_value = selected_server
TABLES
fields = field_tbl
valuetab = btc_sys_srv_tbl
EXCEPTIONS
OTHERS = 99.
READ TABLE btc_sys_tbl WITH KEY instname = selected_server
INTO wa_serv.
IF sy-subrc = 0.
target_system = wa_serv-btcsystem.
ELSE.
CLEAR: selected_server, target_system.
ENDIF.
ENDIF.
ENDIF.
*ApplServerChoose
* Получаем номер задачи
MOVE i_repid TO l_job.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = l_job
IMPORTING
jobcount = l_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 8.
CASE sy-subrc.
WHEN 1.
RAISE cant_create_job.
WHEN 2.
RAISE invalid_job_data.
WHEN 3.
RAISE jobname_missing.
WHEN 8.
RAISE others.
ENDCASE.
TRANSLATE i_repid TO UPPER CASE.
SUBMIT (i_repid) WITH SELECTION-TABLE it_rsparams
USER sy-uname VIA JOB l_job NUMBER l_jobcount AND RETURN.
* Если запуск отложенный
IF i_immediate IS INITIAL.
* ... то запускаем менеджер планирования задачи
CALL FUNCTION 'BP_START_DATE_EDITOR'
EXPORTING
stdt_dialog = 'Y'
stdt_input = l_startspecs
stdt_opcode = 14
IMPORTING
stdt_modify_type = l_start_modify_flag
stdt_output = l_startspecs
EXCEPTIONS
OTHERS = 1.
IF l_startspecs-startdttyp = 'I'.
* IF l_startspecs-startdttyp = 'X'.
l_start_immediate = 'X'.
ENDIF.
IF i_server_choose = 'X'.
l_startspecs-instname = target_system.
ENDIF.
* и зупускаем фоновое выполнение согласно заданному расписанию
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
at_opmode_periodic = l_startspecs-periodic
calendar_id = l_startspecs-calendarid
event_id = l_startspecs-eventid
event_param = l_startspecs-eventparm
event_periodic = l_startspecs-periodic
jobcount = rsjobinfo-jobnumb
jobname = rsjobinfo-jobname
laststrtdt = l_startspecs-laststrtdt
laststrttm = l_startspecs-laststrttm
prddays = l_startspecs-prddays
prdhours = l_startspecs-prdhours
prdmins = l_startspecs-prdmins
prdmonths = l_startspecs-prdmonths
prdweeks = l_startspecs-prdweeks
predjob_checkstat = l_startspecs-checkstat
pred_jobcount = l_startspecs-predjobcnt
pred_jobname = l_startspecs-predjob
sdlstrtdt = l_startspecs-sdlstrtdt
sdlstrttm = l_startspecs-sdlstrttm
startdate_restriction = l_startspecs-prdbehav
strtimmed = l_start_immediate
targetsystem = l_startspecs-instname
start_on_workday_not_before = l_startspecs-notbefore
start_on_workday_nr = l_startspecs-wdayno
workday_count_direction = l_startspecs-wdaycdir
targetserver = selected_server
EXCEPTIONS
OTHERS = 1.
ELSE.
* ... иначе немедленный запуск фонового выполнения
l_start_immediate = 'X'.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = rsjobinfo-jobnumb
jobname = rsjobinfo-jobname
strtimmed = l_start_immediate
targetsystem = target_system
targetserver = selected_server
EXCEPTIONS
OTHERS = 1.
ENDIF.
MESSAGE ... WITH 'Отчет запущен в фоновом режиме'.
ENDFUNCTION.
Модуль позволяет вызвать стандартный диалог по планированию задачи или пропустить его. А также выбрать сервер приложений, на котором будет крутиться задача.
Пример использования в программе
Code:
REPORT z_job.
TABLES:
bseg.
SELECT-OPTIONS:
so_bukrs FOR bseg-bukrs.
PARAMETERS: p_test(10) TYPE c,
p_job TYPE c AS CHECKBOX,
p_server TYPE c AS CHECKBOX,
p_immed TYPE c AS CHECKBOX.
START-OF-SELECTION.
IF p_job = 'X'.
*Чтобы не зациклить
CLEAR: p_job.
CALL FUNCTION 'Z_JOB_SUBMIT'
EXPORTING
i_immediate = p_immed
i_repid = 'Z_JOB'
i_server_choose = p_server
EXCEPTIONS
report_does_not_exist = 1
program_is_not_executable = 2
cant_create_job = 3
invalid_job_data = 4
jobname_missing = 5
sel_screeen_does_not_exist = 6
OTHERS = 7.
IF sy-subrc <> 0.
WRITE / 'Error'.
ENDIF.
ELSE.
WRITE p_test.
WRITE / p_job.
ENDIF.
Также возможен принудительный запуск только в фоне, если p_job сделать NO-DISPLAY DEFAULT 'X'. Мой способ позволяет с минимальными переделками интегрировать фоновый запуск в любой отчет. Только в таком случае надо учесть, чтобы в обработке экранной логики не было диалогов, типа вызова дополнительных экранов итд, а иначе не дождаться, когда же отчет выполнится
