FUNCTION IDOC_INPUT_XAMPLE3. *"--------------------------------------------------------------------- *" *"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 * - serialization * - customer-exits * * without - 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. * >>>>>>>>>>>>> Customer exit 1 (Start) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< * This exit gives the customer access to the IDoc's control record, * the import parameters and allows the customer to do serialization. CALL CUSTOMER-FUNCTION '001' EXPORTING INPUT_METHOD = INPUT_METHOD MASS_PROCESSING = MASS_PROCESSING TABLES IDOC_SERIAL = SERIALIZATION_INFO IDOC_DATA = IDOC_DATA IDOC_CONTROL = IDOC_CONTRL EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. PERFORM STATUS_FILL_SY_ERROR TABLES IDOC_STATUS USING IDOC_DATA SY ' ' 'customer-function 001'. ENDIF. * >>>>>>>>>>>>> Customer exit 1 (End) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< PERFORM IDOC_PROCESS_XAMPLE3 TABLES IDOC_DATA IDOC_STATUS USING IDOC_CONTRL CHANGING OBJECT_NUMBER SUBRC. * Fill the ALE export parameters * In this example we assume that 'call function 'xxx' in update task' * * is not used to update the database. 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. * >>>>>>>>>>>>> Customer exit 3 (Start) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< * This exit gives the customer access to the parameters. CALL CUSTOMER-FUNCTION '003' CHANGING SUBRC = SUBRC WORKFLOW_RESULT = WORKFLOW_RESULT APPLICATION_VARIABLE = APPLICATION_VARIABLE IN_UPDATE_TASK = IN_UPDATE_TASK TABLES RETURN_VARIABLES = RETURN_VARIABLES. * >>>>>>>>>>>>> Customer exit 3 (End) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ENDFUNCTION. *---------------------------------------------------------------------* * FORM IDOC_PROCESS_XAMPLE3 * *---------------------------------------------------------------------* * 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_XAMPLE3 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_INTERPRET3 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_INTERPRET3 * *---------------------------------------------------------------------* * This routine checks that the correct message type is being used, * * then checks that the IDoc has not been overtaken (serialization), * * 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_INTERPRET3 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. * >>>>>>>>>>>>> Customer exit 2 (Start) <<<<<<<<<<<<<<<<<<<<<<<<<<<<< * This exit is called after each SAP segment has been processed, and * it is called every time a customer segment appears. CALL CUSTOMER-FUNCTION '002' EXPORTING CURRENT_SEGEMENT = T_IDOC_DATA XHEAD_IN = F_XHEAD SUBRC_IN = SUBRC IMPORTING XHEAD_OUT = F_XHEAD TABLES XITEM = T_XITEM EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. SUBRC = 1. PERFORM STATUS_FILL_SY_ERROR TABLES T_IDOC_STATUS USING T_IDOC_DATA SY ' ' 'customer-function 002'. ENDIF. * >>>>>>>>>>>>> Customer exit 2 (End) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ENDLOOP. ENDFORM.