Show TOC

Example documentationExample Program for Generating an IDoc

 

Syntax Syntax

  1. 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
    
End of the code.