В статье будут рассмотрены примеры создания фоновых заданий в ABAP используя классы из пакета SBTJOBAPI (CL_BP_ABAP_JOB, CL_BP_JOB_FACTORY и др.). Как управлять фоновыми заданиями используя «старое» API вы можете посмотреть тут. Старое в кавычках потому что новое лишь обертка над ним.
Стандартный пример по работе через классы с фоновыми заданиями программа: BP_JOBAPI_TUTORIAL. К сожалению в нем не рассмотрено как создавать фоновые задания с несколькими шагами, об этом я расскажу во второй части статьи.
И так, в стандартной транзакции по определению фоновых заданий в окне создания шага мы можем создать 1 из 3 видов шагов:
Типы шагов
На уровне классов за определение каждого из типа шагов отвечают классы:
- Запуск ABAP программ — CL_BP_ABAP_JOB
- Запуск команд — CL_BP_EXTCMD_JOB
- Запуск внешних программ — CL_BP_EXTPRG_JOB
- MAKE_ABAP_JOB( ) для создания объекта CL_BP_ABAP_JOB
- MAKE_EXTCMD_JOB( ) для создания объекта CL_BP_EXTCMD_JOB
- MAKE_EXTPRG_JOB( ) для создания объекта CL_BP_EXTPRG_JOB
Разница между ними и простым CREATE OBJECT в том что они задают тип для задачи и устанавливают состояние в редактируемое.
Последовательность действий для создания фонового задания состоящего из одного шага и выполняемого немедленно:
- Определиться с видом выполняемой задачи
- Создать экземпляр класса определяющего ее вид
- Задать основные параметры для задачи (Тип, Имя, Пользователь, Язык)
- Задать специфичные от вида задачи параметры (Отчёт, вариант, и т.п.)
- Запустить задачу на выполнение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DATA: lo_abapjob TYPE REF TO CL_BP_ABAP_JOB. lo_abapjob = cl_bp_job_factory=>MAKE_ABAP_JOB( ). " Устанавливаем имя для фонового задания lo_abapjob->set_name( i_name = 'ZTESTJOB' ). " Определяем шаг запуска ABAP отчёта lo_abapjob->set_report( i_report = 'ZMMTEST' ). " Вариант с которым он будет запущен lo_abapjob->set_variant( i_variant = 'TEST' ). " Под каким пользователем он будет выполнен lo_abapjob->set_effective_user( i_authcknam = sy-uname ). " Под каким языком lo_abapjob->set_language( i_language = sy-langu ). " Запускаем к немедленному выполнению lo_abapjob->start( ). |
После запуска если параметры шага указаны верно будет создана и запущена на выполнение фоновая задача. Для других типов задач код будет аналогичным за исключением заполнения специфичных для них параметров. В случае когда необходимо не запускать, а оставить задание в состоянии «запланировано» можно воспользоваться методом plan_job( ).
Триггеры
Под триггерами понимаются условия запуска, в стандартном определении задания это выглядит следующим образом:
На уровне классов за определение каждого из типа триггера отвечают следующие классы:
-
- После события — cl_tc_evt_trigger
- Дата/время — cl_tc_date_trigger
- При режиме работы — cl_tc_opmode_trigger
- Для запуска немедленно триггера нет (см. пример выше)
- Для запуска по рабочему календарю — cl_tc_onworkday_trigger
- После задания — cl_tc_afterjob_trigger
- Для запуска с периодичностью триггера нет (Пример создания такого задания будет рассмотрен во второй части статьи)
По аналогии с классами определяющими типы задач рекомендуется для создания триггеров использовать класс cl_tc_trigger_factory и его статические методы:
- MAKE_OPMODE_TRIGGER — триггер для режима работы
- MAKE_EVENT_TRIGGER — триггер после события
- MAKE_DATE_TRIGGER — триггер даты/времени
- MAKE_ONWORKDAY_TRIGGER — триггер по рабочему календарю
- для триггера запускающегося после задания нет подходящего метода (первый привет индусам), его необходимо создавать с помощью CREATE OBJECT.
Далее простой пример как прицепить к предыдущему заданию триггер на дату и запустить его:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
DATA: lo_abapjob TYPE REF TO CL_BP_ABAP_JOB, lo_date_tr TYPE REF TO CL_TC_DATE_TRIGGER, lv_time TYPE TIMS. lo_abapjob = cl_bp_job_factory=>MAKE_ABAP_JOB( ). " Устанавливаем имя для фонового задания lo_abapjob->set_name( i_name = 'ZTESTJOB' ). " Определяем шаг запуска ABAP отчёта lo_abapjob->set_report( i_report = 'ZMM_QM_TRANS' ). " Вариант с которым он будет запущен lo_abapjob->set_variant( i_variant = 'TEST' ). " Под каким пользователем он будет выполнен lo_abapjob->set_effective_user( i_authcknam = sy-uname ). " Под каким языком lo_abapjob->set_language( i_language = sy-langu ). " Создаем триггер даты/времени lo_date_tr = cl_tc_trigger_factory=>make_date_trigger( ). " Дата запуска текущая дата lo_date_tr->SET_SDLSTRTDT( sy-datum ). " Время запуска установим на минуту позже текущего lv_time = sy-uzeit + 60. lo_date_tr->SET_SDLSTRTTM( lv_time ). " Подключим триггер к теущей задаче lo_abapjob->attach_trigger( i_trigger = lo_date_tr ). " Запускаем с триггером lo_abapjob->release_job( i_trg_obj = lo_date_tr ). |
Остальные триггеры прицепляются аналогично, за исключением заполняемых параметров.
Получатели спула
Определить получателя спула можно только для заданий выполняемых вместе с триггером (Второй привет индусам). Выглядит это примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
DATA: lv_recipient TYPE SWOTOBJID. " Определяем в качестве получателя спула текущего пользователя CALL FUNCTION 'CREATE_SENDER_OBJECT_PPF' EXPORTING ip_sender = sy-uname IMPORTING ep_sender_id = lv_recipient EXCEPTIONS invalid_sender = 1 OTHERS = 2. " Определяем получателя спула. lo_abapjob->SET_SPOLIST_RECIPIENT( i_recipient = lv_recipient ). " Запускаем с триггером lo_abapjob->RELEASE_JOB( i_trg_obj = lo_date_tr ). |