Привет.

Продолжаем разговор про планировщики заданий. Вот простое решение по автоматизации файловых событий. Если на диске появился файл, который нужно загрузить, то программа генерирует сигнал и запускается загрузчик. Автоматизированно.

Сначал мы создаем свое событие в SM62.

Создаем свои логические файлы (чтобы в случае переезда на новую операционную систему или смены хранилища не менять все исходники). Транзакция FILE.

Сначала логический путь к файлу.

Затем логическое имя файла, которое указывает на физическое имя.

Запускаем в фоне програмку (код ниже) каждые 5 минут. Программка смотрит указанный файл. Если он есть на диске, то вызывает системное событие. На это системное событие мы можем повесить другое задание или поток операций.

Вот и все. Вау эффект достигнут. Если на диске появляется файл, то система выбрасывает событие ZMONEY. Тут же планировщик заданий видит событие и запускает по нему наше задание. В задании мы можем прочитать файл с диска, обработать и удалить.

Соответственно, если у нас 10 разных интефейсов и файлов, которые нужно мониторить, то создаем либо 10 событий (если нам поле параметр события нужно для чего-то использовать своего) и планируем одну и ту же программу с 10 вариантами. Либо в поле параметр события вставляем признак интерфейса (зарплата, кадры, социалка или еще что), а в коде добавляем параметр на селекционник и в вызов ФМ BP_EVENT_RAISE.

Более того, мы можем также вызывать события в другой системе удаленно. Для этого нужно использовать ФМ BP_REMOTE_EVENT_RAISE с указанием удаленной системы. Это круто делать, когда мы в ERP загрузили файлики, а потом вызвали событие в BW для прогрузки данных.

Плюс, есть возможность с уровня самой операционной системы вызывать события с помощью программы sapevent (ноты 2015788 and 2014139). Написали скриптик на PowerShell или юниксовом шелле, в конце запустили событие в SAP.

Плюс, есть возможность вызывать события через веб. Нота 2001336 и дергаем сервис  /default_host/sap/bc/batch/event_raise, чтобы вызвать событие. Тем же curl с уровня операционной системы либо на любом языке программирования.

В качестве улучшайзинга нужно добавить блокировки, чтобы одно и тоже событие два раза не вызывалось, пока файл обрабатывается.

Трудозатраты на реализацию составили 30 минут. 20 из них вспоминал ABAP, 5 писал заметку.

*&---------------------------------------------------------------------*
*& Report ZSCHEDULER
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZSCHEDULER.

parameters:
  p_lfile type filename-fileintern,  " Logical file
  p_event type string.

data:
  l_pfile  type string.    " Physical file

start-of-selection.

  " Get physical file name from logical
  CALL FUNCTION 'FILE_GET_NAME'
    EXPORTING
*     CLIENT           = SY-MANDT
      LOGICAL_FILENAME = p_lfile
*     OPERATING_SYSTEM = SY-OPSYS
*     PARAMETER_1      = ' '
*     PARAMETER_2      = ' '
*     PARAMETER_3      = ' '
*     USE_PRESENTATION_SERVER       = ' '
*     WITH_FILE_EXTENSION           = ' '
*     USE_BUFFER       = ' '
*     ELEMINATE_BLANKS = 'X'
*     INCLUDING_DIR    = ' '
    IMPORTING
*     EMERGENCY_FLAG   =
*     FILE_FORMAT      =
      FILE_NAME        = l_pfile
    EXCEPTIONS
      FILE_NOT_FOUND   = 1
      OTHERS           = 2.

  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  open dataset l_pfile for input in binary mode.
  IF sy-subrc = 0.
    close dataset l_pfile.
    CALL FUNCTION 'BP_EVENT_RAISE'
      EXPORTING
        EVENTID = p_event
*       EVENTPARM                    = ' '
*       TARGET_INSTANCE              = ' '
*       TARGET_MODE                  = ' '
*  EXCEPTIONS
*       BAD_EVENTID                  = 1
*       EVENTID_DOES_NOT_EXIST       = 2
*       EVENTID_MISSING              = 3
*       RAISE_FAILED                 = 4
*       OTHERS  = 5
      .
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.


    write: / 'event', p_event, ' was raised at', sy-datum, sy-uzeit.
  ELSE.
    write: / 'no file exists at ', l_pfile.

  ENDIF.