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