ZRMM0061【通过Purchase Order查看成本分析,TOP-OF-PAGE的使用】

 

*&---------------------------------------------------------------------*

*& 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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值