Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

interface code required........................IDOC

Former Member
0 Kudos
255

I need some sample code so as how to update data using IDOC for inbound interface.

Step by step procedure willl be very helpful starting from very basic...........................................AS I AM VERY NEW TO IT.

3 REPLIES 3

Former Member
0 Kudos
108

Hi,

• populates a BDC table with the IDoc info;

• calls the transaction via a BDC call; and

• updates the IDoc status according to the BDC error status.

EXTRACT FROM: Z_IDOC_INPUT_ZINVRV

*--- Declaration of local variables

DATA: C_SEGNAM(10) TYPE C VALUE 'Z1INVRV'.

*-Loop through the IDOCs

LOOP AT IDOC_CONTRL.

*---Loop through the data for the IDOC

LOOP AT IDOC_DATA WHERE DOCNUM = IDOC_CONTRL-DOCNUM.

CASE IDOC_DATA-SEGNAM.

WHEN C_SEGNAM.

  • Here we get the info from the idoc table

IT_Z1INVRV = IDOC_DATA-SDATA.

ENDCASE.

PERFORM REV_INV.

ENDLOOP.

PERFORM UPDATE_IDOC_STATUS.

ENDLOOP.

FORM REV_INV "Reverse invoice form

*--- Local variables & constants

DATA: C_TCODE LIKE BKPF-TCODE VALUE 'VF11'. "BDC transaction code

*--- Now we can build the bdc table to call the reversal transaction start of screen 109

CLEAR BDC_TAB.

BDC_TAB-PROGRAM = 'SAPMV60A'.

BDC_TAB-DYNPRO = '109'.

BDC_TAB-DYNBEGIN = 'X'.

APPEND BDC_TAB.

*--- Document number

CLEAR BDC_TAB.

BDC_TAB-FNAM = 'KOMFK-VBELN(01)'.

BDC_TAB-FVAL = IT_Z1INVRV-XBLNR. "Billing document number

APPEND BDC_TAB.

*--- OK Code for screen 109

CLEAR BDC_TAB.

BDC_TAB-FNAM = 'BDC_OKCODE'.

BDC_TAB-FVAL = 'SICH'.

APPEND BDC_TAB.

*--- Now we can call transaction 'VF11' with the populated bdc table. The transaction is called inside the idoc-contrl loop, so a transaction will be called for every idoc (journal). the transaction is called in no-display mode ('N') because this code runs in background as it is called by ale. The update is specified to be synchronous ('S') because we have to wait for the result to update the idoc status correctly.

CALL TRANSACTION C_TCODE USING BDC_TAB MODE 'N' UPDATE 'S'.

*--- Store the return code for use in another form (status update)

RETURN_CODE = SY-SUBRC.

*--- Here we check the return code, if there was an error, we put the transaction in a bdc session for the user to review and correct.

IF SY-SUBRC NE 0.

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING

CLIENT = SY-MANDT

GROUP = 'ZINVRV'

USER = C_ALE_USER

KEEP = 'X'.

CALL FUNCTION 'BDC_INSERT'

EXPORTING

TCODE = C_TCODE

TABLES

DYNPROTAB = BDC_TAB.

CALL FUNCTION 'BDC_CLOSE_GROUP'

EXCEPTIONS

NOT_OPEN = 1

QUEUE_ERROR = 2

OTHERS = 3.

ELSE. "No problems

C_EXISTS = 'N'.

  • Select from the billing document table to get sales doc number

SELECT * FROM VBRP WHERE VBELN = IT_Z1INVRV-XBLNR.

  • Select from the sales document table to get user status number

SELECT SINGLE * FROM VBAP WHERE VBELN = VBRP-AUBEL AND

POSNR = VBRP-AUPOS.

  • Select from the status table to change the user status to pending

SELECT * FROM JEST WHERE OBJNR = VBAP-OBJNR AND

STAT LIKE C_USER_STATUS.

