SAP Idocs. Создание и настройка указателей изменений для Idoc с нуля

SAP Idocs. Создание и настройка указателей изменений для Idoc с нуля

Последовательно разложив составляющие процесса настройки/разработки пользовательского Idoc, было бы неплохо сделать тоже самое для процесса настройки/разработки указателей изменений в привязке к вновь настроенному Idoc. Именно эту цель я хочу преследовать, публикуя данную заметку, так как она видится мне логичным продолжением ранее опубликованного материала.

Предыстория

См. заметку SAP Idocs. Создание, настройка пользовательского Idoc с нуля

Задача

Активировать возможность создания указателя изменений для пользовательского типа сообщений. Указатель изменений должен формироваться при корректировке инфо-типа кадрового администрирования. На основании созданного указателя изменений сформировать Idoc для отправки в другую SAP систему.

Матчасть

См. Change Pointer (Master Data Distribution)

См. Distributing Master Data with the SMD Tool

Шаг 1. Активация создания указателей изменений (транзакция BD61)

Активируйте возможность создания указателей изменений в системе, посредством запуска транзакции BD61

Шаг 2. Реализация механизма формирования указателей изменений

Согласно поставленной мной задачи, указатель изменений должен формироваться в момент редактирования записи инфо-типа кадрового администрирования.

Работу по отслеживанию изменения инфо-типов на себя берет реализация BAdI HRPAD00INFTY (которая пока отсутствует). Работу же по созданию указателя изменений (aka change pointer) возьмет на себя вызов ФМ CHANGE_POINTERS_CREATE_DIRECT в новой реализации BAdI.

См. заметку Как определить дополнительную логику для PA инфо-типа?

Создать новое внедрение для BAdI можно посредством работы с транзакцией SE18

N.B. Отдельно хочу отметить, что весь ниже представленный в заметке ABAP код используется исключительно для демонстрации варианта решения задачи, описанной в ее начале, и нуждается в обязательной доработке, если его применение планируется в какой-либо проектной задаче.

Также хочу отметить, что по умолчанию система SAP не управляет индикаторами (Insert, Update, Delete) вновь создаваемых указателей изменений. В зависимости от бизнес-потребности, которая может появиться в проектной деятельности, логику их формирования и присвоения указателю изменений придется продумывать консультанту и разработчику.

Шаг 3. Проверка создания указателя изменений для типа сообщения

На следующем видеофрагменте представлена последовательность действий, в результате которой выполняется последовательное создание/редактирование/удаление записи кадрового инфо-типа с последующей проверкой появления записи указателя в таблице BDCP2.

Шаг 4. Настройка модели распределения

Используя транзакцию BD64, выполните присвоение типа сообщения системе-партнеру, куда должен быть отправлен сформированный на основании указателя изменения Idoc.

См. Model Distribution

Шаг 5. ФМ для создания Idoc из указателя изменений (транзакция SE37)

