Нестандартный подход при планировании фоновых заданий в системе SAP
В настоящей статье шаг за шагом описан процесс планирования фоновых заданий в исключительных ситуациях на примере системы SAP ECC 6.0 с использованием внешней программы - встроенного планировщика операционной системы Windows Server 2003 R2 x64.
Ключевое понятие
SAPEVT – системная программа окружения SAP, генерирующая в системе события.
Предпосылки
В системе SAP с помощью транзакций SM36, SM37 можно управлять планированием фоновых заданий. В качестве условий запуска можно указать следующие виды: немедленный запуск (Рис. 1), запуск задания в указанную дату и время (Рис. 2), запуск задания после выполнения указанного задания (Рис. 3), запуск задания после возникновения в системе указанного события (Рис. 4), запуск задания при включении указанного режима системы (Рис. 5), запуск задания в определённый рабочий день, нужного производственного календаря (Рис. 6).
Рис. 1. Немедленный запуск задания
Рис. 2. Запуск задания в указанную дату и время
Рис. 3. Запуск задания после выполнения указанного задания
Рис. 4. Запуск задания после возникновения в системе указанного события
Рис. 5. Запуск задания при включении указанного режима работы системы
Рис. 6. Запуск задания в определённый рабочий день указанного производственного календаря
Внизу окна указания срока запуска есть чек-бокс «Выполнять задание периодически», после включения которого нужно указать «Значения периодов».
Первые четыре значения периода интуитивно понятны. Они представлены на Рис. 7:
Рис. 7. Выбор периода выполнения задания
При выборе значения «Другой период» появляется окошко, в котором можно ввести любые значения единиц времени, как показано на Рис. 8:
Рис. 8. Ввод пользовательского периода
В практике администрирования системы SAP ECC 6.0 на нашем предприятии возникла ситуация, когда понадобилось запускать программу в фоновом режиме каждые 2 часа в рабочее время, т.е. с 8 до 17 часов, и только с понедельника по пятницу. Одним из вариантов решения поставленной задачи стало планирование нескольких фоновых заданий с запуском в разное время, и каждое – с интервалом в 1 день. В последующем появлялись новые ситуации, когда возникала необходимость в планировании задания с другими различными интервалами в промежутке с 8 до 17 часов.
Так как нам хотелось, чтобы периодически выполняемая программа планировалась с помощью одного фонового задания, и чтобы их количество не разрасталось в системе, мы придумали следующую схему запуска:
для одной периодически выполняемой программы планировать только одно фоновое задание, которое будет запускаться при возникновении в системе SAP определённого события, а это событие будет вызываться с помощью задания в планировщике Windows.
Ниже описаны основные шаги реализации этой схемы запуска:
- В транзакции SM64 добавьте новое событие фоновой обработки.
- На уровне операционной системы запланируйте задание в планировщике заданий, содержащее строку вызова команды sapevt с необходимыми параметрами.
- В транзакции SM37 запланируйте фоновое задание с типом запуска «При возникновении события».
Шаг 1. Добавление нового события фоновой обработки с помощью транзакции SM64.
В начальном окне клиентской программы SAP Logon в строке ввода команд введите SM64 и нажмите зелёную кнопочку слева, как показано на Рис. 9:
Рис. 9. Ввод кода транзакции SM64
После входа в транзакцию на панели инструментов нажмите на кнопку «Create» («Создать»), как показано на Рис.10:
Рис. 10. Создание события в системе SAP
После нажатия появляется диалоговое окно, в котором введите имя события и его описание, после чего нажмите на кнопку «Save» («Сохранить»), как это показано на Рис. 11:
Рис. 11. Ввод названия и описания события
Шаг 2. Планирование задания на уровне операционной системы для вызова события в окружении системы SAP.
Вызов события следует делать с помощью системной утилиты sapevt на уровне операционной системы.
Для этого зайдите в меню Start (Пуск) – Settings (Настройки) – Control Panel (Панель управления), как показано на Рис. 12:
Рис. 12. Вход в панель управления
Далее нажмите на элемент Sсheduled Tasks (Назначенные задания), как показано на Рис. 13:
Рис. 13. Выбор элемента панели управления “Scheduled Tasks”
В открывшемся окне нажмите на пункт Add Scheduled Task (Добавить задание), как показано на Рис. 14:
Рис. 14. Нажатие на пункт “Add Scheduled Task”
После нажатия откроется «Мастер добавления планируемых заданий», как показано на Рис. 15:
Рис. 15. Запуск мастера добавления планируемых заданий
Нажмите на кнопку Next (Далее). Появится окно выбора программы, которая будет служить основой для задания. Нажмите на кнопку Browse (Просмотр), как показано на Рис. 16:
Рис. 16. Нажатие на кнопку “Browse”
В открывшемся диалоговом окне выберите программуsapevt, которая расположена по пути <drive>:\usr\sap\<sid>\DVEBMGS00\exe\ и нажмите кнопку Open (Открыть), как показано на Рис. 17:
Рис. 17. Выбор программы sapevt.exe
После выбора появится следующее окно, в котором задайте название задания (для удобства можно использовать название события, определённого ранее в транзакции SM64), и условие запуска, после чего нажмите на кнопку Next (Далее), как это показано на Рис. 18:
Рис. 18. Ввод названия задания и выбор периодичности запуска
В следующем окне задайте время и периодичность запуска задания (в нашем случае - один раз в неделю и дни - с понедельника по пятницу), после чего нажмите на кнопку Next (Далее), как это показано на Рис. 19:
Рис.
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти
Обсуждения 11
Комментарий от
Олег Точенюк
| 06 октября 2014, 16:26
Прочитал пару раз, но так и не понял, как параметр который квалифицирует событие, может быть не определенным в системе SAP, и вообще кто кем и чем определяет это дело у вас? Что-то мне кажется что или я или вы немного не поняли что это такое. Это именно параметр, который можно передать при вызове, а зачем считать в абап программе, т.е. если бы вам нужно было например передавать каждый раз при вызове sap-события имя виндовой машины машины которая вызвала событие или путь рабочего каталога или много чего другого, то вы могли бы после ключа -p указать это значение в качестве строки и затем в программе используя:
CALL FUNCTION 'BP_EVENT_RAISE'
EXPORTING
eventid = '<имя события>'
eventparm = eventparm
EXCEPTIONS
bad_eventid = 1
eventid_does_not_exist = 2
eventid_missing = 3
raise_failed = 4
OTHERS = 5.
Получить переданное значение и соответственно дальше уже отработать в зависимости от полученного значения, ну это если у вас программа своя или стандартная которая предполагает какие-то параметры.
PS: Вообще, если честно, не заметил не стандартного подхода к планированию фоновых заданий, все полностью в рамках стандарта. А это, краткая инструкция по использованию консольной утилиты sapevt
Комментарий от
Олег Точенюк
| 06 октября 2014, 16:36
Олег Точенюк 06 октября 2014, 16:26
-p <EVTPRM>: Опциональный аргумент для события EVT, который квалифицирует событие. EVTPRM не определён в системе SAP.
Прочитал пару раз, но так и не понял, как параметр который квалифицирует событие, может быть не определенным в системе SAP, и вообще кто кем и чем определяет это дело у вас? Что-то мне кажется что или я или вы немного не поняли что это такое. Это именно параметр, который можно передать при вызове, а зачем считать в абап программе, т.е. если бы вам нужно было например передавать каждый раз при вызове sap-события имя виндовой машины машины которая вызвала событие или путь рабочего каталога или много чего другого, то вы могли бы после ключа -p указать это значение в качестве строки и затем в программе используя:
CALL FUNCTION 'BP_EVENT_RAISE'
EXPORTING
eventid = '<имя события>'
eventparm = eventparm
EXCEPTIONS
bad_eventid = 1
eventid_does_not_exist = 2
eventid_missing = 3
raise_failed = 4
OTHERS = 5.
Получить переданное значение и соответственно дальше уже отработать в зависимости от полученного значения, ну это если у вас программа своя или стандартная которая предполагает какие-то параметры.
PS: Вообще, если честно, не заметил не стандартного подхода к планированию фоновых заданий, все полностью в рамках стандарта. А это, краткая инструкция по использованию консольной утилиты sapevt
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
IMPORTING
eventid = event_id
eventparm = eventparm
EXCEPTIONS
no_runtime_info = 1
Комментарий от
Андрей Красовский
| 06 октября 2014, 17:26
В статье описано решение такой нехитрой задачи и добавлено описание утилиты sapevt взятое из help.sap.com/saphelp_nw04s/helpdata
И нам действительно не нужно использовать параметр -p.
А если копнуть тему глубже, то у SAP есть свое решение такой задачи и называется оно: SAP Central Process Scheduling by Redwood (SAP CPS). Будем надеяться что и на эту тему в скором времени появится статья.
P.S. Если у вас есть свои варианты решение нашей задачи - будем рады узнать их.
Комментарий от
Андрей Красовский
| 06 октября 2014, 17:34
Андрей Красовский 06 октября 2014, 17:26
Олег, поясняю, суть статьи - решить задачу: "запускать программу в фоновом режиме каждые 2 часа в рабочее время, т.е. с 8 до 17 часов, и только с понедельника по пятницу. ...чтобы периодически выполняемая программа планировалась с помощью ОДНОГО фонового задания".
В статье описано решение такой нехитрой задачи и добавлено описание утилиты sapevt взятое из help.sap.com/saphelp_nw04s/helpdata
И нам действительно не нужно использовать параметр -p.
А если копнуть тему глубже, то у SAP есть свое решение такой задачи и называется оно: SAP Central Process Scheduling by Redwood (SAP CPS). Будем надеяться что и на эту тему в скором времени появится статья.
P.S. Если у вас есть свои варианты решение нашей задачи - будем рады узнать их.
Комментарий от
Олег Точенюк
| 06 октября 2014, 18:18
Андрей Красовский 06 октября 2014, 17:34
"...запускать программу в фоновом режиме..." имеется ввиду ABAP программу или несколько ABAP программ
Комментарий от
Андрей Красовский
| 07 октября 2014, 09:59
Олег Точенюк 06 октября 2014, 18:18
Да какое же у меня решение, небольшая программка на абапе да и всех делов... :-) хоть от фазы луны запускайся, главное до этой самой фазы достучаться.
Комментарий от
Олег Башкатов
| 07 октября 2014, 18:53
Андрей Красовский 07 октября 2014, 09:59
Почему то складывается ощущение, что мы обсуждаем разные темы :-( Вы можете написать любую программу, но объясните, как будет запускаться вами написанная программа с 8-00 до 17-00 каждые 2 часа с понедельника по пятницу?
и вначале программы проверять стоит ли выполнять программу дальше или делать EXIT.
если программа запустилась и видит, что сейчас 18:00, она просто завершает работу.
а если сейчас 12:00 - то продолжает работу.
и, кстати, так можно сделать запуск действительно по рабочим дням, т.е. по рабочим дням согласно производственному календарю (а у Вас по Пон,Вт,Ср,Чт,Пт)
Комментарий от
Олег Точенюк
| 07 октября 2014, 20:48
Олег Башкатов 07 октября 2014, 18:53
Андрей, например, запускать программу каждые два часа.
и вначале программы проверять стоит ли выполнять программу дальше или делать EXIT.
если программа запустилась и видит, что сейчас 18:00, она просто завершает работу.
а если сейчас 12:00 - то продолжает работу.
и, кстати, так можно сделать запуск действительно по рабочим дням, т.е. по рабочим дням согласно производственному календарю (а у Вас по Пон,Вт,Ср,Чт,Пт)
Комментарий от
Вячеслав Шиболов
| 08 октября 2014, 13:20
Олег Точенюк 07 октября 2014, 20:48
Да именно, на селекционном экране можно вообще диапазон времени задать внутри проверить вхождение даты запуска в заданный диапазон времени и дергать ваше событие, которое запустит повешенное на событие программу, там если чуть посидеть денек, то можно вообще универсальную запускалку сделать.
Хотя умение программировать значительно расширяет набор инструментов. :)
Комментарий от
Олег Точенюк
| 09 октября 2014, 00:50
Вячеслав Шиболов 08 октября 2014, 13:20
Мне кажется, что вы решаете задачу с разных позиций: программиста и администратора. У администратора задача найти решение применяя инструменты, имеющиеся в наличии. Ребята просто нашли решение без ABAP-а.
Хотя умение программировать значительно расширяет набор инструментов. :)
PS: С другой стороны, задача решена, решение устраивает, значит все отлично.
Комментарий от
Влад Русаков
| 28 апреля 2015, 17:17