Ну функция там не одна, там в группе функций
BTCH, много чего интересного есть... но если нужно быстро запланировать и выполнить фоновое задание из программы, то сделать это можно используя следующие ФМ.
JOB_OPEN - Создать фоновое задание
JOB_CLOSE - Завершить формирование задания и далее оно по заданным условиям пойдет работать.
В общем виде на скорую руку, программа планирует выполнение отчета
MB51 - Документы движения материала, в фоне по дате запуска.
DATA: l_jobname LIKE tbtcjob-jobname,
l_jobcount LIKE tbtcjob-jobcount,
l_ret TYPE i,
l_datestart LIKE sy-datum, "Дата старта задания
l_timestart LIKE tbtcjob-sdlstrttm, "Время старта
l_job_was_released LIKE btch0000-char1.
RANGES: r_werks FOR mseg-werks.
CONCATENATE 'MY_JOB' sy-datum sy-uzeit INTO l_jobname
SEPARATED BY '_'.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
delanfrep = ' '
jobgroup = ' '
jobname = l_jobname
* SDLSTRTDT = NO_DATE
* SDLSTRTTM = NO_TIME
* JOBCLASS =
IMPORTING
jobcount = l_jobcount
CHANGING
ret = l_ret
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
CLEAR: r_werks, r_werks[].
r_werks-low = '1000'. r_werks-option = 'I'. APPEND r_werks.
SUBMIT rm07docs
WITH werks IN r_werks
USER sy-uname VIA JOB l_jobname NUMBER l_jobcount
AND RETURN.
l_datestart = sy-datum. "Дата старта задания
l_timestart = sy-uzeit + 10. "Время старта
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
* AT_OPMODE = ' '
* AT_OPMODE_PERIODIC = ' '
* CALENDAR_ID = ' '
* EVENT_ID = ' '
* EVENT_PARAM = ' '
* EVENT_PERIODIC = ' '
jobcount = l_jobcount
jobname = l_jobname
* LASTSTRTDT = NO_DATE
* LASTSTRTTM = NO_TIME
* PRDDAYS = 0
* PRDHOURS = 0
* PRDMINS = 0
* PRDMONTHS = 0
* PRDWEEKS = 0
* PREDJOB_CHECKSTAT = ' '
* PRED_JOBCOUNT = ' '
* PRED_JOBNAME = ' '
sdlstrtdt = l_datestart
sdlstrttm = l_timestart
* STARTDATE_RESTRICTION = BTC_PROCESS_ALWAYS
* STRTIMMED = ' '
* TARGETSYSTEM = ' '
* START_ON_WORKDAY_NOT_BEFORE = SY-DATUM
* START_ON_WORKDAY_NR = 0
* WORKDAY_COUNT_DIRECTION = 0
* RECIPIENT_OBJ =
* TARGETSERVER = ' '
* DONT_RELEASE = ' '
IMPORTING
job_was_released = l_job_was_released
CHANGING
ret = l_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
OTHERS = 8.
Параметры
JOB_OPENdelanfrep = Если поставить Х, то задание будет удалено из списка после успешного выполнения, т.е. через SM37 задание будет не видно.
jobgroup - Имя группы задания, типа позволяет сгруппировать несколько заданий
jobname - Имя задания, ну тут полностью ваше творчество как оно будет называться, опять же уникальность имени не обязательно должно соблюдаться.
SDLSTRTDT - Параметр не используется
SDLSTRTTM - Параметр не используется
JOBCLASS - Типа классификация заданий, сам не крутил сказать, что и как не знаю, не испльзовал.
jobcount - Собственно говоря это и есть уникальный идентификатор задания, который вам сообщит система и на которое потом и будем ссылаться в последующих функциях.
ret - Типа поле расширенного сообщения об ошибке, если создание было не выполнено и sy-subrc не нулевое, то тут типа дополнительная диагностическая информация.
Параметры
JOB_CLOSE, тут большинство полей становится ясным, если вы занимались планированием заданий в диалоге.
AT_OPMODE - Типа задание стартует... ну судя из кода по событию при этом событие будет параметризированым и собственно говоря в этом поле и можно задать строку параметров.
AT_OPMODE_PERIODIC - Задание будет выполняться периодически, флаг имеет смысл только если задан параметр AT_OPMODE
CALENDAR_ID - Календарь, собственно по нему система определяет рабочие/праздничные дни и можно настроить типа ситуацию когда задние не будет выполняться по выходным дням. Само собой для этого надо и задать код производственного календаря.
EVENT_ID - Задание будет выполняться по событию, тут надо задать имя события.
EVENT_PARAM - Параметры события
EVENT_PERIODIC - Задание будет выполняться периодически.
jobcount - Собственно сам номер задания, который вернула функция JOB_OPEN
jobname - Имя задания, должно быть тоже что передавалось в JOB_OPEN
LASTSTRTDT - Не стартовать после заданной в этом поле даты
LASTSTRTTM - Не стартовать после заданного в этом поле времени. Ну в общем-то типа если задание например до 18:00 не стартовало, то типа не очень то уже и надо.
Далее параметры имеют смысл, для периодически выполняемых заданий
PRDDAYS - Выполняться через заданное количество дней
PRDHOURS - Аналогично часов
PRDMINS - Минут
PRDMONTHS - Месяцев
PRDWEEKS - Недель
PREDJOB_CHECKSTAT - Если задано что задание должно стартовать после какого-то другого задания, то установив в этом поле X, * PRED_JOBCOUNT - Внутренний код/номер задания
PRED_JOBNAME - Имя предыдущего задания
sdlstrtdt - Задание должно стартовать в заданную дату
sdlstrttm - И заданное время
STARTDATE_RESTRICTION = BTC_PROCESS_ALWAYS - Ограничения по дате старта задания, никогда не использовал это поле, оно похоже завязано как-то на рабочий календарь который задается выше.
STRTIMMED - Запустить задание немедленно.
TARGETSYSTEM - Имя целевой системы, где должно выполняться задание.
START_ON_WORKDAY_NOT_BEFORE - Типа работать только по рабочим дням, само собой дни берутся из производственного календаря.
START_ON_WORKDAY_NR - Не использовал, не знаю.
WORKDAY_COUNT_DIRECTION - Аналогично... кому надо разбирайтесь.
RECIPIENT_OBJ - Объект кому будет отправлен супл, тип поля SWOTOBJID, а там можно например задать внутреннего пользователя системы который будет получать спулы или вообще внешний E-Mail если надо отправить данные за пределы системы.
TARGETSERVER - Сервер где будет работать задание.
DONT_RELEASE - Задание только запланировать но не деблокировать. В принципе предполагается, что деблокирование будет сделано в ручном режиме, например через SM37.
Теперь что касается порядка параметров выполнения, т.е. например задали дату + время выполнения задания + типа стартовать после события. На самом деле из кода ясно, что система отреагирует в этом случае именно на дату выполнения, а поле выполнять после события будет проигнорировано. Последовательность читается из кода:
if start_on_workday_nr ne 0.
* 1 - Приоритет по календарю
elseif sdlstrtdt ne no_date.
* 2 - Заданная дата
elseif strtimmed eq 'X'.
* 3 - Флаг выполнить немедленно
elseif event_id ne space.
* 4 - Стартовать после события
elseif pred_jobname ne space.
* 5 - Стартовать после задания
elseif at_opmode ne space.
* 6 - После задания используя эту at_opmode
endif.
Т.е. выходит если задана дата, то флаг стартовать немедленно будет проигнорирован и т.д. в общем вот так вот это было написано и как-то все таки работает