В стандарте SAP HCM есть российские инфотипы. В стандарте SAP передача российских инфотипов по ALE почему-то не есть. Ее нет от слова совсем. Сегодня мы с вами настроим передачу любых инфотипов по ALE, а заодно повторим немного настройку ALE. Рассматривать будем две ситуации: передачу коротких инфотипов и передачу длинных инфотипов.

Передача коротких инфотипов по ALE

Короткий инфотип, это инфотип, размер которого влезает в один сегмент. Как проверить? Открываем SE11, открываем структуру инфотипа в формате PXXXX, складываем размеры всех полей. 1 сегмент может хранить 1000 символов. Если структура длиннее, то это длинный инфотип, если короче, то… короче понятно, что короче 😉

В транзакции WE31 создаем новый сегмент для инфотипа. Правило именования Z1PXXXX, хотя можно и длиннее, но для версий системы 4.6+. Первые три символа всегда Z1P или Y1P. Чтобы не вводить все данные руками из SE11 можно создать через шаблон. В меню Segment -> Create with template выбираем DDIC структуру PXXXX. При сохранении сегмента система проверит размерность на соответствие 1000 символов.

Вот мой сегмент для ИТ 0293.

Создание IDOC сегмента
Создание IDOC сегмента

Не забываем релизнуть сегмент в меню.

В системах отправителя и получателя для этого ИТ прописываем наш сегмент в ракурсе T777D:

В обеих системах в WE30 создаем расширение для базового типа сообщения. У меня это выглядит вот так.

Добавляем сегмент в структуру.

Полдела сделано. На главном экране в меню Edit опять релизим наше расширение. Остались пустяки.

В WE82 прописываем наше расширение для типа сообщения HRMD_A.

Прописываем расширение в профиле партнера в WE20

Заходим в PFAL и шлем его нафиг.

Передача длинных инфотипов по ALE

Здесь чуток замороченнее.

Суммарно мы можем передать не более 3000 символов, это 3 сегмента. Мы аналогичным способом создаем сегменты, но с одним отличием. Нам для соединения сегментов в одну запись инфотипа нужно их идентифицировать. Поэтому мы в начале каждого сегмента закладываем ключевые поля из структуры PSKEY. Логика работы такова, что мы при формировании IDOC делим длинный ИТ на кусочки, но в каждом кусочке есть один уникальный ключ. Почти как блокчейн для HR 🙂 При получении IDOC во входящей системе мы кусочки соединяем и сохраняем в одну запись инфотипа.

Чтобы кусочки не расползлись по всему IDOC, мы их делаем зависимыми друг от друга.

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

Запустили PFAL и получили вот такую картинку:

Первый сегмент заполнился, а второй нет.

Все потому, что неправильно ты, Дядя Федор, бутерброд ешь (с) Кот Матроскин.

Создаем в CMOD расширение.

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

EXIT_SAPLRHAL_003 – расчленение
EXIT_SAPLRHAL_004 – склеивание

Я сделал два ФМника.

ZCONVERT_P0294_TO_Z1PA0294
ZCONVERT_Z1PA0294_TO_P0294

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

Ниже исходники обоих. После этого активируем ФМ, проект расширений и запускаем PFAL. И все работает. Не забываем еще про механизм преобразования данных на лету.

Я передавал данные в рамках одной системы, поэтому у меня все настройки и ФМ в одной системе, вам же надо разделить по системам приемникам/получателям.

Поделитесь с друзьями и коллегами! Вам это ничего не стоит, а нас мотивирует на новые подвиги!

*&---------------------------------------------------------------------*
*&  Include           ZXHALU04
*&---------------------------------------------------------------------*
CONSTANTS: c_0294(4) TYPE c VALUE '0294'.
IF INFTY_NAME = c_0294.
  CALL FUNCTION 'ZCONVERT_P0294_TO_Z1PA0294'
    EXPORTING
      pnnnn_data = pnnnn_data
    IMPORTING
      converted  = converted
      subrc      = subrc
    TABLES
      error_tab  = error_message
    CHANGING
      sdata_data = sdata_data
    EXCEPTIONS
      OTHERS     = 0.
