Меню

Нестандартный подход при планировании фоновых заданий в системе 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.

Ниже описаны основные шаги реализации этой схемы запуска:

  1. В транзакции SM64 добавьте новое событие фоновой обработки.
  2. На уровне операционной системы запланируйте задание в планировщике заданий, содержащее строку вызова команды sapevt с необходимыми параметрами.
  3. В транзакции 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

-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

Комментарий от  

Олег Точенюк

  |  06 октября 2014, 16:36

-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

Не тот ФМ скопировал, предыдущий для инициализации события из ABAP-программы:
 
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
     IMPORTING
          eventid         = event_id
          eventparm       = eventparm
     EXCEPTIONS
          no_runtime_info = 1

Комментарий от  

Андрей Красовский

  |  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, 17:34

Олег, поясняю, суть статьи - решить задачу: "запускать программу в фоновом режиме каждые 2 часа в рабочее время, т.е. с 8 до 17 часов, и только с понедельника по пятницу. ...чтобы периодически выполняемая программа планировалась с помощью ОДНОГО фонового задания".
В статье описано решение такой нехитрой задачи и добавлено описание утилиты sapevt взятое из help.sap.com/saphelp_nw04s/helpdata
И нам действительно не нужно использовать параметр -p.
А если копнуть тему глубже, то у SAP есть свое решение такой задачи и называется оно: SAP Central Process Scheduling by Redwood (SAP CPS). Будем надеяться что и на эту тему в скором времени появится статья.
 
P.S. Если у вас есть свои варианты решение нашей задачи - будем рады узнать их.

"...запускать программу в фоновом режиме..." имеется ввиду ABAP программу или несколько ABAP программ

Комментарий от  

Олег Точенюк

  |  06 октября 2014, 18:18

"...запускать программу в фоновом режиме..." имеется ввиду ABAP программу или несколько ABAP программ

Да какое же у меня решение, небольшая программка на абапе да и всех делов... :-) хоть от фазы луны запускайся, главное до этой самой фазы достучаться.

Комментарий от  

Андрей Красовский

  |  07 октября 2014, 09:59

Да какое же у меня решение, небольшая программка на абапе да и всех делов... :-) хоть от фазы луны запускайся, главное до этой самой фазы достучаться.

Почему то складывается ощущение, что мы обсуждаем разные темы :-( Вы можете написать любую программу, но объясните, как будет запускаться вами написанная программа с 8-00 до 17-00 каждые 2 часа с понедельника по пятницу?

Комментарий от  

Олег Башкатов

  |  07 октября 2014, 18:53

Почему то складывается ощущение, что мы обсуждаем разные темы :-( Вы можете написать любую программу, но объясните, как будет запускаться вами написанная программа с 8-00 до 17-00 каждые 2 часа с понедельника по пятницу?

Андрей, например, запускать программу каждые два часа.
и вначале программы проверять стоит ли выполнять программу дальше или делать EXIT.
 
если программа запустилась и видит, что сейчас 18:00, она просто завершает работу.
а если сейчас 12:00 - то продолжает работу.
 
и, кстати, так можно сделать запуск действительно по рабочим дням, т.е. по рабочим дням согласно производственному календарю (а у Вас по Пон,Вт,Ср,Чт,Пт)

Комментарий от  

Олег Точенюк

  |  07 октября 2014, 20:48

Андрей, например, запускать программу каждые два часа.
и вначале программы проверять стоит ли выполнять программу дальше или делать EXIT.
 
если программа запустилась и видит, что сейчас 18:00, она просто завершает работу.
а если сейчас 12:00 - то продолжает работу.
 
и, кстати, так можно сделать запуск действительно по рабочим дням, т.е. по рабочим дням согласно производственному календарю (а у Вас по Пон,Вт,Ср,Чт,Пт)

Да именно, на селекционном экране можно вообще диапазон времени задать внутри проверить вхождение даты запуска в заданный диапазон времени и дергать ваше событие, которое запустит повешенное на событие программу, там если чуть посидеть денек, то можно вообще универсальную запускалку сделать.

Комментарий от  

Вячеслав Шиболов

  |  08 октября 2014, 13:20

Да именно, на селекционном экране можно вообще диапазон времени задать внутри проверить вхождение даты запуска в заданный диапазон времени и дергать ваше событие, которое запустит повешенное на событие программу, там если чуть посидеть денек, то можно вообще универсальную запускалку сделать.

Мне кажется, что вы решаете задачу с разных позиций: программиста и администратора. У администратора задача найти решение применяя инструменты, имеющиеся в наличии. Ребята просто нашли решение без ABAP-а.
 
Хотя умение программировать значительно расширяет набор инструментов. :)

Комментарий от  

Олег Точенюк

  |  09 октября 2014, 00:50

Мне кажется, что вы решаете задачу с разных позиций: программиста и администратора. У администратора задача найти решение применяя инструменты, имеющиеся в наличии. Ребята просто нашли решение без ABAP-а.
 
Хотя умение программировать значительно расширяет набор инструментов. :)

Да но задача как заметил Олег решена не совсем корректно, это к рабочим дням относится. Далее у такого решения есть тот минус, что нужно не забывать о существовании внешнего планировщика заданий, таким образом вместо одной точки контроля, у нас получается две, собственно сам внешний планировщик операционной системы и запланированные задачи внутри ERP. С точки зрения надежности, это уже минус.
 
PS: С другой стороны, задача решена, решение устраивает, значит все отлично.

Комментарий от  

Влад Русаков

  |  28 апреля 2015, 17:17

Для старта автовыравнивания при автоимпорте транспортов после проброса файлов из внешней TMS, однозначно.