Show TOC

Example documentationExample Program for Processing an IDoc

 

Syntax Syntax

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