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 -Активация указателя изменений для типа сообщения
На следующем видеофрагменте представлена последовательность действий в которой выполняется изменение основных данных работника при включенной опции формирования указателей изменений, а также аналогичные действия при отключенной опции формирования указателей.