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 )

*-----------------------------------------------------------------------

* Program        : Z_EDI_FILE_LOAD_STATUS_REPORT

* Presented By   : ​​www.rmtiwari.com​

*-----------------------------------------------------------------------

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