Меню

Параллельное программирование 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 класса: Контекст, Задача и Результат.

  1. 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.
  1. 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.
  1. 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

У вас уже есть учетная запись?

Войти