Заполнение нового типа 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. Выполните эти действия в транзакциях WE81WE82

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
0:00
/2:39

В результате было создано 3 айдока с тремя записями в их сегментах, соответствующих записям в Z* таблице. По мере отработки программы RSEOUT00 статус айдоков был изменен c "30 - IDoc ready for dispatch (ALE service)" на "03 - Data passed to port OK"

Спасибо за внимание.