Step by step guide for File to IDOC Scenario by using custom program
Step by step guide for File to IDOC Scenario by using custom program
Business Scenario: Warehouse management is maintained in third party system where picking, packing & dispatching happens and later delivery details will be sent through file for which PGI needs to be done in SAP. This document explains the file to IDOC scenario. Through custom program by reading file from application server & perform the PGI with the help of standard ALE/IDOC settings.
IDOC Process: By using custom program, we will read the text file on application server then by preparing control record, data record pass details to std. process by using some std. function modules. Check the attached code for detail understanding. Standard FM then calls the process code DELV which contains FM IDOC_INPUT_DELVRY which process the IDOC.
ALE Configuration details are as follows:
1. 1. Defining Logical System (T-Code – SALE)
Note: Generally the logical systems are available for client of SAP system in which you are working. Please do not create logical systems unnecessarily. Use the existing logical system attached to the client in which you intend to work.
2. Assigning Client to Logical System (T-Code – SALE)
Note: Do not follow this step if logical system is already created and assigned to the client.
3. Standard Message type (Transaction WE81) (Client Independent)
In our scenario we are using standard message type, so no need to maintain any settings.
Note: For custom message type an entry need to be maintained in WE81.
4. Assign IDOC type to the message type (Transaction WE82) (Client Independent)
In our scenario we are using standard message type & basic type, so no need to maintain any settings.
Note: For custom message type, basic type or in case of extension to standard basic type an entry need to be maintained in WE82.
5. Distribution Model (Tcode – BD64)
Distribution Model should already be present in the receiving system as it was distributed from the sending system to the receiving system.
6. Link Message Type to Function Module (WE57) (Client independent)
In our scenario we are using standard message type, basic type & FM, so no need to maintain any settings.
Note: For custom message type, basic type or in case of extension to standard basic type an entry need to be maintained in WE57.
7. Maintain partner profile (Transaction code WE20) for the message type you defined in WE81:
Double click on Inbound parameter SHPCON.
Double click on process code DELV .
8. 8. Custom Program details
Selection screen:
Output:
Field Mapping:
Seq No | Start Position | Length | Format | Segment | Field | Field Type | Length | Field Values |
---|---|---|---|---|---|---|---|---|
1 | 1 | 20 | Character | E2EDL20 | VBELN | CHAR | 10 | SAP Delivery No. |
2 | 21 | 9 | Character | Field value sent by third party system not required in SAP | ||||
3 | 30 | 9 | Character | E2EDL20 | LIFEX | CHAR | 16 | External Identification of Delivery Note (Invoice Number) |
4 | 39 | 10 | Date | Field value sent by third party system not required in SAP | ||||
5 | Character | E2EDL20 | TRATY | CHAR | 4 | Means of Trasport Id (default ‘0004’) | ||
6 | 49 | 20 | Character | E2EDL20 | TRAID | CHAR | 20 | Tracking Id (Means of Transport Id) |
7 | 69 | 34 | Character | E2EDL20 | BOLNR | CHAR | 35 | Bill of Lading (Shipment Tracking Id) |
Code:
*&---------------------------------------------------------------------*
*& Report YTEST_FILE_TO_IDOC
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ytest_file_to_idoc NO STANDARD PAGE HEADING.
***********************************************************************
* Types Declaration
***********************************************************************
TYPES : BEGIN OF ty_final1,
vbeln TYPE char20,
mfst_id TYPE char9,
lifex TYPE char9,
mfst_dt TYPE char10,
traid TYPE char20,
bolnr TYPE char34,
END OF ty_final1,
BEGIN OF ty_final,
vbeln TYPE char10,
mfst_id TYPE char9,
lifex TYPE char35,
mfst_dt TYPE char10,
traid TYPE char20,
bolnr TYPE char34,
error TYPE char1,
END OF ty_final,
BEGIN OF ty_lips,
vbeln TYPE vbeln_vl,
posnr TYPE posnr_vl,
matnr TYPE matnr,
lfimg TYPE lfimg,
END OF ty_lips,
BEGIN OF ty_alv,
docnum TYPE edi_docnum,
status TYPE edi_status,
msg_txt TYPE char100,
END OF ty_alv.
DATA : gt_final TYPE STANDARD TABLE OF ty_final,
gs_final1 TYPE ty_final1,
gs_final TYPE ty_final,
gt_lips TYPE STANDARD TABLE OF ty_lips,
gs_lips TYPE ty_lips,
gs_edidc TYPE edidc,
gs_idoc_control TYPE edi_dc,
gs_edk21 TYPE edk21,
gs_edd21 TYPE edd21,
gt_data TYPE STANDARD TABLE OF edi_dd,
gt_alv TYPE STANDARD TABLE OF ty_alv,
gs_alv TYPE ty_alv,
gv_input_file TYPE rlgrap-filename,
gt_dir_list TYPE STANDARD TABLE OF epsfili,
gs_dir_list TYPE epsfili.
***********************************************************************
* CONSTANTS
***********************************************************************
CONSTANTS : g_c_e1edl20 TYPE e1edl20 VALUE 'E1EDL20',
g_c_e1edl18 TYPE e1edl18 VALUE 'E1EDL18',
g_c_e1edl24 TYPE e1edl24 VALUE 'E1EDL24',
g_c_traty TYPE char4 VALUE '0004',
g_c_pgi TYPE char3 VALUE 'PGI',
g_c_pic TYPE char3 VALUE 'PIC',
g_c_chg TYPE char3 VALUE 'CHG',
g_c_in TYPE edi_direc3 VALUE '2',
g_c_sndpor TYPE edi_sndpo3 VALUE 'A000000026',
g_c_mestyp TYPE edi_mestp3 VALUE 'SHPCON',
g_c_doctyp TYPE edi_doctp3 VALUE 'DELVRY03',
g_c_sndprt TYPE edi_sndpt3 VALUE 'LS',
g_c_rcvprt TYPE edi_rcvpt3 VALUE 'LS',
g_c_slash TYPE char1 VALUE '/'.
***********************************************************************
* Selection Screen
***********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS: p_import TYPE rlgrap-filename OBLIGATORY MODIF ID arc,
p_prefix TYPE rlgrap-filename OBLIGATORY DEFAULT
'PGI_test*'.
SELECTION-SCREEN SKIP 1.
PARAMETERS : p_part TYPE edi_rcvprn OBLIGATORY.
SELECTION-SCREEN END OF BLOCK blk1.
***********************************************************************
* Start of Selection
***********************************************************************
START-OF-SELECTION.
PERFORM get_files_from_dir.
* Fill control record of idoc
PERFORM fill_control_record.
LOOP AT gt_dir_list INTO gs_dir_list.
* Read data from application server
PERFORM read_data_from_file.
* Validate the file data
PERFORM validate_data.
* Prepare control data,
PERFORM prepare_data.
ENDLOOP.
***********************************************************************
* End of Selection
***********************************************************************
END-OF-SELECTION.
* Display ALV for Succes & Error
PERFORM display_log.
*&---------------------------------------------------------------------*
*& Form fill_control_record
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM fill_control_record .
* Fill in the details of sending system
* Client no
gs_idoc_control-mandt = sy-mandt.
* Direction of IDOC (Inbound)
gs_idoc_control-direct = g_c_in.
* Sender port
gs_idoc_control-sndpor = g_c_sndpor.
* Sender message type
gs_idoc_control-mestyp = g_c_mestyp.
* Sender document/basic type
gs_idoc_control-doctyp = g_c_doctyp.
* Partner number
gs_idoc_control-sndprn = p_part.
* Partner type
gs_idoc_control-sndprt = g_c_sndprt.
* Check if partner profile exists for sending system
CLEAR gs_edk21.
gs_edk21-sndprn = gs_idoc_control-sndprn.
gs_edk21-sndprt = gs_idoc_control-sndprt.
gs_edk21-sndpfc = gs_idoc_control-sndpfc.
gs_edk21-mestyp = gs_idoc_control-mestyp.
gs_edk21-mescod = gs_idoc_control-mescod.
gs_edk21-mesfct = gs_idoc_control-mesfct.
gs_edk21-test = gs_idoc_control-test.
CALL FUNCTION 'EDI_AGREE_IN_MESSTYPE_READ'
EXPORTING
rec_edk21 = gs_edk21
IMPORTING
rec_edd21 = gs_edd21
EXCEPTIONS
db_error = 1
entry_not_exist = 2
OTHERS = 3.
IF sy-subrc <> 0.
WRITE: / 'Check the control record'(002).
STOP.
ENDIF.
* Partner type
gs_idoc_control-rcvprt = g_c_rcvprt.
* Partner no
gs_idoc_control-rcvprn = p_part.
ENDFORM. " fill_control_record
*&---------------------------------------------------------------------*
*& Form read_data_from_file
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM read_data_from_file .
DATA : lv_string TYPE string,
lv_err_msg(100) TYPE c.
CLEAR : gv_input_file, gt_final.
CONCATENATE p_import g_c_slash gs_dir_list-name
INTO gv_input_file.
IF gv_input_file IS NOT INITIAL.
* Open file to read data
OPEN DATASET gv_input_file FOR INPUT IN TEXT MODE ENCODING DEFAULT
MESSAGE lv_err_msg.
* Check for return value.
IF sy-subrc = 0. "Error in opening the file
* Read data from file
DO.
READ DATASET gv_input_file INTO lv_string.
IF sy-subrc = 0.
CLEAR: gs_final, gs_final1.
* Move file data in to internal table format
gs_final1 = lv_string.
CONDENSE gs_final1-vbeln.
gs_final-vbeln = gs_final1-vbeln.
* Convert the Delivery no from external format to internal format
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_final-vbeln
IMPORTING
output = gs_final-vbeln.
gs_final-lifex = gs_final1-lifex.
gs_final-traid = gs_final1-traid.
gs_final-bolnr = gs_final1-bolnr.
APPEND gs_final TO gt_final.
CLEAR : gs_final,gs_final1.
ELSE.
EXIT.
ENDIF.
ENDDO.
ELSE.
WRITE: / 'Error opening the file'(005), gv_input_file.
EXIT.
ENDIF.
* Close the file after reading
CLOSE DATASET gv_input_file.
ENDIF.
ENDFORM. " read_data_from_file
*&---------------------------------------------------------------------*
*& Form validate_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM validate_data .
TYPES : BEGIN OF lty_likp,
vbeln TYPE vbeln_vl,
END OF lty_likp.
DATA : lt_likp TYPE STANDARD TABLE OF lty_likp,
ls_likp TYPE lty_likp.
IF gt_final[] IS NOT INITIAL.
* Get the delivery no
SELECT vbeln
FROM likp
INTO TABLE lt_likp
FOR ALL ENTRIES IN gt_final
WHERE vbeln = gt_final-vbeln.
IF sy-subrc = 0.
SORT lt_likp BY vbeln.
ENDIF.
* Validate the delivery no
LOOP AT gt_final INTO gs_final.
READ TABLE lt_likp INTO ls_likp
WITH KEY vbeln = gs_final-vbeln BINARY SEARCH.
IF sy-subrc <> 0.
WRITE :/ gs_final-vbeln, 'Delivery does not exists'(008).
gs_final-error = 'X'.
MODIFY gt_final FROM gs_final TRANSPORTING error.
ENDIF.
ENDLOOP.
CLEAR gt_lips.
* Get the delivery item data
IF lt_likp[] IS NOT INITIAL.
SELECT vbeln
posnr
matnr
lfimg
FROM lips
INTO TABLE gt_lips
FOR ALL ENTRIES IN lt_likp
WHERE vbeln = lt_likp-vbeln
AND komkz NE space.
IF sy-subrc = 0.
SORT gt_lips BY vbeln.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. " validate_data
*&---------------------------------------------------------------------*
*& Form prepare_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM prepare_data .
LOOP AT gt_final INTO gs_final WHERE error = space.
* Fill the data record of the IDOC
PERFORM fill_data_records USING gs_final.
* Start the IDOC process
PERFORM start_idoc_process.
ENDLOOP.
ENDFORM. " prepare_data
*&---------------------------------------------------------------------*
*& Form fill_data_records
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_FINAL text
*----------------------------------------------------------------------*
FORM fill_data_records USING i_gs_final TYPE ty_final.
DATA : ls_data TYPE edi_dd,
ls_e1edl20 TYPE e1edl20,
ls_e1edl18 TYPE e1edl18,
ls_e1edl24 TYPE e1edl24.
CLEAR gt_data.
* Segment name : E1EDL2
ls_data-segnam = g_c_e1edl20.
* Fields to be pass to IDOC
ls_e1edl20-vbeln = i_gs_final-vbeln.
ls_e1edl20-lifex = i_gs_final-lifex.
ls_e1edl20-traty = g_c_traty.
ls_e1edl20-traid = i_gs_final-traid.
ls_e1edl20-bolnr = i_gs_final-bolnr.
ls_data-sdata = ls_e1edl20.
APPEND ls_data TO gt_data.
CLEAR ls_data.
* For adding the values of fields in file
* Segment Name : 'E1EDL18'
ls_data-segnam = g_c_e1edl18.
* Fields to be pass to IDOC
ls_e1edl18-qualf = g_c_chg. " For changing delivery.
ls_data-sdata = ls_e1edl18.
APPEND ls_data TO gt_data.
CLEAR ls_data.
* For picking the quantity
* Segment Name : 'E1EDL18'
ls_data-segnam = g_c_e1edl18.
* Fields to be pass to IDOC
ls_e1edl18-qualf = g_c_pic. " For picking the qty.
ls_data-sdata = ls_e1edl18.
APPEND ls_data TO gt_data.
CLEAR ls_data.
* For PGI processing
* Segment Name : 'E1EDL18'
ls_data-segnam = g_c_e1edl18.
* Fields to be pass to IDOC
ls_e1edl18-qualf = g_c_pgi. " For posting goods issue
ls_data-sdata = ls_e1edl18.
APPEND ls_data TO gt_data.
CLEAR ls_data.
CLEAR gs_lips.
LOOP AT gt_lips INTO gs_lips WHERE vbeln = i_gs_final-vbeln.
* Segment Name : 'E1EDL24'
ls_data-segnam = g_c_e1edl24.
* Fields to be pass to IDOC
ls_e1edl24-posnr = gs_lips-posnr.
ls_e1edl24-matnr = gs_lips-matnr.
ls_e1edl24-lfimg = gs_lips-lfimg.
ls_data-sdata = ls_e1edl24.
APPEND ls_data TO gt_data.
CLEAR ls_data.
ENDLOOP.
ENDFORM. " fill_data_records
*&---------------------------------------------------------------------*
*& Form start_idoc_process
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM start_idoc_process .
DATA : lv_idoc_num TYPE edidc-docnum,
lv_app_err TYPE edi_help-error_flag,
lv_status TYPE edids,
lv_msg_id TYPE t100-arbgb,
lv_msg_no TYPE t100-msgnr,
lv_msg1 TYPE balm-msgv1,
lv_msg2 TYPE balm-msgv2,
lv_msg3 TYPE balm-msgv3,
lv_msg4 TYPE balm-msgv4.
* Call inbound processing for transferred IDoc
CALL FUNCTION 'IDOC_INBOUND_SYNCHRONOUS'
EXPORTING
int_edidc = gs_idoc_control
online = 'B'
IMPORTING
docnum = lv_idoc_num
error_before_call_application = lv_app_err
TABLES
int_edidd = gt_data
EXCEPTIONS
idoc_not_saved = 1
OTHERS = 2.
IF sy-subrc <> 0 AND
sy-msgid IS NOT INITIAL AND
sy-msgno IS NOT INITIAL.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF lv_idoc_num IS NOT INITIAL.
* Open IDoc for reading
CALL FUNCTION 'EDI_DOCUMENT_OPEN_FOR_READ'
EXPORTING
document_number = lv_idoc_num
IMPORTING
idoc_control = gs_edidc
EXCEPTIONS
document_foreign_lock = 1
document_not_exist = 2
document_number_invalid = 3
OTHERS = 4.
IF sy-subrc <> 0 AND
sy-msgid IS NOT INITIAL AND
sy-msgno IS NOT INITIAL.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Read last/current status record for IDoc
CALL FUNCTION 'EDI_DOCUMENT_READ_LAST_STATUS'
EXPORTING
document_number = lv_idoc_num
IMPORTING
status = lv_status
EXCEPTIONS
document_not_open = 1
no_status_record_found = 2
OTHERS = 3.
IF sy-subrc <> 0 AND
sy-msgid IS NOT INITIAL AND
sy-msgno IS NOT INITIAL.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
gs_alv-docnum = lv_idoc_num.
gs_alv-status = lv_status-status.
lv_msg_id = lv_status-stamid.
lv_msg_no = lv_status-stamno.
lv_msg1 = lv_status-stapa1.
lv_msg2 = lv_status-stapa2.
lv_msg3 = lv_status-stapa3.
lv_msg4 = lv_status-stapa4.
CALL FUNCTION 'MESSAGE_PREPARE'
EXPORTING
language = sy-langu
msg_id = lv_msg_id
msg_no = lv_msg_no
msg_var1 = lv_msg1
msg_var2 = lv_msg2
msg_var3 = lv_msg3
msg_var4 = lv_msg4
IMPORTING
msg_text = gs_alv-msg_txt
EXCEPTIONS
function_not_completed = 1
message_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0 AND
sy-msgid IS NOT INITIAL AND
sy-msgno IS NOT INITIAL.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ENDIF.
ENDIF.
ENDFORM. " start_idoc_process
*&---------------------------------------------------------------------*
*& Form get_files_from_dir
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_files_from_dir .
DATA: lv_dir_name TYPE epsf-epsdirnam,
lv_file_mask TYPE epsf-epsfilnam,
lv_msg_id TYPE t100-arbgb,
lv_msg_no TYPE t100-msgnr,
lv_msg1 TYPE balm-msgv1,
lv_msg2 TYPE balm-msgv2,
lv_msg3 TYPE balm-msgv3,
lv_msg4 TYPE balm-msgv4,
lv_error(75) TYPE c.
* To read all the files related
lv_dir_name = p_import.
lv_file_mask = p_prefix.
CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
EXPORTING
dir_name = lv_dir_name
file_mask = lv_file_mask
TABLES
dir_list = gt_dir_list
EXCEPTIONS
invalid_eps_subdir = 1
sapgparam_failed = 2
build_directory_failed = 3
no_authorization = 4
read_directory_failed = 5
too_many_read_errors = 6
empty_directory_list = 7
OTHERS = 8.
IF sy-subrc <> 0.
lv_msg_id = sy-msgid.
lv_msg_no = sy-msgno.
lv_msg1 = sy-msgv1.
lv_msg2 = sy-msgv2.
lv_msg3 = sy-msgv3.
lv_msg4 = sy-msgv4.
CALL FUNCTION 'MESSAGE_PREPARE'
EXPORTING
language = sy-langu
msg_id = lv_msg_id
msg_no = lv_msg_no
msg_var1 = lv_msg1
msg_var2 = lv_msg2
msg_var3 = lv_msg3
msg_var4 = lv_msg4
IMPORTING
msg_text = lv_error
EXCEPTIONS
function_not_completed = 1
message_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0 AND
sy-msgid IS NOT INITIAL AND
sy-msgno IS NOT INITIAL.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
WRITE:/ lv_error.
ENDIF.
IF gt_dir_list IS INITIAL.
WRITE: / 'No files found in the Application server Path'(101).
STOP.
ENDIF.
ENDFORM. " get_files_from_dir
*&---------------------------------------------------------------------*
*& Form display_log
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM display_log .
NEW-LINE.
FORMAT COLOR COL_HEADING INTENSIFIED.
IF gt_alv[] IS NOT INITIAL.
ULINE AT 1(100).
WRITE: /1 '|', 'IDOC Number'(011),
25 '|', 'Status'(012),
35 '|', 'IDOC Message'(013),
100 '|'.
FORMAT COLOR INTENSIFIED OFF.
NEW-LINE.
ULINE AT 1(100).
ENDIF.
LOOP AT gt_alv INTO gs_alv.
WRITE :/1 '|', gs_alv-docnum,
25 '|', gs_alv-status,
35 '|', gs_alv-msg_txt,
100 '|'.
ENDLOOP.
NEW-LINE.
IF gt_alv[] IS NOT INITIAL.
ULINE AT 1(100).
ENDIF.
ENDFORM. " display_log
Sample Test record :
10001067 0003205670123456782013-05-08SORTE 4200233093055200934079000123456780
Thank you very much for sharing this! It is a very exhaustive and easy to follow example.