Параллельное программирование 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
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти