
Title
An IDOC data extraction method using an RFC Function Module.
Introduction
The blog describes the process of extracting IDOC data from its multiple segments and sending it to a destination system using an RFC function module.
The RFC Function Module is a custom interface that works on a remote function call protocol and sends extracted data to another system.
To do so, we need to Identify the following objects:
Summary
An IDOC consists of three records: a control record, a data record, and a status record, and it is recognized by a message type in an SAP system.
The control record contains information such as the IDOC type, message type, status, sender, and receiver, and it is stored in the EDIDC table.
The data record contains the IDOC segment data and it is stored in the EDID4 table.
The status record contains the processing status of the IDOC, and it is stored in the EDIDS table. E.g., a successful processing status of an inbound IDOC is "53".
An IDOC segment is a structure that consists of several fields containing data and it is stored in the SDATA field of the EDID4 table.
To extract the IDOC data from its multiple segments along with its control and status data, we will use these tables inside an RFC wrapper and send it to a destination system.
To demonstrate the above process, we have considered an example of a message type "REMADV", and its segments "E1IDKU1" and "E1EDK02".
In the first step, the RFC Function module extracts the status and control data for the message type "REMADV" from the EDIDS and EDIDC tables. Thereafter, it extracts its segment data from the EDID4 table.
Finally, the collected data is passed to an export structure of the RFC with error messages, if any.
Step-by-step process to extract the IDOC data from its multiple segments using an RFC Function Module.
Step 1. Create a structure with the fields that are required by the destination system.
Image Description: Structure of the export parameter "EX_IDOC_DATA" of the RFC Function Module
Step 2. Create an RFC function module.
Image Description: Import Parameters of the RFC Function Module
Image Description: Export Parameters of the RFC Function Module
Step 3. Below is the sample code of the RFC Function Module
FUNCTION ZFM_RFC_IDOC_DATA . *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(IM_FROM_DAT) TYPE EDIDC-CREDAT *" VALUE(IM_TO_DAT) TYPE EDIDC-CREDAT *" VALUE(IM_SNDPRN) TYPE EDIDC-SNDPRN OPTIONAL *" VALUE(IM_STATUS) TYPE EDIDC-STATUS *" EXPORTING *" VALUE(EX_IDOC_DATA) TYPE ZTT_IDOC_DATA *" VALUE(EX_RETURN) TYPE BAPIRETURN *"---------------------------------------------------------------------- *-----------------------------------------------------------------------* *-----------------------------------------------------------------------* *-----------------------------------------------------------------------* * The routine extracts the IDOC data for the message type "REMADV" . PERFORM get_idoc_s_data USING im_from_dat im_to_dat im_sndprn im_status CHANGING ex_idoc_data . * The routine gets the error messages PERFORM error_msg USING gv_rc CHANGING ex_return. ENDFUNCTION. TABLES : edidc,edid4,edids. TYPES : BEGIN OF tt_e1idku1. INCLUDE STRUCTURE e1idku1. TYPES : END OF tt_e1idku1. TYPES : BEGIN OF tt_e1edk02. INCLUDE STRUCTURE e1edk02. TYPES : END OF tt_e1edk02. TYPES : BEGIN OF tt_idoc_data. INCLUDE STRUCTURE zidoc_data. TYPES : END OF tt_idoc_data. DATA : gl_edid4 TYPE edid4 . DATA : gt_edid4 TYPE STANDARD TABLE OF edid4. DATA : gt_edids TYPE STANDARD TABLE OF edids. DATA : gs_e1idku1 TYPE tt_e1idku1. DATA : gs_e1edk02 TYPE tt_e1edk02. DATA : gs_idoc_data TYPE tt_idoc_data. DATA : gt_idoc_data TYPE STANDARD TABLE OF tt_idoc_data. DATA : gt_edidc TYPE STANDARD TABLE OF edidc. DATA : gv_cntr TYPE edids-countr. DATA : gv_str TYPE string. DATA : gv_rc TYPE sy-subrc. CONSTANTS : c_mestyp TYPE edidc-mestyp VALUE 'REMADV'. CONSTANTS : c_segnam1 TYPE edid4-segnam VALUE 'E1IDKU1'. CONSTANTS : c_segnam2 TYPE edid4-segnam VALUE 'E1EDK02'. RANGES: r_date FOR edidc-credat. FIELD-SYMBOLS : <gf_edidc> LIKE LINE OF gt_edidc. FIELD-SYMBOLS : <gf_edid4> LIKE LINE OF gt_edid4. FIELD-SYMBOLS : <gf_edids> LIKE LINE OF gt_edids. *&---------------------------------------------------------------------* *& Form GET_IDOC_S_DATA *&---------------------------------------------------------------------* * Get the IDOC data *----------------------------------------------------------------------* * -->P_IM_FROM_DAT text * -->P_IM_TO_DAT text * -->P_IM_SNDPRN text * -->P_IM_STATUS text * <--P_EX_IDOC_DATA text *----------------------------------------------------------------------* FORM get_idoc_s_data USING p_im_credat_from p_im_credat_to p_im_sndprn p_im_status CHANGING p_ex_idoc_data TYPE ztt_idoc_data . CLEAR gv_rc. * Build date range for EDIDC selection PERFORM build_date_range USING p_im_credat_from p_im_credat_to. * Get the IDOC Data from EDIDC,EDID4 & EDIDS tables PERFORM get_idoc_data TABLES gt_idoc_data USING p_im_status p_im_sndprn. * Pass the final data to the exporting table IF gv_rc EQ 0. p_ex_idoc_data[] = gt_idoc_data[]. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form BUILD_DATE_RANGE *&---------------------------------------------------------------------* * Build the date range *----------------------------------------------------------------------* * -->P_P_IM_CREDAT_FROM text * -->P_P_IM_CREDAT_TO text *----------------------------------------------------------------------* FORM build_date_range USING p_im_credat_from p_im_credat_to. FREE r_date. r_date-sign = 'I'. r_date-option = 'BT'. r_date-low = p_im_credat_from. r_date-high = p_im_credat_to. APPEND r_date. ENDFORM. *&---------------------------------------------------------------------* *& Form GET_IDOC_DATA *&---------------------------------------------------------------------* * Get the IDOC data *----------------------------------------------------------------------* * -->P_GT_IDOC_DATA text * -->P_P_IM_STATUS text * -->P_P_IM_SNDPRN text *----------------------------------------------------------------------* FORM get_idoc_data TABLES gt_idoc_data USING p_im_status p_im_sndprn. FREE gt_idoc_data. FREE gt_edidc. * Get the IDOC data from the EDIDC table SELECT status docnum mestyp sndprn credat cretim idoctp FROM edidc INTO CORRESPONDING FIELDS OF TABLE gt_edidc WHERE status EQ p_im_status AND credat IN r_date AND sndprn EQ p_im_sndprn AND mestyp EQ c_mestyp. IF sy-subrc EQ 0. IF gt_edidc[] IS NOT INITIAL. UNASSIGN <gf_edidc>. LOOP AT gt_edidc ASSIGNING <gf_edidc>. CLEAR gs_idoc_data. gs_idoc_data-docnum = <gf_edidc>-docnum. gs_idoc_data-status = <gf_edidc>-status. gs_idoc_data-mestyp = <gf_edidc>-mestyp. gs_idoc_data-sndprn = <gf_edidc>-sndprn. gs_idoc_data-credat = <gf_edidc>-credat. gs_idoc_data-cretim = <gf_edidc>-cretim. gs_idoc_data-idoctp = <gf_edidc>-idoctp. * Get the IDOC data of E1IDKU1 from EDID4 table PERFORM get_idoc_segment_data USING c_segnam1 CHANGING gs_idoc_data. * Get the IDOC data of E1EDK02 from EDID4 table PERFORM get_idoc_segment_data USING c_segnam2 CHANGING gs_idoc_data. * Append the IDOC data to the final internal table APPEND gs_idoc_data TO gt_idoc_data. ENDLOOP. ENDIF. ELSE. gv_rc = 1. ENDIF. IF gt_idoc_data[] IS NOT INITIAL. gv_rc = 0. ELSE. gv_rc = 1. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form GET_IDOC_SEGMENT_DATA *&---------------------------------------------------------------------* * Get the IDOC segment data *----------------------------------------------------------------------* * -->P_C_SEGNAM1 text * <--P_GS_IDOC_DATA text *----------------------------------------------------------------------* FORM get_idoc_segment_data USING p_segnam CHANGING gs_idoc_data . * Get the IDOC segment data from the EDID4 table FREE gt_edid4. SELECT * FROM edid4 UP TO 1 ROWS INTO CORRESPONDING FIELDS OF TABLE gt_edid4 WHERE docnum EQ <gf_edidc>-docnum AND segnam EQ p_segnam. IF sy-subrc EQ 0. IF gt_edid4[] IS NOT INITIAL. UNASSIGN <gf_edid4>. LOOP AT gt_edid4 ASSIGNING <gf_edid4>. CASE p_segnam. WHEN 'E1IDKU1'. CLEAR gs_e1idku1. gs_e1idku1 = <gf_edid4>-sdata. MOVE-CORRESPONDING gs_e1idku1 TO gs_idoc_data. WHEN 'E1EDK02'. CLEAR gs_e1edk02. gs_e1edk02 = <gf_edid4>-sdata. MOVE-CORRESPONDING gs_e1edk02 TO gs_idoc_data. WHEN OTHERS. EXIT. ENDCASE. * Get the IDOC Status Text from the EDIDS table PERFORM get_idoc_status_text CHANGING gs_idoc_data. ENDLOOP. ENDIF. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form GET_IDOC_STATUS_TEXT *&---------------------------------------------------------------------* * Get the IDOC status text *----------------------------------------------------------------------* * <--P_GS_IDOC_DATA text *----------------------------------------------------------------------* FORM get_idoc_status_text CHANGING p_gs_idoc_data TYPE tt_idoc_data. * Get the last counter value from the EDIDS table CLEAR gv_cntr. SELECT MAX( countr ) INTO gv_cntr FROM edids WHERE docnum EQ <gf_edid4>-docnum. IF sy-subrc EQ 0. * Get the IDOC status text from the EDIDS table FREE gt_edids. SELECT * FROM edids UP TO 1 ROWS INTO CORRESPONDING FIELDS OF TABLE gt_edids WHERE docnum EQ <gf_edid4>-docnum AND countr EQ gv_cntr. IF sy-subrc EQ 0. UNASSIGN <gf_edids>. LOOP AT gt_edids ASSIGNING <gf_edids>. CLEAR gv_str. CONCATENATE <gf_edids>-stapa1 <gf_edids>-stapa2 <gf_edids>-stapa3 <gf_edids>-stapa4 INTO gv_str SEPARATED BY space. REPLACE ALL OCCURRENCES OF '&'IN <gf_edids>-statxt WITH gv_str. gs_idoc_data-statxt = <gf_edids>-statxt. ENDLOOP. ENDIF. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form Error_MSG *&---------------------------------------------------------------------* * Get the error messages *----------------------------------------------------------------------* * -->P_EX_IDOC_DATA text * <--P_EX_RETURN text *----------------------------------------------------------------------* FORM error_msg USING p_gv_rc TYPE sy-subrc CHANGING p_ex_return TYPE bapireturn. IF p_gv_rc EQ 0. p_ex_return-type = 'S'. p_ex_return-code = '001'. p_ex_return-message = 'Success.'. ELSE. p_ex_return-type = 'E'. p_ex_return-code = '002'. p_ex_return-message = 'Error.'. ENDIF. ENDFORM.
Step 4. Execute the RFC Function Module.
Image description: Input Parameters of the RFC Function module.
Output:
Image description: Output of the RFC Function module.
Conclusion
The blog provides a method for businesses to track their IDOC status and act as an effective tool to mitigate IDOC failures between SAP and non-SAP systems.
I hope this article was insightful.
Any comments or suggestions will be appreciated.
Pls follow the following pages for SAP ABAP Development and post your answers & questions:
ABAP Development Environment Topic Page:
https://community.sap.com/topics/abap
Post and answer questions:
https://answers.sap.com/tags/833755570260738661924709785639136
And read other posts on the topic:
https://blogs.sap.com/tags/833755570260738661924709785639136
Thank you.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
7 | |
3 | |
3 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 |