IF JEST-STAT = C_US_PENDING. "User status is pending

JEST-INACT = C_UNCHECKED. "Make pending the active status

UPDATE JEST.

C_EXISTS = 'Y'. "I.E. An entry is already in table

ELSEIF JEST-INACT = C_UNCHECKED AND JEST-STAT NE C_US_PENDING.

JEST-INACT = C_CHECKED. "Make everything else inactive

UPDATE JEST.

ENDIF.

ENDSELECT.

IF C_EXISTS = 'N'. "I.E. Pending has never been a status before

JEST-OBJNR = VBAP-OBJNR.

JEST-STAT = C_US_PENDING.

JEST-INACT = C_UNCHECKED. "Make pending the active status

INSERT JEST.

ENDIF.

ENDSELECT. "Select from VBRP (Billing document table)

ENDIF.

ENDFORM. " REV_INV

FORM UPDATE_IDOC_STATUS.

*--- Now we check the CALL TRANSACTION return code and set IDOC status

CLEAR IDOC_STATUS.

IF RETURN_CODE = 0.

WORKFLOW_RESULT = '0'.

IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.

IDOC_STATUS-STATUS = '53'.

IDOC_STATUS-UNAME = SY-UNAME.

IDOC_STATUS-REPID = SY-REPID.

IDOC_STATUS-MSGTY = SY-MSGTY.

IDOC_STATUS-MSGID = SY-MSGID.

IDOC_STATUS-MSGNO = SY-MSGNO.

IDOC_STATUS-MSGV1 = SY-MSGV1.

IDOC_STATUS-MSGV2 = SY-MSGV2.

IDOC_STATUS-MSGV3 = SY-MSGV3.

IDOC_STATUS-MSGV4 = SY-MSGV4.

RETURN_VARIABLES-WF_PARAM = 'Processed_IDOCs'.

RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM.

APPEND RETURN_VARIABLES.

ELSE.

WORKFLOW_RESULT = '99999'.

IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.

IDOC_STATUS-STATUS = '51'.

IDOC_STATUS-UNAME = SY-UNAME.

IDOC_STATUS-REPID = SY-REPID.

IDOC_STATUS-MSGTY = SY-MSGTY.

IDOC_STATUS-MSGID = SY-MSGID.

IDOC_STATUS-MSGNO = SY-MSGNO.

IDOC_STATUS-MSGV1 = SY-MSGV1.

IDOC_STATUS-MSGV2 = SY-MSGV2.

IDOC_STATUS-MSGV3 = SY-MSGV3.

IDOC_STATUS-MSGV4 = SY-MSGV4.

RETURN_VARIABLES-WF_PARAM = 'ERROR_IDOCS'.

RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM.

APPEND RETURN_VARIABLES.

ENDIF.

APPEND IDOC_STATUS.

ENDFORM. " UPDATE_IDOC_STATUS

Regards

ferry_lianto
Active Contributor
0 Kudos
108

Hi,

Please check this link for sample codes on how to update IDoc segment.

http://www.erpgenie.com/sapedi/idoc_abap.htm

Regards,

Ferry Lianto

Please reward points if helpful.

former_member235056
Active Contributor
0 Kudos
108

Hi,

Inbound IDOC Status Report for Sales Orders

-


Requirement:

Sales Orders are being created through inbound IDocs using FM 'EDI_DATA_INCOMING'. Now a Report is required to check the status of these Inbound IDocs along with Sales Orders generated against customer Purchase Orders.

-


Processing:

The report selects, 'ORDERS' IDoc numbers & status, generated between given time range, from table EDIDC. Further, it calls Function Module 'IDOC_READ_COMPLETELY' to get the IDoc details. Then required information is extracted by reading relevant field data of IDoc segments.

-


REPORT Z_EDI_FILE_LOAD_STATUS_REPORT .

*----


  • Staus Report for Inbound IDOCs ( Sales Orders )

*----


*----


TABLES : EDIDC.