На основании указателя изменений, который сохранен в таблице BDCP2, необходимо сформировать Idoc с соответствующим содержимым. Сделать это без применения ABAP, к сожалению, не представляется возможным. Но данная задача перестает казаться непосильной, принимая во внимание тот факт, что исходный код для нового ФМ можно подсмотреть в уже созданных функциональных методах, находящихся по маске MASTERIDOC_CREATE_SMD_* в транзакции SE37. Для демонстрации далее, я попробую пошалить следующим образом.

  
  DATA: distrimodel     LIKE bdi_model OCCURS 0 WITH HEADER LINE,
        change_pointers LIKE STANDARD TABLE OF bdcp,
        change_pointer  LIKE bdcp,
        lt_cp           TYPE TABLE OF bdicpident,
        lv_subty        TYPE p0021-subty,
        lt_0021         TYPE TABLE OF  p0021,
        it_data         TYPE TABLE OF edidd,
        it_data1        TYPE TABLE OF edidd,
        ls_idoc_body    TYPE z1i0021,
        ls_data         TYPE edidd,
        lt_comm_idoc    LIKE edidc OCCURS 0 WITH HEADER LINE,
        s_ctrl_rec      LIKE edidc.
 
  CONSTANTS: lc_message_type TYPE bdcps-mestype  VALUE 'ZFAMILY'.
 
  CALL FUNCTION 'CHANGE_POINTERS_READ'
    EXPORTING
      message_type                = lc_message_type
      read_not_processed_pointers = 'X'
    TABLES
      change_pointers             = change_pointers
    EXCEPTIONS
      error_in_date_interval      = 1
      error_in_time_interval      = 2
      OTHERS                      = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
 
  LOOP AT change_pointers INTO change_pointer.
 
    IF change_pointer-cretime+0(8) <= sy-datum.
 
      DATA(lv_pernr) = change_pointer-tabkey+1(8).
      DATA(lv_infty) = change_pointer-tabkey+9(4).
      DATA(lv_strlen) = strlen( change_pointer-tabkey ).
 
      IF lv_strlen = 30.
        lv_subty = change_pointer-tabkey+13(1).
        DATA(lv_begda) = change_pointer-tabkey+14(8).
        DATA(lv_endda) = change_pointer-tabkey+22(8).
      ELSE.
        lv_subty = change_pointer-tabkey+13(2).
        lv_begda = change_pointer-tabkey+15(8).
        lv_endda = change_pointer-tabkey+23(8).
      ENDIF.
 
      ls_data-segnam = 'Z1I0021'.
      ls_data-mandt  = sy-mandt.
 
      CALL FUNCTION 'HR_READ_INFOTYPE'
        EXPORTING
          tclas     = 'A'
          pernr     = CONV prelp-pernr( lv_pernr )
          infty     = CONV prelp-infty( lv_infty )
          begda     = CONV prelp-begda( lv_begda )
          endda     = CONV prelp-endda( lv_endda )
        TABLES
          infty_tab = lt_0021.
 
      IF lt_0021 IS NOT INITIAL.
 
        READ TABLE lt_0021 ASSIGNING FIELD-SYMBOL() WITH KEY subty = lv_subty.
 
        IF  IS ASSIGNED.
          ls_idoc_body-pernr = -pernr.
          ls_idoc_body-begda = -begda.
          ls_idoc_body-endda = -endda.
          ls_idoc_body-rel_type = -subty.
          ls_idoc_body-dob = -fgbdt.
          ls_idoc_body-first_name = -favor.
          ls_idoc_body-last_name = -fanam.
          ls_idoc_body-gender_key = -fasex.
          ls_data-docnum  = change_pointer-cpident.
          ls_data-sdata  = ls_idoc_body.
          APPEND ls_data TO it_data.
        ELSE.
          IF change_pointer-cdchgid EQ 'D'.
            ls_idoc_body-pernr = -pernr.
            ls_idoc_body-begda = -begda.
            ls_idoc_body-endda = -endda.
            ls_idoc_body-rel_type = -subty.
            ls_data-sdata  = ls_idoc_body.
            ls_data-docnum  = change_pointer-cpident.
            APPEND ls_data TO it_data.
          ENDIF.
        ENDIF.
      ELSE.
        ls_idoc_body-pernr = lv_pernr.
        ls_idoc_body-begda = lv_begda.
        ls_idoc_body-endda = lv_endda.
        ls_idoc_body-rel_type = lv_subty.
        ls_data-sdata  = ls_idoc_body.
        ls_data-docnum  = change_pointer-cpident.
        APPEND ls_data TO it_data.
      ENDIF.
 
    ELSE.
      ls_idoc_body-pernr = lv_pernr.
      ls_idoc_body-begda = lv_begda.
      ls_idoc_body-endda = lv_endda.
      ls_idoc_body-rel_type = lv_subty.
      ls_data-sdata  = ls_idoc_body.
      ls_data-docnum  = change_pointer-cpident.
      APPEND ls_data TO it_data.
    ENDIF.
 
    CALL FUNCTION 'ALE_MODEL_INFO_GET'
      EXPORTING
        message_type = lc_message_type
      TABLES
        model_data   = distrimodel
      EXCEPTIONS
        OTHERS       = 0.
 
    IF distrimodel IS NOT INITIAL.
 
      s_ctrl_rec-mestyp = 'ZFAMILY' .  "Message type
      s_ctrl_rec-idoctp = 'ZHR_IT0021'. "Basic IDOC type
      s_ctrl_rec-rcvprt = 'LS'. "Partner type of receiver
      s_ctrl_rec-rcvprn = 'IDECLNT810'. "Part
 
 
      CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
        EXPORTING
          master_idoc_control            = s_ctrl_rec "rec_control  " Control record of master IDoc
        TABLES
          communication_idoc_control     = lt_comm_idoc "it_control " Control records of created comm. IDocs
          master_idoc_data               = it_data " Data records of master IDoc
        EXCEPTIONS
          error_in_idoc_control          = 1
          error_writing_idoc_status      = 2
          error_in_idoc_data             = 3
          sending_logical_system_unknown = 4
          OTHERS                         = 5.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ELSE.
        CLEAR lt_cp.
 
        APPEND VALUE #( cpident = change_pointer-cpident ) TO lt_cp.
 
        CALL FUNCTION 'CHANGE_POINTERS_STATUS_WRITE'
          EXPORTING
            message_type           = 'ZFAMILY'
          TABLES
            change_pointers_idents = lt_cp.
      ENDIF.
 
    ENDIF.
  ENDLOOP.

Пожалуйста, обратите свое внимание на то, что после того, как указатель изменений был успешно обработан, в таблице BDCP2 необходимо установить об этом соответствующую отметку (BDCP2-ROCESS = X). В ABAP это можно сделать посредством вызова ФМ CHANGE_POINTERS_STATUS_WRITE.

Шаг 6. Присвоение ФМ по созданию Idoc типу сообщения (транзакция BD60)

Выполните присвоение вновь созданного ФМ соответствующему типу сообщений в транзакции BD60.

Шаг 7. Активация указателя изменений для типа сообщения (транзакция BD50)

Активируйте создание указателя изменений для соответствующего типа сообщения в транзакции BD50

Шаг 8. Тестирование процесса создания Idoc из указателя изменений

Как я уже описывал в одной из своих ранних заметок, посвященных созданию Idoc'ов из change pointer'ов, после того, как запись указателя попадает в таблицу BDCP2, программа RBDMIDOC должна завершить этот нетривиальный процесс, обработав нужные типы сообщений.

См. заметку SAP IDocs. Указатели изменений

На следующем видеофрагменте представлена последовательность действий, в результате которой выполняется последовательное создание указателей изменений с сопутствующим запуском программы RBDMIDOC, а также просмотром результата передачи сформированного Idoc в систему-приемник. Напомню, что в моем примере Idoc отправляется из клиента #800 в клиент #810 в пределах одной системы. В "соседнем" манданте системы, в результате отправки Idoc'a выполняется проверка его статуса, и внесенных изменений в основные мастер данные работника, для которого был создан Idoc.

Как оперативно отключить создание указателей изменений для определенного типа сообщений?

Деактивируйте затребованный тип сообщения в транзакции BD50. См. описание пункта # 7 -Активация указателя изменений для типа сообщения

На следующем видеофрагменте представлена последовательность действий в которой выполняется изменение основных данных работника при включенной опции формирования указателей изменений, а также аналогичные действия при отключенной опции формирования указателей.