Заполнение нового типа IDoc посредством запуска ABAP программы
Предлагаю вашему вниманию небольшую заметку про создание и заполнение нового типа IDoc посредством запуска ABAP программы.
0. Задача
Создать новый тип IDoc и ABAP программу, после запуска которой, произойдет заполнение его данными из пользовательской таблицы.
1. Создание таблицы
Создайте таблицу, значения которой должны будут наличествовать в сегменте вашего IDoc.
См. заметку Создание пользовательской таблицы и ракурса ее ведения
В моем примере будет использоваться таблица с техническим наименованием ZTBL_IDOC1
2. Создание нового сегмента IDoc
См. Defining Segments
Создайте новый сегмент вашего IDoc в транзакции WE31. В моем примере, структура нового сегмента будет схожа со структурой таблицы, значения из которой я планирую передавать в этот сегмент
После того как новый сегмент создан, выполните его деблокирование, выбрав в меню команду Edit -> Set release
3. Создание нового типа IDoc
См. Defining New IDoc Types
См. Defining and Using a Basic Type
С помощью транзакции WE30 создайте новый тип IDoc, куда включите созданный ранее сегмент.
Также выполните деблокирование нового типа IDoc, выбрав в меню Edit -> Set release
4. Создание нового типа сообщения и присвоение типу IDoc
См. Assigning Basic Types to Message Types
Создайте новый тип сообщения и присвойте ему созданный ранее тип IDoc. Выполните эти действия в транзакциях WE81, WE82
5. Добавление нового типа сообщения для системы-потребителя
См. Partner Profiles in the Standard Dialog
В транзакции WE20 добавьте новый тип сообщения для системы, куда планируется отправление нового IDoc
6. Настройка модели распределения
См. Modelling Distribution
См. Setting Up Communication
Настройте модель распределения, используя транзакцию BD64, добавив новый тип сообщения
См. заметку SAP IDocs. Подготовка HR мастер-данных для переноса в другую HR систему. Часть 1
См. заметку SAP IDocs. Подготовка HR мастер-данных для переноса в другую HR систему. Часть 2
7. Создание ABAP-программы для заполнения IDoc
Исходный код был подсмотрен здесь, а затем несколько адаптирован
REPORT zdemo_idoc.
TABLES: ztbl_idoc1.
DATA : s_ctrl_rec LIKE edidc, "Idoc Control Record
s_zsegment LIKE zdm_sgmt. "CUSTOMER Header Data
DATA : t_tbl_idoc1 LIKE ztbl_idoc1 OCCURS 0 WITH HEADER LINE.
DATA : t_edidd LIKE edidd OCCURS 0 WITH HEADER LINE. "Data Records
DATA : lt_comm_idoc LIKE edidc OCCURS 0 WITH HEADER LINE. "Generated Communication IDOc
CONSTANTS: c_idoctp LIKE edidc-idoctp VALUE 'ZBASIC_IT'. "
CONSTANTS :c_segnam LIKE edidd-segnam VALUE 'ZDM_SGMT'. "
SELECT-OPTIONS: s_pernr FOR ztbl_idoc1-pernr OBLIGATORY.
PARAMETERS: c_mestyp LIKE edidc-mestyp DEFAULT 'ZDEMO_MESSTYPE', "Message type
c_rcvprt LIKE edidc-rcvprt DEFAULT 'LS', "System type
c_logsys LIKE edidc-rcvprn DEFAULT 'ERPCLNT810'. "Reciever
START-OF-SELECTION.
PERFORM generate_data_records.
PERFORM generate_control_record.
PERFORM send_idoc.
FORM generate_data_records .
SELECT * FROM ztbl_idoc1
INTO TABLE t_tbl_idoc1
WHERE pernr IN s_pernr.
IF sy-subrc <> 0.
ENDIF.
PERFORM arrange_data_records.
ENDFORM.
FORM generate_control_record .
s_ctrl_rec-mestyp = c_mestyp. "Message type
s_ctrl_rec-idoctp = c_idoctp. "Basic IDOC type
s_ctrl_rec-rcvprt = c_rcvprt. "Partner type of receiver
s_ctrl_rec-rcvprn = c_logsys. "Partner number of receiver
ENDFORM.
FORM send_idoc .
CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = s_ctrl_rec
* OBJ_TYPE = ''
* CHNUM = ''
TABLES
communication_idoc_control = lt_comm_idoc
master_idoc_data = t_edidd
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.
COMMIT WORK.
LOOP AT lt_comm_idoc.
WRITE:/ 'IDoc Number - ', lt_comm_idoc-docnum.
ENDLOOP.
ENDIF.
ENDFORM.
FORM arrange_data_records .
SORT t_tbl_idoc1 BY pernr.
LOOP AT t_tbl_idoc1.
s_zsegment-pernr = t_tbl_idoc1-pernr.
s_zsegment-begda = t_tbl_idoc1-begda.
s_zsegment-endda = t_tbl_idoc1-endda.
s_zsegment-zfield1 = t_tbl_idoc1-zfield1.
s_zsegment-zfield2 = t_tbl_idoc1-zfield2.
s_zsegment-zfield3 = t_tbl_idoc1-zfield3.
t_edidd-segnam = c_segnam.
t_edidd-sdata = s_zsegment.
APPEND t_edidd.
CLEAR t_edidd.
ENDLOOP.
ENDFORM.
8. Тестирование
На следующем видеофрагменте представлена следующая последовательность действий:
- Посредством запуска ABAP программы происходит сбор данных из пользовательской таблицы и заполнение сегментов нового IDoc;
- В этой же программы, через вызов ФМ MASTER_IDOC_DISTRIBUTE, происходит создание IDoc и добавление его в очередь;
См. Call of MASTER_IDOC_DISTRIBUTE
В результате было создано 3 айдока с тремя записями в их сегментах, соответствующих записям в Z* таблице. По мере отработки программы RSEOUT00 статус айдоков был изменен c "30 - IDoc ready for dispatch (ALE service)" на "03 - Data passed to port OK"
Спасибо за внимание.