*----


  • ALV stuff

TYPE-POOLS: SLIS.

DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,

GS_LAYOUT TYPE SLIS_LAYOUT_ALV,

GT_SORT TYPE SLIS_T_SORTINFO_ALV,

GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER.

DATA : BEGIN OF T_REPORT OCCURS 0,

IDOC_NO TYPE EDI_DOCNUM,

IDOC_DATE TYPE SY-DATUM,

IDOC_TIME TYPE SY-UZEIT,

SORDER_NO TYPE VBELN,

STP_NO TYPE KNA1-KUNNR,

STP_NAME(35) TYPE C,

STP_PHONE(12) TYPE C,

PO_NO(15) TYPE C,

STATUS TYPE C,

S_TEXT(70) TYPE C,

ERROR(70) TYPE C,

END OF T_REPORT.

--


PARAMETER--

selection-screen begin of block date with frame title TEXT-S01.

select-options: UDATE for EDIDC-UPDDAT

default SY-datum obligatory, "Changed On

UTIME for EDIDC-UPDTIM . "Changed Time

selection-screen end of block date.

----


INITIALIZATION.

START-OF-SELECTION.

PERFORM SHOW_STATUS_REPORT.

&----


*& Form alv_grid

&----


  • text

----


  • --> p1 text

  • < -- p2 text

----


FORM ALV_GRID.

IF GT_FIELDCAT[] IS INITIAL.

PERFORM FIELDCAT_INIT.

PERFORM LAYOUT_INIT.

PERFORM SORT_INIT.

ENDIF.

PERFORM GRID_DISPLAY.

ENDFORM. "alv_grid

&----


*& Form layout_init

&----


FORM LAYOUT_INIT.

GS_LAYOUT-ZEBRA = 'X'.

GS_LAYOUT-CELL_MERGE = 'X'.

GS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

GS_LAYOUT-NO_VLINE = ' '.

GS_LAYOUT-TOTALS_BEFORE_ITEMS = ' '.

ENDFORM. " layout_init

&----


*& Form fieldcat_init

&----


FORM FIELDCAT_INIT.

DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'IDOC_NO'.

LS_FIELDCAT-KEY = 'X'.

LS_FIELDCAT-REPTEXT_DDIC = 'IDOC'.

LS_FIELDCAT-OUTPUTLEN = 10.

  • Fix for ALV print bug, which puts 'N/A' over last digit

  • Set inttype to 'N' to stop corruption of printed ALV cell.

LS_FIELDCAT-INTTYPE = 'N'.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'IDOC_DATE'.

LS_FIELDCAT-REPTEXT_DDIC = 'Creation Date'.

LS_FIELDCAT-OUTPUTLEN = 10.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'IDOC_TIME'.

LS_FIELDCAT-REPTEXT_DDIC = 'Creation Time'.

LS_FIELDCAT-OUTPUTLEN = 8.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'STATUS'.

LS_FIELDCAT-REPTEXT_DDIC = 'St'.

LS_FIELDCAT-OUTPUTLEN = 2.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'ERROR'.

LS_FIELDCAT-REPTEXT_DDIC = 'Message'.

LS_FIELDCAT-OUTPUTLEN = 70.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'STP_NO'.

LS_FIELDCAT-REPTEXT_DDIC = 'S.T.Party No'.

LS_FIELDCAT-OUTPUTLEN = 10.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'STP_NAME'.

LS_FIELDCAT-REPTEXT_DDIC = 'Sold to Party Name'.

LS_FIELDCAT-OUTPUTLEN = 35.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'PO_NO'.

LS_FIELDCAT-REPTEXT_DDIC = 'Purch Order'.

LS_FIELDCAT-OUTPUTLEN = 15.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

CLEAR LS_FIELDCAT.

LS_FIELDCAT-FIELDNAME = 'STP_PHONE'.

LS_FIELDCAT-REPTEXT_DDIC = 'S.T.Party Phone'.

