Show TOC

Example Program for Generating an IDocLocate this document in the navigation structure

Use
FUNCTION MASTER_IDOC_CREATE_XAMPLE.
*"--------------------------------------------------------------------- 
*" Lokale Schnittstelle:
*"       IMPORTING
*"             VALUE(APPL_HEADER) LIKE XHEAD STRUCTURE  XHEAD
*"       TABLES
*"              APPL_ITEM STRUCTURE  XITEM
*"---------------------------------------------------------------------

* variables of general interest
  DATA:
*       control record for the IDoc
        IDOC_CONTROL LIKE EDIDC,
*       data records for the IDoc
        T_IDOC_DATA LIKE EDIDD OCCURS 0 WITH HEADER LINE,
*       table for the IDocs created by MASTER_IDOC_CONTROL
        T_COMM_CONTROL LIKE EDIDC OCCURS 0 WITH HEADER LINE,
*       partner type for logical system
        C_PARTNER_TYPE_LOGICAL_SYSTEM LIKE EDIDC-RCVPRT,
*       help variable for the check if an IDoc has to be created
        H_CREATE_IDOC.

* variables specific for this example
  DATA:
*       field strings with IDoc segment structure
        E1XHEAD LIKE E1XHEAD,
        E1XITEM LIKE E1XITEM,
*       data to be put to the control record
                C_MESSAGE_TYPE LIKE EDIDC-MESTYP VALUE 'XAMPLE',
        C_BASE_IDOC_TYPE LIKE EDIDC-IDOCTP VALUE 'XAMPLE01',
*       segment types to be put to the data record table
                C_HEADER_SEGTYP LIKE EDIDD-SEGNAM VALUE 'E1XHEAD',
        C_ITEM_SEGTYP LIKE EDIDD-SEGNAM VALUE 'E1XITEM'.  

* check if an IDoc has to be created, read the distribution model
CALL FUNCTION 'ALE_MODEL_DETERMINE_IF_TO_SEND'
EXPORTING
        MESSAGE_TYPE           = C_MESSAGE_TYPE
*         SENDING_SYSTEM         = ' '
*         RECEIVING_SYSTEM       = ' '
*         VALIDDATE              = SY-DATUM
IMPORTING
IDOC_MUST_BE_SENT      = H_CREATE_IDOC.
*    exceptions
*         own_system_not_defined = 1
*         others                 = 2.

IF H_CREATE_IDOC IS INITIAL.
*   no message flow maintained in the model, nothing to do
EXIT.
ENDIF.

* put the application header record to the IDoc
MOVE-CORRESPONDING APPL_HEADER TO E1XHEAD.

* convert SAP codes to ISO codes
PERFORM E1XHEAD_CODES_SAP_TO_ISO
  USING
APPL_HEADER 
  CHANGING
E1XHEAD.

* append record to IDoc data table
T_IDOC_DATA-SEGNAM = C_HEADER_SEGTYP.
T_IDOC_DATA-SDATA = E1XHEAD.
APPEND T_IDOC_DATA.

LOOP AT APPL_ITEM.
*   put the application item record to the IDoc segment
MOVE-CORRESPONDING APPL_ITEM TO E1XITEM.

*   convert currency amounts from SAP internal to neutral format
PERFORM E1XITEM_CURRENCY_SAP_TO_IDOC
                        USING
        APPL_HEADER-CURRENCY
                        CHANGING
E1XITEM.

*   convert SAP codes to ISO codes
PERFORM E1XITEM_CODES_SAP_TO_ISO
                        USING 
APPL_ITEM
                        CHANGING
E1XITEM.

*   left justify all non character fields
PERFORM E1XITEM_CONDENSE
                        CHANGING
E1XITEM.

*   append record to IDoc data table 
T_IDOC_DATA-SEGNAM = C_ITEM_SEGTYP.
T_IDOC_DATA-SDATA = E1XITEM.
APPEND T_IDOC_DATA.
ENDLOOP.

CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
* in update task   "if application document is posted in update task
EXPORTING
MASTER_IDOC_CONTROL            = IDOC_CONTROL
TABLES
COMMUNICATION_IDOC_CONTROL     = T_COMM_CONTROL
MASTER_IDOC_DATA               = T_IDOC_DATA.
*      exceptions
*           error_in_idoc_control          = 1 
*           error_writing_idoc_status      = 2 
*           error_in_idoc_data             = 3
*           sending_logical_system_unknown = 4 
*           others                         = 5.

* A commit work has to be done. It could also be done in the calling 
* application.
COMMIT WORK.

