FUNCTION IDOC_INPUT_XAMPLE. *"---------------------------------------------------------------------- *" *"Lokale Schnittstelle: *" IMPORTING *" VALUE(INPUT_METHOD) LIKE BDWFAP_PAR-INPUTMETHD *" VALUE(MASS_PROCESSING) LIKE BDWFAP_PAR-MASS_PROC *" EXPORTING *" VALUE(WORKFLOW_RESULT) LIKE BDWF_PARAM-RESULT *" VALUE(APPLICATION_VARIABLE) LIKE BDWF_PARAM-APPL_VAR *" VALUE(IN_UPDATE_TASK) LIKE BDWFAP_PAR-UPDATETASK *" VALUE(CALL_TRANSACTION_DONE) LIKE BDWFAP_PAR-CALLTRANS *" TABLES *" IDOC_CONTRL STRUCTURE EDIDC *" IDOC_DATA STRUCTURE EDIDD *" IDOC_STATUS STRUCTURE BDIDOCSTAT *" RETURN_VARIABLES STRUCTURE BDWFRETVAR *" SERIALIZATION_INFO STRUCTURE BDI_SER *" EXCEPTIONS *" WRONG_FUNCTION_CALLED *"---------------------------------------------------------------------- * Example function module for processing inbound IDocs for ALE or EDI. * This example applies for processing * * with - one IDoc at a time * * without - serialization * - customer-exits * - calling an ALE-enabled transaction * - mass processing (more than one IDoc at a time) * -------------------- Naming conventions ------------------------------ * Internal tables start with 't_' * Internal field strings start with 'f_' * ---------------------------------------------------------------------- * >> The following line must appear in the global part of your * >> function group: * include mbdconwf. "Report containing the ALE constants. * The ALE constants start with 'c_'. DATA: SUBRC LIKE SY-SUBRC, OBJECT_NUMBER LIKE XHEAD-DOCMNT_NO. * Initialize variables SUBRC = 0. * Read the IDoc's control record READ TABLE IDOC_CONTRL INDEX 1. * Process the IDoc and post the data to the database PERFORM IDOC_PROCESS_XAMPLE TABLES IDOC_DATA IDOC_STATUS USING IDOC_CONTRL CHANGING OBJECT_NUMBER SUBRC. * Fill the ALE export parameters CLEAR IN_UPDATE_TASK. CLEAR CALL_TRANSACTION_DONE. "Call Transaction is not used. IF SUBRC <> 0. "Error occurred WORKFLOW_RESULT = C_WF_RESULT_ERROR. RETURN_VARIABLES-WF_PARAM = C_WF_PAR_ERROR_IDOCS. RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM. APPEND RETURN_VARIABLES. ELSE. "IDoc processed successfully WORKFLOW_RESULT = C_WF_RESULT_OK. RETURN_VARIABLES-WF_PARAM = C_WF_PAR_PROCESSED_IDOCS. RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM. APPEND RETURN_VARIABLES. RETURN_VARIABLES-WF_PARAM = C_WF_PAR_APPL_OBJECTS. RETURN_VARIABLES-DOC_NUMBER = OBJECT_NUMBER. APPEND RETURN_VARIABLES. ENDIF. ENDFUNCTION. *---------------------------------------------------------------------* * FORM IDOC_PROCESS_XAMPLE * *---------------------------------------------------------------------* * This routine creates an application document based on the IDoc's * * contents. Object_Number contains the new document's number. * * If an error occurs, subrc is non-zero, t_idoc_status is filled. * * Note: if more than one error is detected, t_idoc_status contains * * more than one status record. * *---------------------------------------------------------------------* * --> F_IDOC_CONTRL IDoc control record * * --> T_IDOC_DATA IDoc data records * * <-- T_IDOC_STATUS IDoc status records * * <-- OBJECT_NUMBER Created document's number * * <-- SUBRC Return code * *---------------------------------------------------------------------* FORM IDOC_PROCESS_XAMPLE TABLES T_IDOC_DATA STRUCTURE EDIDD T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_IDOC_CONTRL STRUCTURE EDIDC CHANGING OBJECT_NUMBER LIKE XHEAD-DOCMNT_NO SUBRC LIKE SY-SUBRC. * Internal field string for the document header. DATA: F_XHEAD LIKE XHEAD. * Internal table for the document items. DATA: T_XITEM LIKE XITEM OCCURS 0 WITH HEADER LINE. * Number given to the created document DATA: DOCUMENT_NUMBER LIKE F_XHEAD-DOCMNT_NO. * Move the data in the IDoc to the internal structures/tables * f_xhead and t_xitem. PERFORM IDOC_INTERPRET TABLES T_IDOC_DATA T_XITEM T_IDOC_STATUS USING F_IDOC_CONTRL CHANGING F_XHEAD SUBRC. * Create the application object if no error occurred so far. IF SUBRC = 0. * This fictitious function module creates a new object based on the * data that was read from the IDoc. The new object's ID is returned * in the parameter 'document_number'. * The function module checks that the data is correct, and raises * an exception if an error is detected. CALL FUNCTION 'XAMPLE_OBJECT_CREATE' EXPORTING XHEAD = F_XHEAD IMPORTING DOCUMENT_NUMBER = DOCUMENT_NUMBER TABLES XITEM = T_XITEM EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. * Put the error message into 't_idoc_status' PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING T_IDOC_DATA SY '' "Field name 'idoc_process_xample'. "Form routine ELSE. * Fill the remaining export parameters OBJECT_NUMBER = DOCUMENT_NUMBER. "New document's number t_idoc_status-docnum = f_idoc_contrl-docnum. t_idoc_status-status = c_idoc_status_ok. t_idoc_status-msgty = 'S'. t_idoc_status-msgid = your_msgid. "Global variable. t_idoc_status-msgno = msgno_success."Global variable. t_idoc_status-msgv1 = object_number. APPEND T_IDOC_STATUS. ENDIF. "if sy-subrc <> 0. ENDIF. "if subrc = 0. ENDFORM. *---------------------------------------------------------------------* * FORM IDOC_INTERPRET * *---------------------------------------------------------------------* * This routine checks that the correct message type is being used, * * and then converts and moves the data from the IDoc segments to the * * internal structure f_xhead and internal table t_xitem. * * If an error occurs, t_idoc_status is filled an subrc <> 0. * *---------------------------------------------------------------------* * --> T_IDOC_STATUS * * --> T_XITEM * * --> F_IDOC_DATA * * --> F_XHEAD * * --> SUBRC * *---------------------------------------------------------------------* FORM IDOC_INTERPRET TABLES T_IDOC_DATA STRUCTURE EDIDD T_XITEM STRUCTURE XITEM T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_IDOC_CONTRL STRUCTURE EDIDC CHANGING F_XHEAD STRUCTURE XHEAD SUBRC LIKE SY-SUBRC. * Check that the IDoc contains the correct message type. * Note: if your message-type is reducible, check field 'idoctp' * (IDoc type) instead of 'mestyp'. IF F_IDOC_CONTRL-MESTYP <> 'XAMPLE'. MESSAGE ID YOUR_MSGID "Global variable TYPE 'E' NUMBER MSGNO_WRONG_FUNCTION "Global variable WITH F_IDOC_CONTRL-MESTYP "message type 'IDOC_INPUT_XAMPLE' "Your function module. F_IDOC_CONTRL-SNDPRT "Sender partner type F_IDOC_CONTRL-SNDPRN "Sender number. RAISING WRONG_FUNCTION_CALLED. ENDIF. * Loop through the IDoc's segments and convert the data from the IDoc * format to the internal format. LOOP AT T_IDOC_DATA WHERE DOCNUM = F_IDOC_CONTRL-DOCNUM. CASE T_IDOC_DATA-SEGNAM. WHEN 'E1XHEAD'. PERFORM E1XHEAD_PROCESS TABLES T_IDOC_STATUS USING T_IDOC_DATA CHANGING F_XHEAD SUBRC. WHEN 'E1XITEM'. PERFORM E1XITEM_PROCESS TABLES T_XITEM T_IDOC_STATUS USING F_XHEAD-CURRENCY T_IDOC_DATA CHANGING SUBRC. ENDCASE. ENDLOOP. ENDFORM. *---------------------------------------------------------------------* * FORM E1XHEAD_PROCESS * *---------------------------------------------------------------------* * This routine fills 'f_xhead' out of segment e1xhead. * * If an error occurs, subrc is non-zero, t_idoc_status is filled. * *---------------------------------------------------------------------* * --> F_IDOC_DATA IDoc segment containing e1xhead fields * * <-- F_XHEAD Internal structure containing doc. header * * <-- T_IDOC_STATUS Status fields for error handling * * <-- SUBRC Return code: non-zero if an error occurred * *---------------------------------------------------------------------* FORM E1XHEAD_PROCESS TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_IDOC_DATA STRUCTURE EDIDD CHANGING F_XHEAD STRUCTURE XHEAD SUBRC LIKE SY-SUBRC. DATA: F_E1XHEAD LIKE E1XHEAD. F_E1XHEAD = F_IDOC_DATA-SDATA. * Process fields that need conversion from ISO-codes to SAP-codes PERFORM E1XHEAD_CODES_ISO_TO_SAP TABLES T_IDOC_STATUS USING F_E1XHEAD F_IDOC_DATA CHANGING F_XHEAD SUBRC. * Process fields containing dates or times PERFORM E1XHEAD_DATE_TIME USING F_E1XHEAD CHANGING F_XHEAD. ENDFORM. "e1xhead_process *---------------------------------------------------------------------* * FORM E1XITEM_PROCESS * *---------------------------------------------------------------------* * This routine converts the data in the segment 'e1xitem' for * * to the format of table 't_xitem' and appends it to the table. * * If an error occurs, subrc is non-zero, t_idoc_status is filled. * *---------------------------------------------------------------------* * --> F_IDOC_DATA IDoc segment * * <-- T_XITEM Document items to be updated to database * * <-- T_IDOC_STATUS Status fields filled if an error occurred * * <-- SUBRC Return code: 0 if all OK * *---------------------------------------------------------------------* FORM E1XITEM_PROCESS TABLES T_XITEM STRUCTURE XITEM T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING CURRENCY LIKE XHEAD-CURRENCY F_IDOC_DATA STRUCTURE EDIDD CHANGING SUBRC LIKE SY-SUBRC. DATA: F_E1XITEM LIKE E1XITEM. F_E1XITEM = F_IDOC_DATA-SDATA. * Fields of type CHAR, NUMC, QUAN need no conversion. T_XITEM-ITEM_NO = F_E1XITEM-ITEM_NO. T_XITEM-MATERIALID = F_E1XITEM-MATERIALID. T_XITEM-DESCRIPT = F_E1XITEM-DESCRIPT. T_XITEM-QUANTITY = F_E1XITEM-QUANTITY. * Process fields that need conversion from ISO-codes to SAP-codes PERFORM E1XITEM_CODES_ISO_TO_SAP TABLES T_IDOC_STATUS USING F_E1XITEM F_IDOC_DATA CHANGING T_XITEM SUBRC. * Process fields that contain monetary values PERFORM E1XITEM_VALUE_IDOC_TO_SAP TABLES T_IDOC_STATUS USING F_E1XITEM CURRENCY F_IDOC_DATA CHANGING T_XITEM SUBRC. APPEND T_XITEM. ENDFORM. *---------------------------------------------------------------------* * FORM E1XHEAD_CODES_ISO_TO_SAP * *---------------------------------------------------------------------* * Converts ISO-Codes in f_e1xhead to SAP-codes in f_xhead. * * f_idoc_data, t_idoc_status and subrc are used for error handling. * *---------------------------------------------------------------------* FORM E1XHEAD_CODES_ISO_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_E1XHEAD STRUCTURE E1XHEAD F_IDOC_DATA STRUCTURE EDIDD CHANGING F_XHEAD STRUCTURE XHEAD SUBRC. * f_xhead-currency Type CUKY => convert ISO-Code to SAP-Code. PERFORM CURRENCY_CODE_ISO_TO_SAP TABLES T_IDOC_STATUS USING F_E1XHEAD-CURRENCY F_IDOC_DATA 'CURRENCY' CHANGING F_XHEAD-CURRENCY SUBRC. CHECK SUBRC = 0. * f_xhead-country Contains a country => convert from ISO to SAP code. PERFORM COUNTRY_CODE_ISO_TO_SAP TABLES T_IDOC_STATUS USING F_E1XHEAD-COUNTRY F_IDOC_DATA 'COUNTRY' CHANGING F_XHEAD-COUNTRY SUBRC. ENDFORM. *---------------------------------------------------------------------* * FORM E1XITEM_CODES_ISO_TO_SAP * *---------------------------------------------------------------------* * Converts ISO-Codes in f_e1xitem to SAP-codes in f_xitem * * f_idoc_data, t_idoc_status and subrc are used for error handling. * *---------------------------------------------------------------------* FORM E1XITEM_CODES_ISO_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_E1XITEM STRUCTURE E1XITEM F_IDOC_DATA STRUCTURE EDIDD CHANGING F_XITEM STRUCTURE XITEM SUBRC LIKE SY-SUBRC. * f_xitem-unit Type UNIT => convert ISO-Code to SAP-Code. PERFORM UNIT_OF_MEASURE_ISO_TO_SAP TABLES T_IDOC_STATUS USING F_E1XITEM-UNIT F_IDOC_DATA 'unit' CHANGING F_XITEM-UNIT SUBRC. * f_xitem-ship_inst Contains shipping instructions => ISO to SAP code. PERFORM SHIPPING_INSTRUCT_ISO_TO_SAP TABLES T_IDOC_STATUS USING F_E1XITEM-SHIP_INST F_IDOC_DATA 'ship_inst' CHANGING F_XITEM-SHIP_INST SUBRC. ENDFORM. *---------------------------------------------------------------------* * FORM E1XITEM_VALUE_IDOC_TO_SAP * *---------------------------------------------------------------------* * Converts fields containing monetary values in f_e1xitem to * * the internal representation in f_xitem. * * f_idoc_data, t_idoc_status and subrc are used for error handling. * *---------------------------------------------------------------------* FORM E1XITEM_VALUE_IDOC_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_E1XITEM STRUCTURE E1XITEM CURRENCY LIKE XHEAD-CURRENCY F_IDOC_DATA STRUCTURE EDIDD CHANGING F_XITEM STRUCTURE XITEM SUBRC LIKE SY-SUBRC. * f_xitem-value Type CURR => convert IDoc amount to internal amount. * N.B. the currency code used here must be the SAP-internal one, not * the one contained in the IDoc! CALL FUNCTION 'CURRENCY_AMOUNT_IDOC_TO_SAP' EXPORTING CURRENCY = CURRENCY IDOC_AMOUNT = F_E1XITEM-VALUE IMPORTING SAP_AMOUNT = F_XITEM-VALUE EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. * Put the error message into 't_idoc_status' PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING F_IDOC_DATA SY 'value' "Field name 'e1xitem_value_idoc_to_sap'. "Form routine ENDIF. "if sy-subrc <> 0. ENDFORM. *---------------------------------------------------------------------* * FORM E1XHEAD_DATE_TIME * *---------------------------------------------------------------------* * Moves date and time fields in f_e1xhead to the fields in f_xhead. * *---------------------------------------------------------------------* FORM E1XHEAD_DATE_TIME USING F_E1XHEAD STRUCTURE E1XHEAD CHANGING F_XHEAD STRUCTURE XHEAD. * f_xhead-date Type DATS => initial value is not 'blank'. IF E1XHEAD-DATE IS INITIAL. CLEAR F_XHEAD-DATE. ELSE. F_XHEAD-DATE = F_E1XHEAD-DATE. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM CURRENCY_CODE_ISO_TO_SAP * *---------------------------------------------------------------------* * Converts ISO currency code 'iso_currency_code' to SAP code in * * 'sap_currency_code' * * f_idoc_data, field_name, t_idoc_status and subrc are used for * * for error handling. * *---------------------------------------------------------------------* FORM CURRENCY_CODE_ISO_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING ISO_CURRENCY_CODE LIKE TCURC-ISOCD F_IDOC_DATA STRUCTURE EDIDD FIELD_NAME LIKE BDIDOCSTAT-SEGFLD CHANGING SAP_CURRENCY_CODE LIKE TCURC-WAERS SUBRC LIKE SY-SUBRC. IF ISO_CURRENCY_CODE IS INITIAL. CLEAR SAP_CURRENCY_CODE. ELSE. CALL FUNCTION 'CURRENCY_CODE_ISO_TO_SAP' EXPORTING ISO_CODE = ISO_CURRENCY_CODE IMPORTING SAP_CODE = SAP_CURRENCY_CODE EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. * Put the error message into 't_idoc_status' PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING F_IDOC_DATA SY FIELD_NAME 'currency_code_iso_to_sap'. "Form routine ENDIF. "if sy-subrc <> 0. ENDIF. "if iso_currency_code is initial. ENDFORM. *---------------------------------------------------------------------* * FORM COUNTRY_CODE_ISO_TO_SAP * *---------------------------------------------------------------------* * Converts ISO country code 'iso_country_code' to SAP code in * * 'sap_country_code' * * f_idoc_data, field_name, t_idoc_status and subrc are used for * * for error handling. * *---------------------------------------------------------------------* FORM COUNTRY_CODE_ISO_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING ISO_COUNTRY_CODE LIKE T005-INTCA F_IDOC_DATA STRUCTURE EDIDD FIELD_NAME LIKE BDIDOCSTAT-SEGFLD CHANGING SAP_COUNTRY_CODE LIKE T005-LAND1 SUBRC LIKE SY-SUBRC. * Only convert if the field is not initial. IF ISO_COUNTRY_CODE IS INITIAL. CLEAR SAP_COUNTRY_CODE. ELSE. CALL FUNCTION 'COUNTRY_CODE_ISO_TO_SAP' EXPORTING ISO_CODE = ISO_COUNTRY_CODE IMPORTING SAP_CODE = SAP_COUNTRY_CODE EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. * Put the error message into 't_idoc_status' PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING F_IDOC_DATA SY FIELD_NAME 'country_code_iso_to_sap'. "Form routine ENDIF. "if sy-subrc <> 0. ENDIF. "if iso_country_code is initial. ENDFORM. *---------------------------------------------------------------------* * FORM UNIT_OF_MEASURE_ISO_TO_SAP * *---------------------------------------------------------------------* * Converts ISO unit of measure code 'iso_unit_of_measure' to SAP * * code in 'sap_unit_of_measure'. * * f_idoc_data, field_name, t_idoc_status and subrc are used for * * for error handling. * *---------------------------------------------------------------------* FORM UNIT_OF_MEASURE_ISO_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING ISO_UNIT_OF_MEASURE LIKE T006-ISOCODE F_IDOC_DATA STRUCTURE EDIDD FIELD_NAME LIKE BDIDOCSTAT-SEGFLD CHANGING SAP_UNIT_OF_MEASURE LIKE T006-MSEHI SUBRC LIKE SY-SUBRC. * Only convert the field if it is not empty. IF ISO_UNIT_OF_MEASURE IS INITIAL. CLEAR SAP_UNIT_OF_MEASURE. ELSE. CALL FUNCTION 'UNIT_OF_MEASURE_ISO_TO_SAP' EXPORTING ISO_CODE = ISO_UNIT_OF_MEASURE IMPORTING SAP_CODE = SAP_UNIT_OF_MEASURE EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. * Put the error message into 't_idoc_status' PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING F_IDOC_DATA SY FIELD_NAME 'unit_of_measure_iso_to_sap'. "Form routine ENDIF. "if sy-subrc <> 0. ENDIF. "if iso_unit_of_measure_code is initial. ENDFORM. *---------------------------------------------------------------------* * FORM SHIPPING_INSTRUCT_ISO_TO_SAP * *---------------------------------------------------------------------* * Converts ISO package code 'iso_package_type' to SAP code for * * purchasing shipping instructions in 'sap_shipping_instructions'. * * f_idoc_data, field_name, t_idoc_status and subrc are used for * * for error handling. * *---------------------------------------------------------------------* FORM SHIPPING_INSTRUCT_ISO_TO_SAP TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING ISO_PACKAGE_TYPE LIKE T027A-IVERS F_IDOC_DATA STRUCTURE EDIDD FIELD_NAME LIKE BDIDOCSTAT-SEGFLD CHANGING SAP_SHIPPING_INSTRUCTIONS LIKE T027A-EVERS SUBRC LIKE SY-SUBRC. * Only convert the field if it is not empty. IF ISO_PACKAGE_TYPE IS INITIAL. CLEAR SAP_SHIPPING_INSTRUCTIONS. ELSE. CALL FUNCTION 'ISO_TO_SAP_PACKAGE_TYPE_CODE' EXPORTING ISO_CODE = ISO_PACKAGE_TYPE IMPORTING SAP_CODE = SAP_SHIPPING_INSTRUCTIONS EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. * Put the error message into 't_idoc_status' PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING F_IDOC_DATA SY FIELD_NAME 'shipping_instruct_iso_to_sap'. "Form rout. ENDIF. "if sy-subrc <> 0. ENDIF. "if iso_unit_of_measure_code is initial. ENDFORM. *---------------------------------------------------------------------* * FORM STATUS_FILL_SY_ERROR * *---------------------------------------------------------------------* * Fills the structure t_idoc_status with the import parameters * * plus the relevant sy fields. * *---------------------------------------------------------------------* * --> IDOC_NUMBER IDoc number * * --> SEGNUM Segment number * * --> SEGFLD Field in segment * * --> ROUTID Name of routine * * <-- T_IDOC_STATUS Status fields * *---------------------------------------------------------------------* FORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS STRUCTURE BDIDOCSTAT USING F_IDOC_DATA STRUCTURE EDIDD VALUE(F_SY) STRUCTURE SY SEGFLD LIKE BDIDOCSTAT-SEGFLD ROUTID LIKE BDIDOCSTAT-ROUTID. t_idoc_status-docnum = f_idoc_data-docnum. t_idoc_status-status = c_idoc_status_error. t_idoc_status-msgty = f_sy-msgty. t_idoc_status-msgid = f_sy-msgid. T_IDOC_STATUS-MSGNO = F_SY-MSGNO. t_idoc_status-msgv1 = f_sy-msgv1. t_idoc_status-msgv2 = f_sy-msgv2. t_idoc_status-msgv3 = f_sy-msgv3. t_idoc_status-msgv4 = f_sy-msgv4. t_idoc_status-segnum = f_idoc_data-segnum. t_idoc_status-segfld = segfld. t_idoc_status-repid = f_sy-repid. t_idoc_status-routid = routid. APPEND T_IDOC_STATUS. ENDFORM.