LS_FIELDCAT-OUTPUTLEN = 15.

APPEND LS_FIELDCAT TO GT_FIELDCAT.

ENDFORM. "fieldcat_init

&----


*& Form sort_init

&----


FORM SORT_INIT.

DATA: LS_SORT TYPE SLIS_SORTINFO_ALV.

*

CLEAR LS_SORT.

LS_SORT-FIELDNAME = 'IDOC_DATE'.

LS_SORT-SPOS = 1.

LS_SORT-UP = 'X'.

APPEND LS_SORT TO GT_SORT.

CLEAR LS_SORT.

LS_SORT-FIELDNAME = 'IDOC_TIME'.

LS_SORT-SPOS = 2.

LS_SORT-UP = 'X'.

APPEND LS_SORT TO GT_SORT.

CLEAR LS_SORT.

LS_SORT-FIELDNAME = 'STATUS'.

LS_SORT-SPOS = 3.

LS_SORT-UP = 'X'.

APPEND LS_SORT TO GT_SORT.

CLEAR LS_SORT.

LS_SORT-FIELDNAME = 'IDOC_NO'.

LS_SORT-SPOS = 4.

LS_SORT-UP = 'X'.

APPEND LS_SORT TO GT_SORT.

ENDFORM. "sort_init

&----


*& Form grid_display

&----


FORM GRID_DISPLAY.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

IS_LAYOUT = GS_LAYOUT

IT_FIELDCAT = GT_FIELDCAT

IT_SORT = GT_SORT

i_callback_program = SY-REPID

I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE'

I_DEFAULT = ' '

I_SAVE = 'X'

TABLES

T_OUTTAB = T_REPORT

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2.

ENDFORM. "grid_display

&----


*& Form COMMENT_BUILD

&----


  • Processing of listheader

----


FORM COMMENT_BUILD USING P_FK_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER.

DATA: LS_LINE TYPE SLIS_LISTHEADER.

REFRESH P_FK_LIST_TOP_OF_PAGE.

  • List Heading : Typ H

CLEAR LS_LINE.

LS_LINE-TYP = 'H'.

LS_LINE-INFO = 'Sales Order Interface: Z_EDI_FILE_LOAD'.

APPEND LS_LINE TO P_FK_LIST_TOP_OF_PAGE.

  • List : Typ S

clear LS_LINE.

LS_LINE-typ = 'S'.

LS_LINE-key = 'Date Range:'.

LS_LINE-info = UDATE-low.

if not UDATE-high is initial.

write ' To ' to LS_LINE-info+30.

LS_LINE-info+36 = UDATE-high.

endif.

APPEND LS_LINE TO P_FK_LIST_TOP_OF_PAGE.

ENDFORM. " COMMENT_BUILD

----


  • FORM TOP_OF_PAGE *

----


  • Ereigniss TOP_OF_PAGE *

  • event TOP_OF_PAGE

----


FORM TOP_OF_PAGE.

PERFORM COMMENT_BUILD USING gt_LIST_TOP_OF_PAGE[].

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'

EXPORTING

IT_LIST_COMMENTARY = GT_LIST_TOP_OF_PAGE.

ENDFORM. "TOP_OF_PAGE

&----


*& Form show_status_report

&----


FORM SHOW_STATUS_REPORT .

  • Report to show status.

DATA: BEGIN OF T_TEDS2 OCCURS 0.

INCLUDE STRUCTURE TEDS2.

DATA: END OF T_TEDS2.

DATA: BEGIN OF T_IDOC_CONTROL_TMP OCCURS 0.

INCLUDE STRUCTURE EDIDC.

DATA: END OF T_IDOC_CONTROL_TMP.

CONSTANTS: C_STATUS_IN_IDOC_POSTED LIKE EDIDC-STATUS VALUE '53'.

DATA : T_EDIDS TYPE STANDARD TABLE OF EDIDS WITH HEADER LINE.