READ TABLE T_COMM_CONTROL INDEX 1.
IF SY-SUBRC <> 0.
* no IDoc was created, you can react here, if neccessary
 ENDIF. 
ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  E1XITEM_CONDENSE
*&---------------------------------------------------------------------*
*       text* 
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM E1XITEM_CONDENSE
CHANGING
IDOC_SEGMENT LIKE E1XITEM.

* left justify all non character fields
CONDENSE: IDOC_SEGMENT-QUANTITY,
IDOC_SEGMENT-VALUE.
ENDFORM.                                                                                                                        " E1XITEM_CONDENSE
*&---------------------------------------------------------------------*
*&      Form  E1XITEM_CURRENCY_SAP_TO_IDOC
*&---------------------------------------------------------------------*
*       text                                                           *
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM E1XITEM_CURRENCY_SAP_TO_IDOC
USING 
CURRENCY_CODE LIKE TCURC-WAERS
CHANGING
IDOC_SEGMENT LIKE E1XITEM.

CALL FUNCTION 'CURRENCY_AMOUNT_SAP_TO_IDOC'
EXPORTING
CURRENCY    = CURRENCY_CODE
SAP_AMOUNT  = IDOC_SEGMENT-VALUE
IMPORTING
IDOC_AMOUNT = IDOC_SEGMENT-VALUE.
*      exceptions
*           others      = 1.

ENDFORM.                               " E1XITEM_CURRENCY_SAP_TO_IDOC
*&---------------------------------------------------------------------*
*&      Form  E1XHEAD_CODES_SAP_TO_ISO
*&---------------------------------------------------------------------*
*       text                                                           *
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM E1XHEAD_CODES_SAP_TO_ISO
USING
APPL_DATA LIKE XHEAD
CHANGING
IDOC_SEGMENT LIKE E1XHEAD.

* convert a currency code from SAP code to ISO code
IF NOT APPL_DATA-CURRENCY IS INITIAL.
CALL FUNCTION 'CURRENCY_CODE_SAP_TO_ISO'
EXPORTING
SAP_CODE = APPL_DATA-CURRENCY
IMPORTING
ISO_CODE = IDOC_SEGMENT-CURRENCY.
*      exceptions
*           not_found = 1
*           others    = 2.
 ELSE.
IDOC_SEGMENT-CURRENCY = APPL_DATA-CURRENCY.
ENDIF.

* convert a country from SAP code to ISO code
IF NOT APPL_DATA-COUNTRY IS INITIAL.
CALL FUNCTION 'COUNTRY_CODE_SAP_TO_ISO'
EXPORTING
SAP_CODE = APPL_DATA-COUNTRY
IMPORTING 
ISO_CODE = IDOC_SEGMENT-COUNTRY.
*      exceptions 
*           not_found = 1
*           others    = 2.
 ELSE. 
IDOC_SEGMENT-COUNTRY = APPL_DATA-COUNTRY.
ENDIF.
 ENDFORM.                               " E1XHEAD_CODES_SAP_TO_ISO
*&---------------------------------------------------------------------*
*&      Form  E1XITEM_CODES_SAP_TO_ISO 
*&---------------------------------------------------------------------*
*       text                                                           *
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text 
*----------------------------------------------------------------------*
FORM E1XITEM_CODES_SAP_TO_ISO
USING
APPL_DATA LIKE XITEM
CHANGING
IDOC_SEGMENT LIKE E1XITEM.

* convert a unit of measure from SAP code to ISO code
IF NOT APPL_DATA-UNIT IS INITIAL.
CALL FUNCTION 'UNIT_OF_MEASURE_SAP_TO_ISO'
EXPORTING
SAP_CODE = APPL_DATA-UNIT
IMPORTING
ISO_CODE = IDOC_SEGMENT-UNIT.
*      exceptions
*           not_found   = 1
*           no_iso_code = 2 
*           others      = 3.
ELSE.
IDOC_SEGMENT-UNIT = APPL_DATA-UNIT.
 ENDIF.

* convert a package type from SAP code to ISO code
IF NOT APPL_DATA-SHIP_INST IS INITIAL.
CALL FUNCTION 'SAP_TO_ISO_PACKAGE_TYPE_CODE'
EXPORTING
SAP_CODE = APPL_DATA-SHIP_INST
IMPORTING 
ISO_CODE = IDOC_SEGMENT-SHIP_INST.
*      exceptions
*           not_found = 1 
*           others    = 2.
ELSE.
IDOC_SEGMENT-SHIP_INST = APPL_DATA-SHIP_INST.
ENDIF.

ENDFORM.                               " E1XITEM_CODES_SAP_TO_ISO