Делаем свой File Event Scheduler
Привет.
Продолжаем разговор про планировщики заданий. Вот простое решение по автоматизации файловых событий. Если на диске появился файл, который нужно загрузить, то программа генерирует сигнал и запускается загрузчик. Автоматизированно.
Сначал мы создаем свое событие в 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 писал заметку.
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
*&---------------------------------------------------------------------* *& 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. |
Один комментарий
Calm
Круто 🙂