DATA : T_EDIDD TYPE STANDARD TABLE OF EDIDD WITH HEADER LINE.

DATA : GV_PARTNER_SEG TYPE E1EDKA1,

GV_PO_REF_SEG TYPE E2EDK02.

  • Get text for status values

SELECT * FROM TEDS2 INTO TABLE T_TEDS2 WHERE LANGUA = SY-LANGU.

  • Read the IDoc's status after processing

SELECT * FROM EDIDC

INTO TABLE T_IDOC_CONTROL_TMP

WHERE UPDDAT IN UDATE

AND UPDTIM IN UTIME

AND MESTYP = 'ORDERS'.

LOOP AT T_IDOC_CONTROL_TMP.

  • IDoc has been processed, since control record changed.

READ TABLE T_TEDS2 WITH KEY STATUS = T_IDOC_CONTROL_TMP-STATUS.

T_REPORT-IDOC_NO = T_IDOC_CONTROL_TMP-DOCNUM.

T_REPORT-IDOC_DATE = T_IDOC_CONTROL_TMP-CREDAT.

T_REPORT-IDOC_TIME = T_IDOC_CONTROL_TMP-CRETIM.

T_REPORT-S_TEXT = T_TEDS2-DESCRP.

IF T_IDOC_CONTROL_TMP-STATUS = C_STATUS_IN_IDOC_POSTED.

  • ok status

T_REPORT-STATUS = 'S'.

ELSE.

  • error status

T_REPORT-STATUS = 'E'.

ENDIF.

  • Get IDoc details.

CALL FUNCTION 'IDOC_READ_COMPLETELY'

EXPORTING

DOCUMENT_NUMBER = T_REPORT-IDOC_NO

TABLES

INT_EDIDS = T_EDIDS

INT_EDIDD = T_EDIDD

EXCEPTIONS

DOCUMENT_NOT_EXIST = 1

DOCUMENT_NUMBER_INVALID = 2

OTHERS = 3.

  • Get Error status

READ TABLE T_EDIDS WITH KEY STATUS = T_IDOC_CONTROL_TMP-STATUS.

IF SY-SUBRC EQ 0.

REPLACE FIRST OCCURRENCE OF '&1' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA1.

REPLACE FIRST OCCURRENCE OF '&2' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA2.

REPLACE FIRST OCCURRENCE OF '&3' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA3.

REPLACE FIRST OCCURRENCE OF '&4' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA4.

REPLACE FIRST OCCURRENCE OF '&' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA1.

REPLACE FIRST OCCURRENCE OF '&' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA2.

REPLACE FIRST OCCURRENCE OF '&' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA3.

REPLACE FIRST OCCURRENCE OF '&' IN T_EDIDS-STATXT

WITH T_EDIDS-STAPA4.

T_REPORT-ERROR = T_EDIDS-STATXT.

ENDIF.

LOOP AT T_EDIDD.

CASE T_EDIDD-SEGNAM.

WHEN 'E1EDKA1'.

GV_PARTNER_SEG = T_EDIDD-SDATA.

CLEAR : T_REPORT-STP_NAME.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

INPUT = GV_PARTNER_SEG-PARTN

IMPORTING

OUTPUT = T_REPORT-STP_NO.

SELECT SINGLE NAME1 TELF1

INTO (T_REPORT-STP_NAME,T_REPORT-STP_PHONE)

FROM KNA1

WHERE KUNNR = T_REPORT-STP_NO.

WHEN 'E1EDK02'.

GV_PO_REF_SEG = T_EDIDD-SDATA.

T_REPORT-PO_NO = GV_PO_REF_SEG-BELNR.

ENDCASE.

ENDLOOP.

APPEND T_REPORT.

ENDLOOP .

SORT T_REPORT BY STATUS IDOC_NO.

  • Show Report

PERFORM ALV_GRID.

ENDFORM. " show_status_report

Pls reward all helpful points.

Regards,

Ameet