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