*&---------------------------------------------------------------------*
*& Report ZRMM0061 *
*& *
*&---------------------------------------------------------------------*
*& Author: vista *
*& Date : 2008-08-26 *
*& Descr : Purchase Cost Reduction Report *
*& Reques: "DEVK925374 [DS080804] *
*&---------------------------------------------------------------------*
*& Author: vista *
*& Date : 2008-08-26 *
*& Descr : fix some bug for this report *
*& Reques: "DEVK925528 [DS080804]
*&---------------------------------------------------------------------*
REPORT ZRMM0061.
************************************************************************
************************************************************************
* D E C L A R A T I O N
************************************************************************
************************************************************************
TYPE-POOLS: SLIS .
TABLES:MKPF,MSEG,CDHDR,CDPOS,EKKO,EKPO,MARA.
DATA: BEGIN OF T_GR OCCURS 0,
MBLNR LIKE MKPF-MBLNR, "Material Doc
BUDAT LIKE MKPF-BUDAT, "Post Date
BWART LIKE MSEG-BWART, "Movement Type
MATNR LIKE MSEG-MATNR, "Material
EBELN LIKE MSEG-EBELN, "Purchase order
EBELP LIKE MSEG-EBELP, " PO Item
WAERS LIKE EKKO-WAERS, "Currency Key
NETWR LIKE EKPO-NETWR, "Net order value in PO
NETPR LIKE EKPO-NETPR,
WKURS LIKE EKKO-WKURS, "ExchRate
RLWRT LIKE EKKO-RLWRT,
AEDAT LIKE EKKO-AEDAT,
ERFMG LIKE MSEG-ERFMG, "GR QTY(UOM).
PEINH LIKE EKPO-PEINH,
END OF T_GR.
DATA: BEGIN OF T_CDPOS OCCURS 0,
OBJECTCLAS LIKE CDPOS-OBJECTCLAS,
OBJECTID LIKE CDPOS-OBJECTID,
CHANGENR LIKE CDPOS-CHANGENR,
TABNAME LIKE CDPOS-TABNAME,
FNAME LIKE CDPOS-FNAME,
VALUE_NEW LIKE CDPOS-VALUE_NEW,
END OF T_CDPOS.
DATA: BEGIN OF T_CDHDR OCCURS 0,
OBJECTCLAS LIKE CDHDR-OBJECTCLAS,
OBJECTID LIKE CDHDR-OBJECTID,
CHANGENR LIKE CDHDR-CHANGENR,
TCODE LIKE CDHDR-TCODE,
UDATE LIKE CDHDR-UDATE,
UTIME LIKE CDHDR-UTIME,
END OF T_CDHDR.
DATA: BEGIN OF T_PORELBK OCCURS 0,
OBJECTID LIKE EKKO-EBELN,
UDATE LIKE CDHDR-UDATE,
UTIME LIKE CDHDR-UTIME,
END OF T_PORELBK.
DATA: BEGIN OF T_CDPO OCCURS 0,
OBJECTCLAS LIKE CDPOS-OBJECTCLAS,
OBJECTID LIKE CDPOS-OBJECTID,
CHANGENR LIKE CDPOS-CHANGENR,
TABNAME LIKE CDPOS-TABNAME,
FNAME LIKE CDPOS-FNAME,
VALUE_NEW LIKE CDPOS-VALUE_NEW,
END OF T_CDPO.
DATA: BEGIN OF T_CDHD OCCURS 0,
OBJECTCLAS LIKE CDHDR-OBJECTCLAS,
OBJECTID LIKE CDHDR-OBJECTID,
CHANGENR LIKE CDHDR-CHANGENR,
TCODE LIKE CDHDR-TCODE,
UDATE LIKE CDHDR-UDATE,
UTIME LIKE CDHDR-UTIME,
END OF T_CDHD.
DATA: BEGIN OF T_PORELFW OCCURS 0,
OBJECTID LIKE EKKO-EBELN,
UDATE LIKE CDHDR-UDATE,
UTIME LIKE CDHDR-UTIME,
END OF T_PORELFW.
DATA: BEGIN OF T_LASTPURBK OCCURS 0,
EBELN LIKE EKKO-EBELN, "Purchasing Doc
EBELP LIKE EKPO-EBELP,
MATNR LIKE EKPO-MATNR, "Material
TXZ01 LIKE EKPO-TXZ01, "Material Desc
****convert currncy
NETWR LIKE EKPO-NETWR, "Pur currency
NETPR LIKE EKPO-NETPR,
WAERS LIKE EKKO-WAERS, "Currency Key
RLWRT LIKE EKKO-RLWRT, " PO AMT
AEDAT LIKE EKKO-AEDAT, "Pur Creation Date
PEINH LIKE EKPO-PEINH,
END OF T_LASTPURBK.
DATA: BEGIN OF T_LASTPURFW OCCURS 0,
EBELN LIKE EKKO-EBELN, "Purchasing Doc
EBELP LIKE EKPO-EBELP,
MATNR LIKE EKPO-MATNR, "Material
NETPR LIKE EKPO-NETPR,
TXZ01 LIKE EKPO-TXZ01, "Material Desc
****convert currncy
NETWR LIKE EKPO-NETWR, "Pur currency
WAERS LIKE EKKO-WAERS, "Currency Key
RLWRT LIKE EKKO-RLWRT, " PO AMT
AEDAT LIKE EKKO-AEDAT, "Pur Creation Date
PEINH LIKE EKPO-PEINH,
END OF T_LASTPURFW.
DATA: BEGIN OF ITAB OCCURS 0,
MATNR LIKE MARA-MATNR, "Material
TXZ01 LIKE EKPO-TXZ01, "Material Desc
MTART LIKE MARA-MTART, "Material Type
MATKL LIKE MARA-MATKL, "Material Group
PO_NUM(40), "PO-Item
EKGRP LIKE EKKO-EKGRP, "Purchasing group
BUDAT LIKE MKPF-BUDAT, "GR Date
* MENGE LIKE EKPO-MENGE, "GR Qty (Pur UOM)
ERFMG LIKE MSEG-ERFMG, "GR Qty (Pur UOM)
MEINS LIKE EKPO-MEINS, "Pur UOM
PR_AMT(15) TYPE P DECIMALS 3, "Pur Price Per 1 (USD)
LAST_PUR_DATE TYPE D, "Last Pur Date
LAST_PO_NUMBER(40), "Last PO Number
LAST_BUYER_CODE(10), "Last Buyer Code
LAST_PUR_UOM(10), "Last Pur UOM
LAST_PUR_PRICE(15) TYPE P DECIMALS 3,"Last Pur Price Per 1 (USD)
DIFFERENCE(15) TYPE P DECIMALS 3, "Difference
END OF ITAB.
DATA: BEGIN OF DTAB OCCURS 0,
EBELN LIKE EKKO-EBELN, "Purchasing Doc
EBELP LIKE EKPO-EBELP,
MATNR LIKE EKPO-MATNR, "Material
NETPR LIKE EKPO-NETPR,
WAERS LIKE EKKO-WAERS,
AEDAT LIKE EKKO-AEDAT,
PEINH LIKE EKPO-PEINH,
END OF DTAB.
DATA: P_FILENAME(500).
CONSTANTS: L_TO_CURY LIKE BAPI1093_1-FROM_CURR VALUE 'USD',
L_PO_R(7) VALUE 'Release',
L_PO_C(14) VALUE 'Cancel Release'.
DATA: RATE0 LIKE BAPI1093_0 OCCURS 0 WITH HEADER LINE.
DATA: RATE1 LIKE BAPI1093_0 OCCURS 0 WITH HEADER LINE.
DATA: FACTOR(10) TYPE P DECIMALS 3 .
DATA: G_SVFILE LIKE RLGRAP-FILENAME.
DATA: GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, "ALV Field Catalog
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
G_SAVE(1) TYPE C, "Save Variants
G_LAYOUT TYPE SLIS_LAYOUT_ALV,
G_TITLE TYPE LVC_TITLE,
G_REPID LIKE SY-REPID,
G_VARIANT LIKE DISVARIANT, "Layout Variant
T_SORT TYPE SLIS_T_SORTINFO_ALV, "for subtotal
T_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER. "ALV Top-of-page
DATA: LS_LAYOUT TYPE SLIS_LAYOUT_ALV,
LT_SORT TYPE SLIS_T_SORTINFO_ALV,
LS_SORT TYPE SLIS_SORTINFO_ALV.
**************************************
***********Screen Selection***********
**************************************
SELECTION-SCREEN BEGIN OF BLOCK A WITH FRAME TITLE TEXT-S10.
SELECT-OPTIONS: S_BUDAT FOR MKPF-BUDAT.
SELECT-OPTIONS: S_MATNR FOR MSEG-MATNR.
SELECT-OPTIONS: S_UDATE FOR CDHDR-UDATE.
SELECTION-SCREEN END OF BLOCK A.
SELECTION-SCREEN BEGIN OF BLOCK B WITH FRAME TITLE TEXT-S20.
PARAMETERS: P_ALV RADIOBUTTON GROUP RAD1 DEFAULT 'X'.
PARAMETERS: P_FILE RADIOBUTTON GROUP RAD1.
PARAMETERS: P_PN LIKE RLGRAP-FILENAME DEFAULT
'//ASATHKFP5/SAP/PURCHASING/ZRMM0061/'.
PARAMETERS: P_FN LIKE RLGRAP-FILENAME DEFAULT 'PO_SAVING'.
SELECTION-SCREEN END OF BLOCK B.
*----------------------------------------------------------------------*
* INITIALIZATION *
*----------------------------------------------------------------------*
INITIALIZATION.
G_VARIANT-REPORT = SY-REPID.
G_VARIANT-USERNAME = SY-UNAME.
* Set report program name
G_REPID = SY-REPID.
* Set Options: Save variants user-specific or general
G_SAVE = 'A'.
*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM GET_DATA.
PERFORM FILL_ITAB.
END-OF-SELECTION.
*----------------------------------------------------------------------*
* END-OF-SELECTION *
*----------------------------------------------------------------------*
IF P_ALV = 'X'.
PERFORM SET_TOP_OF_PAGE.
PERFORM SUB_OUTPUT_TO_ALV.
ELSE.
PERFORM DOWNLOAD_SERVER USING P_PN.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_DATA .
****save data in T_GR
SELECT MKPF~BUDAT MSEG~EBELN MKPF~MBLNR
MSEG~BWART MSEG~MATNR MSEG~EBELP MSEG~WAERS EKPO~NETPR
EKKO~WAERS EKPO~NETWR EKKO~WKURS EKKO~RLWRT EKKO~AEDAT
MSEG~ERFMG EKPO~PEINH
INTO CORRESPONDING FIELDS OF TABLE T_GR
FROM MKPF
INNER JOIN MSEG ON MSEG~MBLNR = MKPF~MBLNR
INNER JOIN EKKO ON EKKO~EBELN = MSEG~EBELN
INNER JOIN EKPO ON EKPO~EBELN = MSEG~EBELN AND EKPO~EBELP = MSEG~EBELP
WHERE MKPF~BUDAT IN S_BUDAT AND MSEG~BWART = '101'
AND MSEG~MATNR <> '' AND MSEG~EBELN <> '' AND MSEG~MATNR IN S_MATNR.
****save data in T_CDHDR
SELECT CDHDR~OBJECTCLAS CDHDR~OBJECTID CDHDR~CHANGENR
CDHDR~TCODE CDHDR~UDATE CDHDR~UTIME
INTO CORRESPONDING FIELDS OF TABLE T_CDHDR
FROM CDHDR
WHERE CDHDR~OBJECTCLAS = 'EINKBELEG'
AND ( CDHDR~TCODE = 'ME29N' OR CDHDR~TCODE = 'ME28' )
AND CDHDR~UDATE IN S_UDATE.
****sava data in T_CDPOS.
IF T_CDHDR[] IS NOT INITIAL.
SELECT CDPOS~OBJECTCLAS CDPOS~OBJECTID CDPOS~CHANGENR
CDPOS~TABNAME CDPOS~FNAME CDPOS~VALUE_NEW
INTO CORRESPONDING FIELDS OF TABLE T_CDPOS
FROM CDPOS
FOR ALL ENTRIES IN T_CDHDR
WHERE CDPOS~TABNAME = 'EKKO'
AND CDPOS~FNAME = 'FRGKE'
AND CDPOS~VALUE_NEW = 'R'
AND CDPOS~OBJECTCLAS = 'EINKBELEG'
AND CDPOS~CHANGENR = T_CDHDR-CHANGENR
AND CDPOS~OBJECTID = T_CDHDR-OBJECTID.
ENDIF.
SORT T_CDHDR BY OBJECTID UDATE UTIME.
SORT T_CDPOS BY OBJECTID CHANGENR.
***save data in T_PORELBK
LOOP AT T_CDHDR.
READ TABLE T_CDPOS WITH KEY OBJECTID = T_CDHDR-OBJECTID
CHANGENR = T_CDHDR-CHANGENR
BINARY SEARCH.
IF SY-SUBRC = 0.
T_PORELBK-OBJECTID = T_CDHDR-OBJECTID.
T_PORELBK-UDATE = T_CDHDR-UDATE.
T_PORELBK-UTIME = T_CDHDR-UTIME.
APPEND T_PORELBK.
CLEAR T_PORELBK.
ENDIF.
ENDLOOP.
****save data in T_CDHD
SELECT CDHDR~OBJECTCLAS CDHDR~OBJECTID CDHDR~CHANGENR
CDHDR~TCODE CDHDR~UDATE CDHDR~UTIME
INTO CORRESPONDING FIELDS OF TABLE T_CDHD
FROM CDHDR
WHERE CDHDR~OBJECTCLAS = 'EINKBELEG'
AND ( CDHDR~TCODE = 'ME29N' OR CDHDR~TCODE = 'ME28' )
AND CDHDR~UDATE > S_UDATE-HIGH
AND CDHDR~UDATE < S_BUDAT-LOW.
****save data in T_CDPO
IF T_CDHD IS NOT INITIAL.
SELECT CDPOS~OBJECTCLAS CDPOS~OBJECTID CDPOS~CHANGENR
CDPOS~TABNAME CDPOS~FNAME CDPOS~VALUE_NEW
INTO CORRESPONDING FIELDS OF TABLE T_CDPO
FROM CDPOS
FOR ALL ENTRIES IN T_CDHD
WHERE CDPOS~TABNAME = 'EKKO'
AND CDPOS~FNAME = 'FRGKE'
AND CDPOS~VALUE_NEW = 'R'
AND CDPOS~OBJECTCLAS = 'EINKBELEG'
AND CDPOS~CHANGENR = T_CDHD-CHANGENR
AND CDPOS~OBJECTID = T_CDHD-OBJECTID.
ENDIF.
SORT T_CDHD BY OBJECTID UDATE UTIME.
SORT T_CDPO BY OBJECTID CHANGENR.
****save data in T_PORELFW
LOOP AT T_CDHD.
READ TABLE T_CDPO WITH KEY OBJECTID = T_CDHD-OBJECTID
CHANGENR = T_CDHD-CHANGENR
BINARY SEARCH.
IF SY-SUBRC = 0.
T_PORELFW-OBJECTID = T_CDHD-OBJECTID.
T_PORELFW-UDATE = T_CDHD-UDATE.
T_PORELFW-UTIME = T_CDHD-UTIME.
APPEND T_PORELFW.
CLEAR T_PORELFW.
ENDIF.
ENDLOOP.
****save data in T_LASTPURBK
IF T_PORELBK[] IS NOT INITIAL.
SELECT EKKO~EBELN EKPO~MATNR EKPO~NETPR EKPO~TXZ01
EKPO~NETWR EKPO~NETPR EKKO~WAERS EKKO~AEDAT
EKKO~RLWRT EKPO~EBELP EKPO~PEINH
INTO CORRESPONDING FIELDS OF TABLE T_LASTPURBK
FROM EKKO
INNER JOIN EKPO ON EKPO~EBELN = EKKO~EBELN
FOR ALL ENTRIES IN T_PORELBK
WHERE EKKO~EBELN = T_PORELBK-OBJECTID
AND EKPO~MATNR IN S_MATNR
AND EKPO~NETPR > 0.
ENDIF.
****save data in T_LASTPURFW
IF T_PORELFW[] IS NOT INITIAL.
SELECT EKKO~EBELN EKPO~MATNR EKPO~NETPR EKPO~TXZ01
EKPO~NETWR EKPO~NETPR EKKO~WAERS EKKO~AEDAT
EKKO~RLWRT EKPO~EBELP EKPO~PEINH
INTO CORRESPONDING FIELDS OF TABLE T_LASTPURBK
FROM EKKO
INNER JOIN EKPO ON EKPO~EBELN = EKKO~EBELN
FOR ALL ENTRIES IN T_PORELFW
WHERE EKKO~EBELN = T_PORELFW-OBJECTID
AND EKPO~MATNR IN S_MATNR
AND EKPO~NETPR > 0.
ENDIF.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form FILL_ITAB
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FILL_ITAB .
DATA: PO_ITEM(40),
LAST_PO(40),
DATA1(10),
DATA2(10),
DATA3(10),
DATA4(10),
PO (10).
LOOP AT T_GR.
CONCATENATE T_GR-EBELN '-' T_GR-EBELP INTO PO_ITEM.
ITAB-PO_NUM = PO_ITEM.
ITAB-MATNR = T_GR-MATNR.
ITAB-BUDAT = T_GR-BUDAT.
ITAB-ERFMG = T_GR-ERFMG.
****get material description and Buyer Code
SELECT EKPO~TXZ01 EKKO~EKGRP EKPO~MEINS
INTO (ITAB-TXZ01,ITAB-EKGRP,ITAB-MEINS)
FROM EKPO
INNER JOIN EKKO ON EKKO~EBELN = EKPO~EBELN
WHERE EKPO~MATNR = T_GR-MATNR
AND EKPO~EBELN = T_GR-EBELN
AND EKPO~EBELP = T_GR-EBELP.
ENDSELECT.
****get material type and material group
SELECT MARA~MTART MARA~MATKL INTO (ITAB-MTART,ITAB-MATKL)
FROM MARA
WHERE MARA~MATNR = T_GR-MATNR.
ENDSELECT.
***convert currency Pur Price Per 1 (USD)
IF T_GR-WAERS ='JPY'.
T_GR-NETPR = T_GR-NETPR * 100.
ENDIF.
IF T_GR-WAERS NE 'USD'.
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
EXPORTING
RATE_TYPE = 'M'
FROM_CURR = T_GR-WAERS
TO_CURRNCY = L_TO_CURY
DATE = T_GR-AEDAT
IMPORTING
EXCH_RATE = RATE1.
IF NOT RATE1-EXCH_RATE IS INITIAL.
FACTOR = RATE1-FROM_FACTOR / RATE1-EXCH_RATE *
RATE1-TO_FACTOR.
ELSE.
FACTOR = RATE1-EXCH_RATE_V * RATE1-FROM_FACTOR_V
/ RATE1-TO_FACTOR_V .
ENDIF.
ITAB-PR_AMT = T_GR-NETPR / FACTOR / T_GR-PEINH.
ELSE.
ITAB-PR_AMT = T_GR-NETPR / T_GR-PEINH.
ENDIF.
ITAB-LAST_PUR_DATE = T_GR-BUDAT.
CONCATENATE T_GR-EBELN '-' T_GR-EBELP INTO LAST_PO.
ITAB-LAST_PO_NUMBER = LAST_PO.
ITAB-LAST_PUR_PRICE = ITAB-PR_AMT.
***********************************************
*START DEVK925528
SORT T_LASTPURBK BY MATNR AEDAT DESCENDING.
SORT T_LASTPURFW BY MATNR AEDAT ASCENDING.
READ TABLE T_LASTPURBK WITH KEY MATNR = T_GR-MATNR.
IF SY-SUBRC = 0.
ITAB-LAST_PUR_DATE = T_LASTPURBK-AEDAT.
CONCATENATE T_LASTPURBK-EBELN '-' T_LASTPURBK-EBELP
INTO LAST_PO.
ITAB-LAST_PO_NUMBER = LAST_PO.
ELSE.
READ TABLE T_LASTPURFW WITH KEY MATNR = T_GR-MATNR.
IF SY-SUBRC = 0.
ITAB-LAST_PUR_DATE = T_LASTPURFW-AEDAT.
CONCATENATE T_LASTPURFW-EBELN '-' T_LASTPURFW-EBELP
INTO LAST_PO.
ITAB-LAST_PO_NUMBER = LAST_PO.
ENDIF.
ENDIF.
*END DEVK925528
******Last Price*******
* PO (10) = LAST_PO.
SELECT EKPO~EBELN EKPO~EBELP EKPO~MATNR EKPO~NETPR
EKKO~WAERS EKKO~AEDAT EKPO~PEINH
INTO CORRESPONDING FIELDS OF TABLE DTAB
FROM EKPO
INNER JOIN EKKO ON EKKO~EBELN = EKPO~EBELN
WHERE EKPO~EBELN = ITAB-LAST_PO_NUMBER(10)
AND EKPO~EBELP = ITAB-LAST_PO_NUMBER+11
AND EKPO~MATNR IN S_MATNR.
LOOP AT DTAB WHERE MATNR = ITAB-MATNR
AND EBELN = ITAB-LAST_PO_NUMBER(10)
AND EBELP = ITAB-LAST_PO_NUMBER+11 .
IF DTAB-EBELN IS NOT INITIAL.
IF DTAB-WAERS ='JPY'.
DTAB-NETPR = DTAB-NETPR * 100.
ENDIF.
IF DTAB-WAERS NE 'USD'.
CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
EXPORTING
RATE_TYPE = 'M'
FROM_CURR = DTAB-WAERS
TO_CURRNCY = L_TO_CURY
DATE = DTAB-AEDAT
IMPORTING
EXCH_RATE = RATE1.
IF NOT RATE1-EXCH_RATE IS INITIAL.
FACTOR = RATE1-FROM_FACTOR / RATE1-EXCH_RATE *
RATE1-TO_FACTOR.
ELSE.
FACTOR = RATE1-EXCH_RATE_V * RATE1-FROM_FACTOR_V
/ RATE1-TO_FACTOR_V.
ENDIF.
ITAB-LAST_PUR_PRICE = DTAB-NETPR / FACTOR / DTAB-PEINH.
ELSE.
ITAB-LAST_PUR_PRICE = DTAB-NETPR / DTAB-PEINH.
ENDIF.
ENDIF.
ENDLOOP.
****Last Buyer Code
DATA: PO_NUM(10).
PO_NUM = ITAB-LAST_PO_NUMBER(10).
PO_ITEM = ITAB-LAST_PO_NUMBER+11(5).
SELECT SINGLE EKKO~EKGRP INTO ITAB-LAST_BUYER_CODE
FROM EKKO WHERE EKKO~EBELN = PO_NUM.
****Last Pur UOM
SELECT SINGLE EKPO~MEINS INTO ITAB-LAST_PUR_UOM
FROM EKPO WHERE EKPO~EBELN = PO_NUM AND EKPO~EBELP = PO_ITEM.
****DIFFERENCE
ITAB-DIFFERENCE = ( ITAB-PR_AMT - ITAB-LAST_PUR_PRICE ) * ITAB-ERFMG.
*****deleting item leading 0
DATA1 = ITAB-PO_NUM(10).
DATA2 = ITAB-PO_NUM+14.
CONCATENATE DATA1 '-' DATA2 INTO ITAB-PO_NUM.
DATA3 = ITAB-LAST_PO_NUMBER(10).
DATA4 = ITAB-LAST_PO_NUMBER+14.
CONCATENATE DATA3 '-' DATA4 INTO ITAB-LAST_PO_NUMBER.
APPEND ITAB.
CLEAR ITAB.
ENDLOOP.
ENDFORM. " FILL_ITAB
*&---------------------------------------------------------------------*
*& Form SUB_OUTPUT_TO_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SUB_OUTPUT_TO_ALV .
G_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
* Sorting Options
LS_SORT-SPOS = 1.
LS_SORT-FIELDNAME = 'MATNR'.
LS_SORT-UP = 'X'. " Ascending
LS_SORT-SUBTOT = 'X'. " Calc subtotals
APPEND LS_SORT TO LT_SORT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'MATNR'.
LS_FIELDCAT-SELTEXT_L = 'Material'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'TXZ01'.
LS_FIELDCAT-SELTEXT_L = 'Description'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'MTART'.
LS_FIELDCAT-SELTEXT_L = 'Mat Type'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'MATKL'.
LS_FIELDCAT-SELTEXT_L = 'Mat Group'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'PO_NUM'.
LS_FIELDCAT-SELTEXT_L = ' PO Number'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'EKGRP'.
LS_FIELDCAT-SELTEXT_L = 'Buyer Code'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'BUDAT'.
LS_FIELDCAT-SELTEXT_L = 'GR Date'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'ERFMG'.
LS_FIELDCAT-SELTEXT_L = 'GR Qty (Pur UOM)'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'MEINS'.
LS_FIELDCAT-SELTEXT_L = 'Pur UOM'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'PR_AMT'.
LS_FIELDCAT-SELTEXT_L = 'Pur Price Per 1 (USD)'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'LAST_PUR_DATE'.
LS_FIELDCAT-SELTEXT_L = 'Last Pur Date'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'LAST_PO_NUMBER'.
LS_FIELDCAT-SELTEXT_L = 'Last PO Number'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'LAST_BUYER_CODE'.
LS_FIELDCAT-SELTEXT_L = 'Last Buyer Code'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'LAST_PUR_UOM'.
LS_FIELDCAT-SELTEXT_L = 'Last Pur UOM'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'LAST_PUR_PRICE'.
LS_FIELDCAT-SELTEXT_L = 'Last Pur Price Per 1 (USD)'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-TABNAME = 'ITAB'.
LS_FIELDCAT-FIELDNAME = 'DIFFERENCE'.
LS_FIELDCAT-SELTEXT_L = 'Difference'.
LS_FIELDCAT-NO_ZERO = 'X'.
APPEND LS_FIELDCAT TO GT_FIELDCAT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_GRID_TITLE = G_TITLE
IT_FIELDCAT = GT_FIELDCAT
I_CALLBACK_PROGRAM = G_REPID
IS_LAYOUT = G_LAYOUT
I_SAVE = 'A'
I_BYPASSING_BUFFER = 'X'
I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE'
TABLES
T_OUTTAB = ITAB.
ENDFORM. " SUB_OUTPUT_TO_ALV
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_SERVER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_FILENAME text
*----------------------------------------------------------------------*
FORM DOWNLOAD_SERVER USING P_PN.
FIELD-SYMBOLS: <FS>.
DATA: L_FIELD(200) TYPE C,
L_STRING(3000) TYPE C.
DATA:P_SUBRC LIKE SY-SUBRC.
P_SUBRC = 1.
TRY.
CONCATENATE P_PN P_FN '_' SY-DATUM '.xls'
INTO G_SVFILE.
OPEN DATASET G_SVFILE FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
IF SY-SUBRC = 0.
CONCATENATE 'Material'
'Description'
'Mat Type'
'Mat Group'
' PO Number'
'Buyer Code'
'GR Date'
'GR Qty (Pur UOM)'
'Pur UOM'
'Pur Price Per 1 (USD)'
'Last Pur Date'
'Last PO Number'
'Last Buyer Code'
'Last Pur UOM'
'Last Pur Price Per 1 (USD)'
'Difference'
INTO L_STRING SEPARATED BY
CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
TRANSFER L_STRING TO G_SVFILE.
LOOP AT ITAB.
CLEAR L_STRING.
DO.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE ITAB TO <FS>.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
WRITE <FS> TO L_FIELD.
CONDENSE L_FIELD.
IF SY-INDEX = 1.
L_STRING = L_FIELD.
ELSE.
CONCATENATE L_STRING L_FIELD INTO L_STRING
SEPARATED BY CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
ENDIF.
ENDDO.
TRANSFER L_STRING TO G_SVFILE.
ENDLOOP.
CLOSE DATASET G_SVFILE.
WRITE:/ 'Export is successful.'.
WRITE:/ 'Temporary file created on server:', G_SVFILE.
P_SUBRC = 0.
ELSE.
WRITE:/ 'Export is failed.'.
ENDIF.
CATCH CX_ROOT.
WRITE:/ 'Temporary file writing error on server.'.
ENDTRY.
ENDFORM. " DOWNLOAD_SERVER
*&--------------------------------------------------------------------*
*& Form TOP_OF_PAGE
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM TOP_OF_PAGE.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = T_TOP_OF_PAGE.
ENDFORM. " TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& Form SET_TOP_OF_PAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SET_TOP_OF_PAGE .
DATA: LS_LINE TYPE SLIS_LISTHEADER,
L_LINES TYPE I,
L_TEXT1(30) TYPE C,
L_TEXT2(30) TYPE C.
* Macro: _APPEND_SELECT_OPTIONS
* &1 - Selection Criteria Text
* &2 - Select-Option Variable
DEFINE _APPEND_SELECT_OPTIONS.
LS_LINE-KEY = &1.
READ TABLE &2 INDEX 1.
IF &2-HIGH IS INITIAL.
WRITE &2-LOW TO L_TEXT1.
LS_LINE-INFO = L_TEXT1.
ELSE.
WRITE: &2-LOW TO L_TEXT1,
&2-HIGH TO L_TEXT2.
CONCATENATE L_TEXT1 '-' L_TEXT2 INTO LS_LINE-INFO
SEPARATED BY SPACE.
ENDIF.
DESCRIBE TABLE &2 LINES L_LINES.
IF L_LINES > 1.
CONCATENATE LS_LINE-INFO ', ...' INTO LS_LINE-INFO.
ENDIF.
APPEND LS_LINE TO T_TOP_OF_PAGE.
END-OF-DEFINITION.
********************************************
* LS_LINE-TYP = 'H' (表示HEAD)
* LS_LINE-TYP = 'S' (表示SCREEN中的选择条件)
********************************************
* Header
CLEAR LS_LINE.
LS_LINE-TYP = 'H'.
LS_LINE-INFO = SY-TITLE.
APPEND LS_LINE TO T_TOP_OF_PAGE.
* Selection Criteria List
CLEAR LS_LINE.
LS_LINE-TYP = 'S'.
* GR Date
IF NOT ( S_BUDAT IS INITIAL ).
_APPEND_SELECT_OPTIONS TEXT-103 S_BUDAT.
ENDIF.
* Material
IF NOT ( S_MATNR IS INITIAL ).
_APPEND_SELECT_OPTIONS TEXT-104 S_MATNR.
ENDIF.
* PO Price Cutoff Date
IF NOT ( S_UDATE IS INITIAL ).
_APPEND_SELECT_OPTIONS TEXT-105 S_UDATE.
ENDIF.
ENDFORM. " SET_TOP_OF_PAGE