ENDIF.
*&---------------------------------------------------------------------*
*&  Include           ZXHALU05
*&---------------------------------------------------------------------*
CONSTANTS: c_0294(4) TYPE c VALUE '0294'.
IF INFTY_NAME = c_0294.

  CALL FUNCTION 'ZCONVERT_Z1PA0294_TO_P0294'
    EXPORTING
      SDATA_DATA       =  sdata_data
   IMPORTING
     PNNNN_DATA       = pnnnn_data
     CONVERTED        = converted
     SUBRC            = subrc
    TABLES
      ERROR_TAB        = error_message
            .

ENDIF.
FUNCTION ZCONVERT_P0294_TO_Z1PA0294.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(PNNNN_DATA)
*"  EXPORTING
*"     VALUE(CONVERTED) TYPE  C
*"     VALUE(SUBRC) LIKE  SY-SUBRC
*"  TABLES
*"      ERROR_TAB STRUCTURE  HRALE_ERR
*"  CHANGING
*"     VALUE(SDATA_DATA)
*"----------------------------------------------------------------------

  DATA: BEGIN OF sdata_long,
          sdata  LIKE edidd-sdata,
          sdata2 LIKE edidd-sdata,
          sdata3 LIKE edidd-sdata,
  END OF sdata_long.

  DATA: i0294       LIKE p0294.        "workarea for infotype
  DATA: z1pa0294     LIKE z1pa0294.      "workarea for segmenttype
  DATA: z1pb0294     LIKE z1pb0294.      "workarea for segmenttype

  DATA: act_subrc   LIKE sy-subrc.

  FIELD-SYMBOLS: <wplog> TYPE ANY.

  CLEAR subrc.

* fill workarea for infotype with infotype-data
  ASSIGN pnnnn_data TO <wplog> CASTING TYPE p0294.
  i0294 = <wplog>.

  sdata_long = sdata_data.
  ASSIGN sdata_long-sdata TO <wplog> CASTING TYPE z1pa0294.
  z1pa0294 = <wplog>.
  ASSIGN sdata_long-sdata2 TO <wplog> CASTING TYPE z1pb0294.
  z1pb0294 = <wplog>.

* move fields
  MOVE-CORRESPONDING i0294 TO z1pa0294.
  MOVE-CORRESPONDING i0294 TO z1pb0294.

* fill IDoc-data with workarea for segmenttype
  IF subrc = 0.
    assign sdata_long-sdata to <wplog> casting type z1pa0294.
    <wplog> = z1pa0294.
    assign sdata_long-sdata2 to <wplog> casting type z1pb0294.
    <wplog> = z1pb0294.

    sdata_data        = sdata_long.
  ENDIF.

* set or initialize conversion flag
  converted = 'X'.

ENDFUNCTION.
FUNCTION ZCONVERT_Z1PA0294_TO_P0294.
*"--------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(SDATA_DATA)
*"  EXPORTING
*"     VALUE(PNNNN_DATA)
*"     VALUE(CONVERTED) TYPE  C
*"     VALUE(SUBRC) LIKE  SY-SUBRC
*"  TABLES
*"      ERROR_TAB STRUCTURE  HRALE_ERR
*"--------------------------------------------------------------------

  DATA: BEGIN OF sdata_long,
          sdata  LIKE edidd-sdata,
          sdata2 LIKE edidd-sdata,
          sdata3 LIKE edidd-sdata,
  END OF sdata_long.

  DATA: i0294       LIKE p0294.        "workarea for infotype
  DATA: z1pa0294     LIKE z1pa0294.      "workarea for segmenttype
  DATA: z1pb0294     LIKE z1pb0294.      "workarea for segmenttype


  DATA: act_subrc   LIKE sy-subrc.

  FIELD-SYMBOLS: <wplog> TYPE ANY.

  CLEAR subrc.

* fill workarea for segmenttype with IDoc-data
  sdata_long = sdata_data.
  ASSIGN sdata_long-sdata TO <wplog> CASTING TYPE z1pa0294.
  z1pa0294 = <wplog>.
  ASSIGN sdata_long-sdata2 TO <wplog> CASTING TYPE z1pb0294.
  z1pb0294 = <wplog>.


* move fields
  MOVE-CORRESPONDING z1pa0294 TO i0294.
  MOVE-CORRESPONDING z1pb0294 TO i0294.

* fill infotype-data with workarea for infotype
  IF subrc = 0.
    ASSIGN pnnnn_data TO <wplog> CASTING TYPE p0294.
    <wplog> = i0294.
  ENDIF.

* set or initialize conversion flag
  converted = 'X'.

ENDFUNCTION.