Параллельное программирование c использованием ABAP Concurrency API в модуле HCM
В опубликованной статье «Параллельное программирование c использованием ABAP Concurrency API» были рассмотрены проблемы, возникающие при реализации параллельных вычислений в ABAP. В этой статье я хочу показать, как можно использовать API распараллеливания в модуле HCM (Human Capital Management).
Введение
Статья 1 «Параллельное программирование c использованием ABAP Concurrency API».
В качестве решения было рассмотрено использование ABAP Concurrency API.
В этой статье я хочу показать, как можно использовать API распараллеливания в модуле HCM (Human Capital Management).
Специфика модуля HCM
В модуле HCM очень часто возникают задачи, где по табельным номерам сотрудников необходимо получить какую-либо информацию. Если в компании десятки тысяч сотрудников или получение информации требует значительных затрат времени, то одним из решений может быть параллельное программирование. В частности, использование ABAP Concurrency API.
Для упрощения работы с ABAP Concurrency API в модуле HCM предлагается использовать реализацию структурного паттерна Фасад — пакет ZCAPI_FACADE_HCM. Дополнение инкапсулирует разбиение табельных номеров на пакеты, создание объектов Задача и получение результата.
На рис. 1 представлена UML-диаграмма классов ABAP Concurrency API для HCM.
Рис. 1. UML-диаграмма классов ABAP Concurrency API для HCM
Пример использования
Рассмотрим задачу.
Необходимо по табельным номерам получить ФИО сотрудников.
ФИО сотрудников будем искать в отдельных процессах.
Для начала смоделируем заполнение внутренней таблицы gt_pernrs. Такое моделирование необходимо только для того, чтобы коллеги «из других модулей», читающие эту статью, понимали, что здесь происходит. В реальных задачах можно было бы получить табельные номера, например, из ЛБД PNPCE.
METHOD start_of_selection. DATA: ls_pernrs LIKE LINE OF gt_pernrs. * Modeling the selection of personnel numbers DO 10 TIMES. ls_pernrs-sign = 'I'. ls_pernrs-option = 'EQ'. ls_pernrs-low = sy-index. APPEND ls_pernrs TO gt_pernrs. ENDDO. ENDMETHOD.
Далее все так же создадим 3 класса: Контекст, Задача и Результат.
- lcl_contex, объект этого класса будет инкапсулировать параметры задачи. Обратите внимание, что класс lcl_contex должен быть наследован от абстрактного класса zcl_capi_facade_hcm_abstr_cntx. При реализации необходимо переопределить метод constructor.
CLASS lcl_context DEFINITION INHERITING FROM zcl_capi_facade_hcm_abstr_cntx FINAL. PUBLIC SECTION. TYPES: BEGIN OF ty_params, begda TYPE d, endda TYPE d, END OF ty_params. METHODS: constructor IMPORTING is_params TYPE ty_params, get_params RETURNING VALUE(rs_params) TYPE ty_params. PRIVATE SECTION. DATA: ms_params TYPE ty_params. ENDCLASS. CLASS lcl_context IMPLEMENTATION. METHOD constructor. super->constructor( ). ms_params = is_params. ENDMETHOD. METHOD get_params. rs_params = ms_params. ENDMETHOD. ENDCLASS.
- lcl_task описывает объект Задача. Содержит бизнес-логику (получение ФИО по табельному номеру сотрудника). Класс lcl_task должен быть наследован от класса zcl_capi_facade_hcm_abstr_task. Необходимо реализовать метод constructor и переопределить метод zif_capi_callable~call.
CLASS lcl_task DEFINITION INHERITING FROM zcl_capi_facade_hcm_abstr_task FINAL. PUBLIC SECTION. METHODS: constructor IMPORTING io_context TYPE REF TO zcl_capi_facade_hcm_abstr_cntx, zif_capi_callable~call REDEFINITION. PRIVATE SECTION. DATA: ms_params TYPE lcl_context=>ty_params. ENDCLASS. CLASS lcl_task IMPLEMENTATION. METHOD constructor. DATA: lo_context TYPE REF TO lcl_context. * Set Pernrs numbers to mt_pernrs of Task super->constructor( io_context ). * Set Context parameters lo_context ?= io_context. ms_params = lo_context->get_params( ). ENDMETHOD. METHOD zif_capi_callable~call. DATA: lt_employees TYPE lcl_result=>ty_t_employees, ls_employees LIKE LINE OF lt_employees. * Simulation of reading the full name of employees by their personnel numbers. LOOP AT mt_pernrs ASSIGNING FIELD-SYMBOL(<ls_pernr>). ls_employees-pernr = <ls_pernr>-low. CASE <ls_pernr>-low. WHEN 00000001. ls_employees-ename = 'John Doe 1'. WHEN 00000002. ls_employees-ename = 'John Doe 2'. * WHEN N. * ls_employees-ename = 'John Doe N'. WHEN OTHERS. ENDCASE. INSERT ls_employees INTO TABLE lt_employees. ENDLOOP. ro_result = NEW lcl_result( lt_employees ). ENDMETHOD. ENDCLASS.
- lcl_result описывает Результат выполнения задачи. Этот класс должен реализовывать интерфейс zif_capi_facade_hcm_result. В остальном вы можете описать его произвольным образом.
CLASS lcl_result DEFINITION FINAL. PUBLIC SECTION. INTERFACES: zif_capi_facade_hcm_result. TYPES: BEGIN OF ty_employees, pernr TYPE n LENGTH 8, ename TYPE string, END OF ty_employees, ty_t_employees TYPE STANDARD TABLE OF ty_employees WITH KEY pernr. METHODS: constructor IMPORTING it_employees TYPE ty_t_employees. PRIVATE SECTION. DATA: mt_employees TYPE ty_t_employees. ENDCLASS. CLASS lcl_result IMPLEMENTATION. METHOD constructor. mt_employees = it_employees. ENDMETHOD. METHOD zif_capi_facade_hcm_result~get. et_result = mt_employees. ENDMETHOD. "get ENDCLASS.
Обратите
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти