• SAP库龄表(转)


    &---------------------------------------------------------------------*
    *& Report  ZFIR005
    *&
    *&---------------------------------------------------------------------*
    *& Programe ID: ZFIR005
    *& Programe Discription: 财务库龄表
    *& Change Date: 
    *& Change By:  
    *& Version: Ver0.1
    *&---------------------------------------------------------------------*
    
    REPORT  ZFIR005 NO STANDARD PAGE HEADING.
    
    TYPE-POOLS: SLIS.
    *&---------------------------------------------------------------------*
    *&     TYPES DEFINITION
    *&---------------------------------------------------------------------*
    * 物料数据
    TYPES: BEGIN OF TP_MATNR,
            WERKS  TYPE MARD-WERKS,  "工厂
            MATNR  TYPE MARD-MATNR,  "物料号
            LGORT  TYPE MARD-LGORT,  "库存地点
            MAKTX  TYPE MAKT-MAKTX,  "物料描述
            PRCTR  TYPE MARC-PRCTR,  "利润中心
            MATKL  TYPE MARA-MATKL,  "物料组
            XCHPF  TYPE MARA-XCHPF,  "批次管理需求的标识
            MENGE  TYPE BSEG-MENGE,  "数量
            MEINS  TYPE MARA-MEINS,  "数量单位
           END OF TP_MATNR.
    * 物料总数量
    TYPES: BEGIN OF TP_QTY,
            WERKS  TYPE BSEG-WERKS,  "工厂
            MATNR  TYPE BSEG-MATNR,  "物料号
            MENGE  TYPE BSEG-MENGE,  "数量
            DMBTR  TYPE BSEG-DMBTR,  "按本位币计的金额
           END OF TP_QTY.
    * 物料库存数据
    TYPES: BEGIN OF TP_DATA,
            WERKS  TYPE MCHB-WERKS, "工厂
            MATNR  TYPE MCHB-MATNR, "物料号
            LGORT  TYPE MCHB-LGORT, "库存地点
            CHARG  TYPE MCHB-CHARG, "批号
            LFGJA  TYPE MCHB-LFGJA, "当前期间的会计年度
            LFMON  TYPE MCHB-LFMON, "当前期间
            SDATE  TYPE SY-DATUM,   "当前日期
            CLABS  TYPE MCHB-CLABS, "非限制使用的估价的库存
            CUMLM  TYPE MCHB-CUMLM, "在运库存
            CINSM  TYPE MCHB-CINSM, "质量检验中的库存
            SOBKZ  TYPE MSKA-SOBKZ, "特殊库存标识
            VBELN  TYPE MSKA-VBELN, "销售和分销凭证号
            POSNR  TYPE MSKA-POSNR, "销售和分销凭证的项目号
            XCHPF  TYPE MARA-XCHPF, "批次管理标志
            MENGE  TYPE MSEG-MENGE, "数量
            LWEDT  TYPE MCH1-LWEDT, "收货日期
           END OF TP_DATA.
    * 物料移动数据
    TYPES: BEGIN OF TP_MSEG,
            BUKRS  TYPE MSEG-BUKRS,  "公司代码
            MBLNR  TYPE MSEG-MBLNR,  "物料凭证编号
            MJAHR  TYPE MSEG-MJAHR,  "物料凭证年度
            ZEILE  TYPE MSEG-ZEILE,  "物料凭证中的项目
            MATNR  TYPE MSEG-MATNR,  "物料号
            WERKS  TYPE MSEG-WERKS,  "工厂
            LGORT  TYPE MSEG-LGORT,  "库存地点
            BWART  TYPE MSEG-BWART,  "移动类型
            SHKZG  TYPE MSEG-SHKZG,  "借贷标识
            MENGE  TYPE MSEG-MENGE,  "数量
            EXBWR  TYPE MSEG-EXBWR,  "以本地货币计量的过帐金额
            CHARG  TYPE MSEG-CHARG,  "批号
            WAERS  TYPE MSEG-WAERS,  "价格单位
            BUDAT  TYPE MKPF-BUDAT,  "凭证中的过帐日期
            LWEDT  TYPE MCH1-LWEDT,  "最近的收货日期
           END OF TP_MSEG.
    * 会计凭证数据
    TYPES: BEGIN OF TP_BSEG,
            BUKRS  TYPE BSEG-BUKRS,  "公司代码
            WERKS  TYPE BSEG-WERKS,  "工厂
            BELNR  TYPE BSEG-BELNR,  "会计凭证编号
            GJAHR  TYPE BSEG-GJAHR,  "会计年度
            BUZEI  TYPE BSEG-BUZEI,  "项目号
            SHKZG  TYPE BSEG-SHKZG,  "借方/贷方标识
            DMBTR  TYPE BSEG-DMBTR,  "按本位币计的金额
            MATNR  TYPE BSEG-MATNR,  "物料号
            MENGE  TYPE BSEG-MENGE,  "数量
            MEINS  TYPE BSEG-MEINS,  "数量单位
            BUDAT  TYPE BKPF-BUDAT,  "凭证中的过帐日期
            BLART  TYPE BKPF-BLART,  "凭证类型
            AWTYP  TYPE BKPF-AWTYP,  "参考交易
            AWKEY  TYPE BKPF-AWKEY,  "字段参考关键
           END OF TP_BSEG.
    * ALV 输出字段
    TYPES: BEGIN OF TP_ALV,
            CHK    TYPE CHAR1,       "CHECBOX
            WERKS  TYPE MARD-WERKS,  "工厂
            LGORT  TYPE MARD-LGORT,  "库存地点
            ZYEAR  TYPE CHAR4,       "运行年份
            ZMONTH TYPE CHAR2,       "运行月份
            MATNR  TYPE MARD-MATNR,  "物料号
            MAKTX  TYPE MAKT-MAKTX,  "物料描述
            MATKL  TYPE MARA-MATKL,  "物料组
            PRCTR  TYPE MARC-PRCTR,  "利润中心
            PRTXT  TYPE CEPCT-MCTXT, "利润中心描述
            XCHPF  TYPE MARA-XCHPF,  "批次管理
            LDATE1 TYPE SY-DATUM,    "最后异动日期
            LDATE2 TYPE SY-DATUM,    "最后销售日期
            PRICE  TYPE MBEW-SALK3,  "单价
            SALK3  TYPE MBEW-SALK3,  "库存金额
            LBKUM1 TYPE MBEW-LBKUM,  "库存数量
            MEINS1 TYPE MARA-MEINS,  "数量单位
            LBKUM2 TYPE MBEW-LBKUM,  "财务库存数量
            MEINS2 TYPE MARA-MEINS,  "财务数量单位
            QTY3M  TYPE MBEW-LBKUM,  "3月以内的库龄数量
            QTY6M  TYPE MBEW-LBKUM,  "4月到6月以内的库龄数量
            QTY9M  TYPE MBEW-LBKUM,  "7月到9月以内的库龄数量
            QTY12M TYPE MBEW-LBKUM,  "10月到12月以内的库龄数量
            QTY18M TYPE MBEW-LBKUM,  "13月到18月以内的库龄数量
            QTY24M TYPE MBEW-LBKUM,  "19月到24月以内的库龄数量
            QTY36M TYPE MBEW-LBKUM,  "25月到36月以内的库龄数量
            QTY60M TYPE MBEW-LBKUM,  "37月到60月以内的库龄数量
            QTY61M TYPE MBEW-LBKUM,  "61月以上的库龄数量
            PRC3M  TYPE MBEW-SALK3,  "3月以内的库龄金额
            PRC6M  TYPE MBEW-SALK3,  "4月到6月以内的库龄金额
            PRC9M  TYPE MBEW-SALK3,  "7月到9月以内的库龄金额
            PRC12M TYPE MBEW-SALK3,  "10月到12月以内的库龄金额
            PRC18M TYPE MBEW-SALK3,  "13月到18月以内的库龄金额
            PRC24M TYPE MBEW-SALK3,  "19月到24月以内的库龄金额
            PRC36M TYPE MBEW-SALK3,  "25月到36月以内的库龄金额
            PRC60M TYPE MBEW-SALK3,  "37月到60月以内的库龄金额
            PRC61M TYPE MBEW-SALK3,  "60月以上的库龄金额
            PERPRC TYPE MBEW-SALK3,  "跌价金额
            WAERS  TYPE MSEG-WAERS,  "价格单位
            PERFLG TYPE CHAR1,       "跌价规则维护标志
           END OF TP_ALV.
    *&---------------------------------------------------------------------*
    *&     DATA DEFINITION
    *&---------------------------------------------------------------------*
    DATA: V_GJAHR TYPE BSIS-GJAHR,
          V_MONAT TYPE BKPF-MONAT,
          V_WERKS TYPE T001W-WERKS,
          V_MATNR TYPE MARA-MATNR,
          V_LGORT TYPE MARD-LGORT,
          V_BWKEY TYPE T001W-BWKEY,
          V_QTY   TYPE MBEW-LBKUM,
          V_DMBTR TYPE MBEW-SALK3,
          V_AWKEY TYPE BKPF-AWKEY,
          V_FDATE TYPE SY-DATUM,
          V_TDATE TYPE SY-DATUM,
          V_COUT  TYPE I,
          V_NUM   TYPE NUMC2,
          V_FIELD TYPE CHAR5,
          V_VALUE TYPE FAGLFLEXT-HSLVT.
    
    DATA: S_3M  TYPE RANGE OF SY-DATUM,  "过去3月以内的库龄数量
          S_6M  TYPE RANGE OF SY-DATUM,  "过去4月到6月以内的库龄数量
          S_9M  TYPE RANGE OF SY-DATUM,  "过去7月到9月以内的库龄数量
          S_12M TYPE RANGE OF SY-DATUM,  "过去10月到12月以内的库龄数量
          S_18M TYPE RANGE OF SY-DATUM,  "过去13月到18月以内的库龄数量
          S_24M TYPE RANGE OF SY-DATUM,  "过去19月到24月以内的库龄数量
          S_36M TYPE RANGE OF SY-DATUM,  "过去25月到36月以内的库龄数量
          S_60M TYPE RANGE OF SY-DATUM,  "过去37月到60月以内的库龄数量
          S_61M TYPE SY-DATUM.           "过去61月以上库龄数量
    
    DATA: WK_MATNR    TYPE TP_MATNR,
          IT_MATNR    TYPE STANDARD TABLE OF TP_MATNR,
          WK_MCHB     TYPE TP_DATA,
          IT_MCHB     TYPE STANDARD TABLE OF TP_DATA,
          WK_MARD     TYPE TP_DATA,
          IT_MARD     TYPE STANDARD TABLE OF TP_DATA,
          WK_MSKA     TYPE TP_DATA,
          IT_MSKA     TYPE STANDARD TABLE OF TP_DATA,
          WK_MARC     TYPE TP_DATA,
          IT_MARC     TYPE STANDARD TABLE OF TP_DATA,
          WK_CHARG    TYPE TP_DATA,
          IT_CHARG    TYPE STANDARD TABLE OF TP_DATA,
          WK_DATA     TYPE TP_DATA,
          IT_DATA     TYPE STANDARD TABLE OF TP_DATA,
          WK_ZMMT001  TYPE ZMMT001,
          IT_ZMMT001  TYPE STANDARD TABLE OF ZMMT001,
          WK_ZFIT015  TYPE ZFIT015,
          IT_ZFIT015  TYPE STANDARD TABLE OF ZFIT015,
          WK_ZFIT016  TYPE ZFIT016,
          IT_ZFIT016  TYPE STANDARD TABLE OF ZFIT016,
          WK_ZFIT017  TYPE ZFIT017,
          IT_ZFIT017  TYPE STANDARD TABLE OF ZFIT017,
          WK_OBJ      TYPE FAGLFLEXT,
          WK_FAG1     TYPE FAGLFLEXT,
          IT_FAG1     TYPE STANDARD TABLE OF FAGLFLEXT,
          WK_MCH1     TYPE MCH1,
          IT_MCH1     TYPE STANDARD TABLE OF MCH1,
          WK_CEPCT    TYPE CEPCT,
          IT_CEPCT    TYPE STANDARD TABLE OF CEPCT,
          WK_MSEG     TYPE TP_MSEG,
          IT_MSEG     TYPE STANDARD TABLE OF TP_MSEG,
          IT_MSEG1    TYPE STANDARD TABLE OF TP_MSEG,
          WK_QTY      TYPE TP_QTY,
          IT_QTY      TYPE STANDARD TABLE OF TP_QTY,
          WK_BKPF     TYPE BKPF,
          IT_BKPF     TYPE STANDARD TABLE OF BKPF,
          WK_BSEG     TYPE TP_BSEG,
          IT_BSEG     TYPE STANDARD TABLE OF TP_BSEG,
          IT_AWKEY    TYPE STANDARD TABLE OF TP_MSEG,
          WK_ALV      TYPE TP_ALV,
          IT_ALV      TYPE STANDARD TABLE OF TP_ALV,
          WK_LAYOUT   TYPE SLIS_LAYOUT_ALV,
          IT_FIELDCAT TYPE STANDARD TABLE OF SLIS_FIELDCAT_ALV,
          IT_EVENT    TYPE STANDARD TABLE OF SLIS_ALV_EVENT.
    
    
      FIELD-SYMBOLS: <FS_HEAD>  TYPE FAGLFLEXT,
                     <FS_FIELD> TYPE ANY,
                     <FS_MSEG>  TYPE TP_MSEG,
                     <FS_CHARG> TYPE TP_DATA,
                     <FS_MCHB>  TYPE TP_DATA,
                     <FS_MARD>  TYPE TP_DATA,
                     <FS_MSKA>  TYPE TP_DATA,
                     <FS_MARC>  TYPE TP_DATA,
                     <FS_ALV>   TYPE TP_ALV.
    
    *&---------------------------------------------------------------------*
    *&     PARAMETERS DEFINITION
    *&---------------------------------------------------------------------*
    *PARAMETERS: P_MONAT TYPE BKPF-MONAT OBLIGATORY,   "Fiscal Period
    *            P_GJAHR TYPE BSIS-GJAHR OBLIGATORY,   "Fiscal Year
    PARAMETERS: P_SDATE TYPE SY-DATUM OBLIGATORY,
                P_BUKRS TYPE T001-BUKRS OBLIGATORY.   "Company Code
    
    SELECT-OPTIONS: S_WERKS FOR V_WERKS OBLIGATORY,
                    S_MATNR FOR V_MATNR,
                    S_LGORT FOR V_LGORT.
    
    *&---------------------------------------------------------------------*
    *&     CONSTANTS DEFINITION
    *&---------------------------------------------------------------------*
    CONSTANTS: C_X          TYPE CHAR1 VALUE 'X',
               C_DAY        TYPE CHAR2 VALUE '01'.
    
    *&---------------------------------------------------------------------*
    *&     INITIALIZATION
    *&---------------------------------------------------------------------*
    INITIALIZATION.
    * 初始化数据
      PERFORM INIT_DATA.
    * 查询日期设置
      PERFORM SET_DATE.
    
    *&---------------------------------------------------------------------*
    *&     AT SELECTION-SCREEN
    *&---------------------------------------------------------------------*
    AT SELECTION-SCREEN.
    * 输入检查
      PERFORM CHECK_INPUT.
    *&---------------------------------------------------------------------*
    *&     START-OF-SELECTION
    *&---------------------------------------------------------------------*
    START-OF-SELECTION.
    * 得到对象数据
      PERFORM GET_DATA.
    * 编辑对象数据
      PERFORM EDIT_DATA.
    * 设定 FIELDCAT
      PERFORM SET_FIELDCAT.
    * 设定 LAYOUT
      PERFORM SET_LAYOUT.
    * 设定 Eventa
      PERFORM SET_ALV_EVENT.
    * 输出 ALV
      PERFORM SHOW_ALV.
    
    *&---------------------------------------------------------------------*
    *&      Form  INIT_DATA
    *&---------------------------------------------------------------------*
    *       初始化数据
    *----------------------------------------------------------------------*
    FORM INIT_DATA .
    
      CLEAR: V_WERKS,
             V_MATNR,
             V_LGORT,
             V_BWKEY,
             V_QTY,
             WK_MATNR,
             WK_ZMMT001,
             WK_MCH1,
             WK_MCH1,
             WK_MSEG,
             WK_ALV,
             WK_LAYOUT.
      REFRESH: IT_MATNR,
               IT_ZMMT001,
               IT_MCH1,
               IT_CEPCT,
               IT_MSEG,
               IT_ALV,
               IT_FIELDCAT,
               IT_EVENT.
    
    ENDFORM.                    " INIT_DATA
    *&---------------------------------------------------------------------*
    *&      Form  CHECK_INPUT
    *&---------------------------------------------------------------------*
    *      输入检查
    *----------------------------------------------------------------------*
    FORM CHECK_INPUT .
    
      DATA: L_STR     TYPE CHAR300,
            LT_T001K  TYPE STANDARD TABLE OF T001K,
            LW_T001W  TYPE T001W,
            LT_T001W  TYPE STANDARD TABLE OF T001W.
    
      REFRESH LT_T001K.
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE LT_T001K
        FROM T001K
       WHERE BUKRS = P_BUKRS.
    
      REFRESH LT_T001W.
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE LT_T001W
        FROM T001W
       WHERE WERKS IN S_WERKS.
    
    * 输入判断
      LOOP AT LT_T001W INTO LW_T001W.
        READ TABLE LT_T001K TRANSPORTING NO FIELDS
                            WITH KEY BWKEY = LW_T001W-BWKEY.
        IF SY-SUBRC <> 0.
          CONCATENATE L_STR
                      LW_T001W-WERKS
                 INTO L_STR
              SEPARATED BY '/'.
        ENDIF.
      ENDLOOP.
      IF LT_T001W IS INITIAL.
        MESSAGE '工厂不存在,请重新输入!' TYPE 'E'.
        LEAVE TO LIST-PROCESSING.
      ENDIF.
      IF L_STR IS NOT INITIAL.
        L_STR+0(1) = ''.
        CONCATENATE '该公司代码不包含工厂:'
                    L_STR
               INTO L_STR.
        MESSAGE E398(00) WITH L_STR.
        LEAVE TO LIST-PROCESSING.
      ENDIF.
    
    ENDFORM.                    " CHECK_INPUT
    *&---------------------------------------------------------------------*
    *&      Form  GET_DATA
    *&---------------------------------------------------------------------*
    *       得到对象数据
    *----------------------------------------------------------------------*
    FORM GET_DATA .
    
      DATA: L_MENGE   TYPE MSEG-MENGE, "数量
            LW_MCHB   TYPE TP_DATA,
            LT_MCHB   TYPE STANDARD TABLE OF TP_DATA,
            LW_MSKA   TYPE TP_DATA,
            LT_MSKA   TYPE STANDARD TABLE OF TP_DATA,
            LW_MATNR  TYPE TP_MATNR,
            LT_MATNR  TYPE STANDARD TABLE OF TP_MATNR,
            LW_DATA   TYPE TP_DATA,
            LT_DATA   TYPE STANDARD TABLE OF TP_DATA.
    
      CLEAR V_FDATE.
      CONCATENATE P_SDATE+0(6)
                  '01'
             INTO V_FDATE.
      V_GJAHR = P_SDATE+0(4).
      V_MONAT = P_SDATE+4(2).
    
    *  得到批次管理物料数据
       REFRESH IT_MCHB.
       SELECT MCHB~MATNR   "物料号
              MCHB~WERKS   "工厂
              MCHB~LGORT   "库存地点
              MCHB~CHARG   "批号
              MCHB~LFGJA   "当前期间的会计年度
              MCHB~LFMON   "当前期间
              MCHB~CLABS   "非限制使用的估价的库存
              MCHB~CUMLM   "在运库存
              MCHB~CINSM   "质量检验中的库存
              MARA~XCHPF   "批次管理标志
         INTO CORRESPONDING FIELDS OF TABLE IT_MCHB
         FROM MCHB
         INNER JOIN MARA ON MCHB~MATNR = MARA~MATNR
        WHERE MCHB~MATNR IN S_MATNR
          AND MCHB~WERKS IN S_WERKS
          AND MCHB~LGORT IN S_LGORT
          AND MARA~XCHPF = 'X'.
    
    *  批次物料历史库存
       SELECT MCHBH~MATNR   "物料号
              MCHBH~WERKS   "工厂
              MCHBH~LGORT   "库存地点
              MCHBH~CHARG   "批号
              MCHBH~LFGJA   "当前期间的会计年度
              MCHBH~LFMON   "当前期间
              MCHBH~CLABS   "非限制使用的估价的库存
              MCHBH~CUMLM   "在运库存
              MCHBH~CINSM   "质量检验中的库存
              MARA~XCHPF    "批次管理标志
         APPENDING CORRESPONDING FIELDS OF TABLE IT_MCHB
         FROM MCHBH
         INNER JOIN MARA ON MCHBH~MATNR = MARA~MATNR
        WHERE MCHBH~MATNR IN S_MATNR
          AND MCHBH~WERKS IN S_WERKS
          AND MCHBH~LGORT IN S_LGORT
          AND MARA~XCHPF = 'X'.
    
    *  查询日期绑定
       LOOP AT IT_MCHB ASSIGNING <FS_MCHB>.
         CONCATENATE <FS_MCHB>-LFGJA
                     <FS_MCHB>-LFMON
                     '01'
                INTO <FS_MCHB>-SDATE.
       ENDLOOP.
    
    *   排除库存符合查询期间的对象数据
        DELETE IT_MCHB WHERE SDATE > V_FDATE.
    
        SORT IT_MCHB BY WERKS ASCENDING
                        MATNR ASCENDING
                        LGORT ASCENDING
                        CHARG ASCENDING
                        SDATE DESCENDING.
    *  得到满足查询条件的唯一的批次物料
       DELETE ADJACENT DUPLICATES FROM IT_MCHB COMPARING WERKS
                                                         MATNR
                                                         LGORT
                                                         CHARG.
    * 排除库存数量为0的对象数据
      DELETE IT_MCHB WHERE CLABS = 0
                       AND CUMLM = 0
                       AND CINSM = 0.
    
       APPEND LINES OF IT_MCHB TO IT_DATA.
       APPEND LINES OF IT_MCHB TO IT_CHARG.
    
    *  普通物料管理
       REFRESH IT_MARD.
       SELECT MARD~MATNR   "物料号
              MARD~WERKS   "工厂
              MARD~LGORT   "库存地点
              MARD~LFGJA   "当前期间的会计年度
              MARD~LFMON   "当前期间
              MARD~LABST AS CLABS "非限制使用的估价的库存
              MARD~UMLME AS CUMLM "在运库存
              MARD~INSME AS CINSM "质量检验中的库存
         INTO CORRESPONDING FIELDS OF TABLE IT_MARD
         FROM MARD
         INNER JOIN MARA ON MARD~MATNR = MARA~MATNR
        WHERE MARD~MATNR IN S_MATNR
          AND MARD~WERKS IN S_WERKS
          AND MARD~LGORT IN S_LGORT
          AND MARA~XCHPF <> 'X'.
    
    *  普通物料历史库存
       SELECT MARDH~MATNR   "物料号
              MARDH~WERKS   "工厂
              MARDH~LGORT   "库存地点
              MARDH~LFGJA   "当前期间的会计年度
              MARDH~LFMON   "当前期间
              MARDH~LABST AS CLABS "非限制使用的估价的库存
              MARDH~UMLME AS CUMLM "在运库存
              MARDH~INSME AS CINSM "质量检验中的库存
         APPENDING CORRESPONDING FIELDS OF TABLE IT_MARD
         FROM MARDH
         INNER JOIN MARA ON MARDH~MATNR = MARA~MATNR
        WHERE MARDH~MATNR IN S_MATNR
          AND MARDH~WERKS IN S_WERKS
          AND MARDH~LGORT IN S_LGORT
          AND MARA~XCHPF <> 'X'.
    
    *  查询日期绑定
       LOOP AT IT_MARD ASSIGNING <FS_MARD>.
         CONCATENATE <FS_MARD>-LFGJA
                     <FS_MARD>-LFMON
                     '01'
                INTO <FS_MARD>-SDATE.
       ENDLOOP.
    
    *   排除库存符合查询期间的对象数据
        DELETE IT_MARD WHERE SDATE > V_FDATE.
    
        SORT IT_MARD BY WERKS ASCENDING
                        MATNR ASCENDING
                        LGORT ASCENDING
                        SDATE DESCENDING.
    *  得到满足查询条件的唯一的批次物料
       DELETE ADJACENT DUPLICATES FROM IT_MARD COMPARING WERKS
                                                         MATNR
                                                         LGORT.
    * 排除库存数量为0的对象数据
      DELETE IT_MARD WHERE CLABS = 0
                       AND CUMLM = 0
                       AND CINSM = 0.
    
       APPEND LINES OF IT_MARD TO IT_DATA.
    
    *  特殊物料管理
       REFRESH IT_MSKA.
       SELECT MSKA~MATNR   "物料号
              MSKA~WERKS   "工厂
              MSKA~LGORT   "库存地点
              MSKA~CHARG   "批号
              MSKA~SOBKZ   "特殊库存标识
              MSKA~VBELN   "销售和分销凭证号
              MSKA~POSNR   "销售和分销凭证的项目号
              MSKA~KALAB AS CLABS "非限制使用的估价的库存
              MSKA~KAINS AS CINSM "质量检验中的库存
              MSKA~LFGJA   "当前期间的会计年度
              MSKA~LFMON   "当前期间
         INTO CORRESPONDING FIELDS OF TABLE IT_MSKA
         FROM MSKA
        WHERE MSKA~MATNR IN S_MATNR
          AND MSKA~WERKS IN S_WERKS
          AND MSKA~LGORT IN S_LGORT.
    *  特殊物料历史库存
       SELECT MSKAH~MATNR   "物料号
              MSKAH~WERKS   "工厂
              MSKAH~LGORT   "库存地点
              MSKAH~CHARG   "批号
              MSKAH~SOBKZ   "特殊库存标识
              MSKAH~VBELN   "销售和分销凭证号
              MSKAH~POSNR   "销售和分销凭证的项目号
              MSKAH~KALAB AS CLABS "非限制使用的估价的库存
              MSKAH~KAINS AS CINSM "质量检验中的库存
              MSKAH~LFGJA   "当前期间的会计年度
              MSKAH~LFMON   "当前期间
         APPENDING CORRESPONDING FIELDS OF TABLE IT_MSKA
         FROM MSKAH
        WHERE MSKAH~MATNR IN S_MATNR
          AND MSKAH~WERKS IN S_WERKS
          AND MSKAH~LGORT IN S_LGORT.
    
    *  查询日期绑定
       LOOP AT IT_MSKA ASSIGNING <FS_MSKA>.
         CONCATENATE <FS_MSKA>-LFGJA
                     <FS_MSKA>-LFMON
                     '01'
                INTO <FS_MSKA>-SDATE.
       ENDLOOP.
    
    *   排除库存符合查询期间的对象数据
        DELETE IT_MSKA WHERE SDATE > V_FDATE.
    
        SORT IT_MSKA BY WERKS ASCENDING
                        MATNR ASCENDING
                        LGORT ASCENDING
                        CHARG ASCENDING
                        SDATE DESCENDING.
    
        REFRESH LT_MSKA.
        APPEND LINES OF IT_MSKA TO LT_MSKA.
    *  得到满足查询条件的唯一的批次物料
       DELETE ADJACENT DUPLICATES FROM IT_MSKA COMPARING WERKS
                                                         MATNR
                                                         LGORT
                                                         CHARG.
    *  按批次合计销售订单
       LOOP AT IT_MSKA ASSIGNING <FS_MSKA>.
         CLEAR: <FS_MSKA>-CLABS,
                <FS_MSKA>-CINSM,
                <FS_MSKA>-VBELN,
                <FS_MSKA>-POSNR.
         LOOP AT LT_MSKA INTO LW_MSKA
                          WHERE WERKS = <FS_MSKA>-WERKS
                            AND MATNR = <FS_MSKA>-MATNR
                            AND LGORT = <FS_MSKA>-LGORT
                            AND CHARG = <FS_MSKA>-CHARG
                            AND SDATE = <FS_MSKA>-SDATE.
           <FS_MSKA>-CLABS = <FS_MSKA>-CLABS + LW_MSKA-CLABS.
           <FS_MSKA>-CINSM = <FS_MSKA>-CINSM + LW_MSKA-CINSM.
         ENDLOOP.
       ENDLOOP.
    
    * 排除库存数量为0的对象数据
      DELETE IT_MSKA WHERE CLABS = 0
                       AND CUMLM = 0
                       AND CINSM = 0.
    
       APPEND LINES OF IT_MSKA TO IT_DATA.
       APPEND LINES OF IT_MSKA TO IT_CHARG.
    
    *  在途库存物料管理
       REFRESH IT_MARC.
       SELECT MARC~MATNR   "物料号
              MARC~WERKS   "工厂
              MARC~UMLMC AS CLABS "非限制使用的估价的库存
              MARC~LFGJA   "当前期间的会计年度
              MARC~LFMON   "当前期间
         INTO CORRESPONDING FIELDS OF TABLE IT_MARC
         FROM MARC
        WHERE MARC~MATNR IN S_MATNR
          AND MARC~WERKS IN S_WERKS.
    
    *  特殊物料历史库存
       SELECT MARCH~MATNR   "物料号
              MARCH~WERKS   "工厂
              MARCH~UMLMC AS CLABS "非限制使用的估价的库存
              MARCH~LFGJA   "当前期间的会计年度
              MARCH~LFMON   "当前期间
         APPENDING CORRESPONDING FIELDS OF TABLE IT_MARC
         FROM MARCH
        WHERE MARCH~MATNR IN S_MATNR
          AND MARCH~WERKS IN S_WERKS.
    
    
    *  查询日期绑定
       LOOP AT IT_MARC ASSIGNING <FS_MARC>.
         <FS_MARC>-LGORT = 'XXXX'.
         CONCATENATE <FS_MARC>-LFGJA
                     <FS_MARC>-LFMON
                     '01'
                INTO <FS_MARC>-SDATE.
       ENDLOOP.
    
    *   排除库存符合查询期间的对象数据
        DELETE IT_MARC WHERE SDATE > V_FDATE.
    
        SORT IT_MARC BY WERKS ASCENDING
                        MATNR ASCENDING
                        SDATE DESCENDING.
    
    *  得到满足查询条件的唯一的批次物料
       DELETE ADJACENT DUPLICATES FROM IT_MARC COMPARING WERKS
                                                         MATNR.
    *  排除库存数量为0的对象数据
       DELETE IT_MARC WHERE CLABS = 0
                        AND CUMLM = 0
                        AND CINSM = 0.
    
        APPEND LINES OF IT_MARC TO IT_DATA.
    
    
    *   排除库存数量为0的对象数据
        DELETE IT_DATA WHERE ( CLABS = 0
                           AND CUMLM = 0
                           AND CINSM = 0 )
                       OR SDATE > V_FDATE.
        SORT IT_DATA BY WERKS ASCENDING
                        MATNR ASCENDING
                        LGORT ASCENDING
                        SDATE DESCENDING.
    *   得到输出对象
        DELETE ADJACENT DUPLICATES FROM IT_DATA COMPARING WERKS
                                                          MATNR
                                                          LGORT.
    
      IF IT_DATA IS NOT INITIAL.
    *   得到物料属性
        REFRESH LT_MATNR.
        SELECT MARA~MATNR   "物料号
               MARA~MATKL   "物料组
               MAKT~MAKTX   "物料描述
               MARA~XCHPF   "批次管理需求的标识
               MARA~MEINS   "数量单位
               MARC~PRCTR   "利润中心
          INTO CORRESPONDING FIELDS OF TABLE LT_MATNR
          FROM MARA
          INNER JOIN MARC ON MARC~MATNR = MARA~MATNR
          INNER JOIN MAKT ON MAKT~MATNR = MARA~MATNR
                         AND MAKT~SPRAS = SY-LANGU
          FOR ALL ENTRIES IN IT_DATA
         WHERE MARA~MATNR = IT_DATA-MATNR
           AND MARC~WERKS = IT_DATA-WERKS.
      ENDIF.
    
    * 整合对象数据
      REFRESH LT_DATA.
      LOOP AT IT_DATA INTO WK_DATA.
        CLEAR WK_MATNR.
        WK_MATNR-WERKS = WK_DATA-WERKS.
        WK_MATNR-LGORT = WK_DATA-LGORT.
        WK_MATNR-MATNR = WK_DATA-MATNR.
        CLEAR LW_MATNR.
        READ TABLE LT_MATNR INTO LW_MATNR
                        WITH KEY MATNR = WK_DATA-MATNR.
        IF SY-SUBRC = 0.
          WK_MATNR-MAKTX = LW_MATNR-MAKTX.
          WK_MATNR-XCHPF = LW_MATNR-XCHPF.
          WK_MATNR-MEINS = LW_MATNR-MEINS.
          WK_MATNR-PRCTR = LW_MATNR-PRCTR.
          WK_MATNR-MATKL = LW_MATNR-MATKL.
        ENDIF.
    *   计算库位总数量
        IF WK_MATNR-XCHPF IS NOT INITIAL.
          LOOP AT IT_MCHB INTO WK_MCHB
                          WHERE WERKS = WK_MATNR-WERKS
                            AND MATNR = WK_MATNR-MATNR
                            AND LGORT = WK_MATNR-LGORT.
    *       数量累计:限制使用的估价的库存/在运库存/质量检验中的库存
            CLEAR L_MENGE.
            L_MENGE = WK_MCHB-CLABS + WK_MCHB-CUMLM + WK_MCHB-CINSM.
            WK_MATNR-MENGE = WK_MATNR-MENGE + L_MENGE.
          ENDLOOP.
        ELSE.
    *     非批次管理物料设置
          APPEND WK_DATA TO LT_DATA.
          LOOP AT IT_MARD INTO WK_MARD
                          WHERE WERKS = WK_MATNR-WERKS
                            AND MATNR = WK_MATNR-MATNR
                            AND LGORT = WK_MATNR-LGORT.
    *       数量累计:限制使用的估价的库存/在运库存/质量检验中的库存
            CLEAR L_MENGE.
            L_MENGE = WK_MARD-CLABS + WK_MARD-CUMLM + WK_MARD-CINSM.
            WK_MATNR-MENGE = WK_MATNR-MENGE + L_MENGE.
          ENDLOOP.
        ENDIF.
        LOOP AT IT_MSKA INTO WK_MSKA
                        WHERE WERKS = WK_MATNR-WERKS
                          AND MATNR = WK_MATNR-MATNR
                          AND LGORT = WK_MATNR-LGORT.
    *     数量累计:限制使用的估价的库存/在运库存/质量检验中的库存
          CLEAR L_MENGE.
          L_MENGE = WK_MSKA-CLABS + WK_MSKA-CUMLM + WK_MSKA-CINSM.
          WK_MATNR-MENGE = WK_MATNR-MENGE + L_MENGE.
        ENDLOOP.
    *   在途库存设置
        IF WK_MATNR-LGORT = 'XXXX'.
          CLEAR WK_MARC.
          READ TABLE IT_MARC INTO WK_MARC
                             WITH KEY WERKS = WK_MATNR-WERKS
                                      MATNR = WK_MATNR-MATNR.
          IF SY-SUBRC = 0.
            WK_MATNR-MENGE = WK_MARC-CLABS.
          ENDIF.
        ENDIF.
        APPEND WK_MATNR TO IT_MATNR.
      ENDLOOP.
    
    * 非批次管理物料物料移动数据
      IF LT_DATA IS NOT INITIAL.
    *   计算库龄和最后物料移动时间
        REFRESH IT_MSEG.
        SELECT MSEG~BUKRS     "公司代码
               MSEG~MBLNR     "物料凭证编号
               MSEG~MJAHR     "物料凭证年度
               MSEG~ZEILE     "物料凭证中的项目
               MSEG~MATNR     "物料号
               MSEG~WERKS     "工厂
               MSEG~LGORT     "库存地点
               MSEG~BWART     "移动类型
               MSEG~SHKZG     "借贷标识
               MSEG~MENGE     "数量
               MSEG~EXBWR     "以本地货币计量的过帐金额
               MSEG~CHARG     "批号
               MSEG~WAERS     "价格单位
               MKPF~BUDAT     "凭证中的过帐日期
          INTO CORRESPONDING FIELDS OF TABLE IT_MSEG
          FROM MKPF
          INNER JOIN MSEG ON MKPF~MBLNR = MSEG~MBLNR
                         AND MKPF~MJAHR = MSEG~MJAHR
          FOR ALL ENTRIES IN LT_DATA
         WHERE MSEG~WERKS = LT_DATA-WERKS
           AND MSEG~MATNR = LT_DATA-MATNR
           AND MSEG~LGORT = LT_DATA-LGORT
           AND MSEG~BUKRS = P_BUKRS
           AND MKPF~BUDAT <= P_SDATE
           AND MSEG~MENGE <> 0
           AND MSEG~BWART IN ('101', '701', '561')
           AND MSEG~XAUTO = ''.
    
       DELETE IT_MSEG WHERE MATNR IS INITIAL.
    
       SORT IT_MSEG BY WERKS ASCENDING
                       MATNR ASCENDING
                       LGORT ASCENDING
                       BUDAT DESCENDING.
      ENDIF.
    
      IF IT_MATNR IS NOT INITIAL.
    *   得到批次管理的日期
    
        IF IT_CHARG IS NOT INITIAL.
          REFRESH IT_MCH1.
          SELECT *
            INTO CORRESPONDING FIELDS OF TABLE IT_MCH1
           FROM MCH1
           FOR ALL ENTRIES IN IT_CHARG
           WHERE MATNR = IT_CHARG-MATNR
             AND CHARG = IT_CHARG-CHARG.
    
    *     按照物料号/最近收货日期排序
          SORT IT_MCH1 BY MATNR ASCENDING
                          CHARG ASCENDING
                          LWEDT DESCENDING.
        ENDIF.
    *   批次收货日期管理绑定
        LOOP AT IT_CHARG ASSIGNING <FS_CHARG>.
          CLEAR WK_MCH1.
          READ TABLE IT_MCH1 INTO WK_MCH1
                             WITH KEY MATNR = <FS_CHARG>-MATNR
                                      CHARG = <FS_CHARG>-CHARG
                                      BINARY SEARCH.
          IF SY-SUBRC = 0.
            <FS_CHARG>-LWEDT = WK_MCH1-LWEDT.
          ENDIF.
          <FS_CHARG>-MENGE = <FS_CHARG>-CLABS +
                             <FS_CHARG>-CUMLM +
                             <FS_CHARG>-CINSM.
        ENDLOOP.
    *   得到库龄金额
        REFRESH IT_ZFIT015.
        IF P_BUKRS <> '3200'
       AND P_BUKRS <> '3300'.
        SELECT *
          FROM ZFIT015
          INTO CORRESPONDING FIELDS OF TABLE IT_ZFIT015
          FOR ALL ENTRIES IN IT_MATNR
         WHERE BUKRS = P_BUKRS
           AND MATNR = IT_MATNR-MATNR
           AND WERKS = IT_MATNR-WERKS
           AND GJAHR = V_GJAHR
           AND MONAT = V_MONAT.
        ELSE.
          SELECT *
            FROM ZFIT015
            INTO CORRESPONDING FIELDS OF TABLE IT_ZFIT015
            FOR ALL ENTRIES IN IT_MATNR
           WHERE BUKRS = P_BUKRS
             AND MATNR = IT_MATNR-MATNR
             AND GJAHR = V_GJAHR
             AND MONAT = V_MONAT.
          LOOP AT IT_ZFIT015 INTO WK_ZFIT015
                            WHERE WERKS IS INITIAL.
            WK_ZFIT015-WERKS = WK_ZFIT015-BUKRS.
            MODIFY IT_ZFIT015 FROM WK_ZFIT015 TRANSPORTING WERKS.
          ENDLOOP.
        ENDIF.
        SORT IT_ZFIT015 BY WERKS ASCENDING
                           MATNR ASCENDING.
    *   得到跌价比率
        REFRESH IT_ZFIT017.
        SELECT *
          FROM ZFIT017
          INTO CORRESPONDING FIELDS OF TABLE IT_ZFIT017
          FOR ALL ENTRIES IN IT_MATNR
         WHERE MATKL = IT_MATNR-MATKL
           AND PRCTR = IT_MATNR-PRCTR.
    
        SORT IT_ZFIT017 BY MATKL ASCENDING
                           PRCTR ASCENDING.
    
    *   利润中心描述
        REFRESH IT_CEPCT.
        SELECT *
          INTO CORRESPONDING FIELDS OF TABLE IT_CEPCT
          FROM CEPCT
          FOR ALL ENTRIES IN IT_MATNR
         WHERE PRCTR = IT_MATNR-PRCTR
           AND SPRAS = SY-LANGU.
        SORT IT_CEPCT BY PRCTR ASCENDING.
        DELETE ADJACENT DUPLICATES FROM IT_CEPCT COMPARING PRCTR.
    
    * 计算物料财务数量和单位
        REFRESH IT_ZMMT001.
        SELECT *
          INTO CORRESPONDING FIELDS OF TABLE IT_ZMMT001
          FROM ZMMT001
          FOR ALL ENTRIES IN IT_MATNR
         WHERE MATNR = IT_MATNR-MATNR.
        SORT IT_ZMMT001 BY MATNR ASCENDING.
      ENDIF.
    
    * 取得总帐科目数据
      REFRESH IT_FAG1.
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE IT_FAG1
        FROM FAGLFLEXT
       WHERE RYEAR = V_GJAHR
         AND RACCT = '0014100000'
         AND RBUKRS = P_BUKRS
         AND RBUSA IN S_WERKS
         AND RRCTY = '0'
         AND RLDNR = '0L'.
    
    * 得到发票校验引起的尾差金额
      REFRESH IT_ZFIT016.
      SELECT *
        FROM ZFIT016
        INTO CORRESPONDING FIELDS OF TABLE IT_ZFIT016
       WHERE BUKRS = P_BUKRS
         AND BUDAT <= P_SDATE
         AND GSBER IN S_WERKS.
    
    ENDFORM.                    " GET_DATA
    *&---------------------------------------------------------------------*
    *&      Form  EDIT_DATA
    *&---------------------------------------------------------------------*
    *       编辑对象数据
    *----------------------------------------------------------------------*
    FORM EDIT_DATA .
    
      DATA: L_QTY    TYPE MBEW-LBKUM,
            L_MENGE  TYPE MSEG-MENGE,
            L_SQTY   TYPE MBEW-LBKUM,
            L_NUM    TYPE MBEW-LBKUM,
            L_DMBTR  TYPE MBEW-SALK3,
            L_SALK3  TYPE MBEW-SALK3,
            L_INDEX  TYPE SY-INDEX,
            LW_MATNR TYPE TP_MATNR,
            L_SUM    TYPE ZFIT015-DMBTR,
            LW_ALV   TYPE TP_ALV.
    
    * 设置期间范围
      PERFORM SET_MONTH.
    
    * 数据整合
      LOOP AT IT_MATNR INTO WK_MATNR.
        L_INDEX = SY-TABIX + 1.
    
        CLEAR: WK_ALV,L_QTY.
    *   物料启用批次管理判断
        IF WK_MATNR-XCHPF IS NOT INITIAL.
    *     按照输出行循环批次管理表(物料/库位查找)
          LOOP AT IT_CHARG INTO WK_CHARG
                           WHERE WERKS = WK_MATNR-WERKS
                             AND MATNR = WK_MATNR-MATNR
                             AND LGORT = WK_MATNR-LGORT.
    
    *       计算物料所在库位的数量
            L_QTY = L_QTY + WK_CHARG-MENGE.
    
    *       库龄数量差异调整
            IF L_QTY > WK_MATNR-MENGE.
              WK_CHARG-MENGE = WK_MATNR-MENGE - ( L_QTY - WK_CHARG-MENGE ) .
              L_QTY = WK_MATNR-MENGE.
            ENDIF.
    
    *       过去3月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_3M
             OR WK_CHARG-LWEDT >= P_SDATE.
              WK_ALV-QTY3M = WK_ALV-QTY3M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去4月到6月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_6M.
              WK_ALV-QTY6M = WK_ALV-QTY6M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去7月到9月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_9M.
              WK_ALV-QTY9M = WK_ALV-QTY9M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去10月到12月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_12M.
              WK_ALV-QTY12M = WK_ALV-QTY12M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去13月到18月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_18M.
              WK_ALV-QTY18M = WK_ALV-QTY18M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去19月到24月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_24M.
              WK_ALV-QTY24M = WK_ALV-QTY24M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去25月到36月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_36M.
              WK_ALV-QTY36M = WK_ALV-QTY36M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去37月到60月以内的库龄数量
            IF WK_CHARG-LWEDT IN S_60M.
              WK_ALV-QTY60M = WK_ALV-QTY60M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       过去61月以上的库龄数量
            IF WK_CHARG-LWEDT < S_61M.
              WK_ALV-QTY61M = WK_ALV-QTY61M + WK_CHARG-MENGE.
              CONTINUE.
            ENDIF.
    *       库位数量相等判断
            IF L_QTY = WK_MATNR-MENGE.
              EXIT.
            ENDIF.
          ENDLOOP.
        ELSE.
    *     按照输出行循环MSEG(物料/库位查找)
          LOOP AT IT_MSEG INTO WK_MSEG
                          WHERE WERKS = WK_MATNR-WERKS
                            AND MATNR = WK_MATNR-MATNR
                            AND LGORT = WK_MATNR-LGORT.
    
    *       移动数量类型判断
            CLEAR L_MENGE.
            L_MENGE = WK_MSEG-MENGE.
    
    *       计算物料所在库位的数量
            L_QTY = L_QTY + L_MENGE.
    
    *       库龄数量差异调整
            IF L_QTY > WK_MATNR-MENGE.
              L_MENGE = WK_MATNR-MENGE - ( L_QTY - L_MENGE ).
              L_QTY = WK_MATNR-MENGE.
            ENDIF.
    
    *       过去3月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_3M.
              WK_ALV-QTY3M = WK_ALV-QTY3M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去4月到6月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_6M.
              WK_ALV-QTY6M = WK_ALV-QTY6M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去7月到9月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_9M.
              WK_ALV-QTY9M = WK_ALV-QTY9M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去10月到12月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_12M.
              WK_ALV-QTY12M = WK_ALV-QTY12M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去13月到18月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_18M.
              WK_ALV-QTY18M = WK_ALV-QTY18M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去19月到24月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_24M.
              WK_ALV-QTY24M = WK_ALV-QTY24M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去25月到36月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_36M.
              WK_ALV-QTY36M = WK_ALV-QTY36M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去37月到60月以内的库龄数量
            IF WK_MSEG-BUDAT IN S_60M.
              WK_ALV-QTY60M = WK_ALV-QTY60M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       过去61月以上的库龄数量
            IF WK_MSEG-BUDAT < S_61M.
              WK_ALV-QTY61M = WK_ALV-QTY61M + L_MENGE.
              CONTINUE.
            ENDIF.
    *       库位数量相等判断
            IF L_QTY = WK_MATNR-MENGE.
              EXIT.
            ENDIF.
         ENDLOOP.
        ENDIF.
        IF L_QTY < WK_MATNR-MENGE.
          WK_ALV-QTY61M = WK_ALV-QTY61M +
                          WK_MATNR-MENGE - L_QTY.
        ENDIF.
    *   计算物料总数量
        L_SQTY = L_SQTY + WK_MATNR-MENGE.
    *   库存数量/数量单位
        WK_ALV-LBKUM1 = WK_MATNR-MENGE.
        WK_ALV-MEINS1 = WK_MATNR-MEINS.
        WK_ALV-WAERS = WK_MSEG-WAERS.
        WK_ALV-WERKS = WK_MATNR-WERKS.
        WK_ALV-LGORT = WK_MATNR-LGORT.
        WK_ALV-ZYEAR = V_GJAHR.
        WK_ALV-ZMONTH = V_MONAT.
        WK_ALV-MATNR = WK_MATNR-MATNR.
        WK_ALV-MAKTX = WK_MATNR-MAKTX.
        WK_ALV-MATKL = WK_MATNR-MATKL.
        WK_ALV-XCHPF = WK_MATNR-XCHPF.
        WK_ALV-PRCTR = WK_MATNR-PRCTR.
    *   利润中心描述
        CLEAR WK_CEPCT.
        READ TABLE IT_CEPCT INTO WK_CEPCT
                            WITH KEY PRCTR = WK_MATNR-PRCTR
                                     BINARY SEARCH.
        IF SY-SUBRC = 0.
          WK_ALV-PRTXT = WK_CEPCT-MCTXT.
        ENDIF.
    *   财务库存数量/数量单位
        CLEAR WK_ZMMT001.
        READ TABLE IT_ZMMT001 INTO WK_ZMMT001
                              BINARY SEARCH
                              WITH KEY MATNR = WK_MATNR-MATNR.
        IF WK_ZMMT001-VALUE1 <> 0.
          WK_ALV-LBKUM2 = WK_ALV-LBKUM1 *
                         WK_ZMMT001-VALUE2 / WK_ZMMT001-VALUE1.
          WK_ALV-MEINS2 = WK_ZMMT001-UNIT.
        ENDIF.
    
    *   同组的最后一行数据
        CLEAR LW_MATNR.
        READ TABLE IT_MATNR INTO LW_MATNR INDEX L_INDEX.
        IF WK_MATNR-MATNR <> LW_MATNR-MATNR.
    *     计算库存金额
          CLEAR L_SUM.
          LOOP AT IT_ZFIT015 INTO WK_ZFIT015
                              WHERE WERKS = WK_MATNR-WERKS
                                AND MATNR = WK_MATNR-MATNR.
            L_SUM = L_SUM + WK_ZFIT015-DMBTR.
          ENDLOOP.
    *     物料总数量/金额保存
          CLEAR WK_QTY.
          WK_QTY-WERKS = WK_MATNR-WERKS.
          WK_QTY-MATNR = WK_MATNR-MATNR.
          WK_QTY-MENGE = L_SQTY.
          WK_QTY-DMBTR = L_SUM.
          APPEND WK_QTY TO IT_QTY.
          CLEAR L_SQTY.
        ENDIF.
        APPEND WK_ALV TO IT_ALV.
      ENDLOOP.
    * 排序
      SORT IT_QTY BY WERKS ASCENDING
                     MATNR ASCENDING.
    * 输出列表金额设定
      CLEAR L_INDEX.
    
      LOOP AT IT_ALV ASSIGNING <FS_ALV>.
        L_INDEX = SY-TABIX + 1.
    
    *   库位数量在物料总数量所占比例
        CLEAR WK_QTY.
        READ TABLE IT_QTY INTO WK_QTY
                          WITH KEY WERKS = <FS_ALV>-WERKS
                                   MATNR = <FS_ALV>-MATNR
                                   BINARY SEARCH.
        IF WK_QTY-MENGE <> 0.
          <FS_ALV>-PRICE = WK_QTY-DMBTR / WK_QTY-MENGE. "价格
    
    *     库位金额
          <FS_ALV>-SALK3 = <FS_ALV>-LBKUM1 * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          L_SALK3 = L_SALK3 + <FS_ALV>-SALK3.
    
    *     过去历史期间的库龄金额
          <FS_ALV>-PRC3M = <FS_ALV>-QTY3M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC6M = <FS_ALV>-QTY6M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC9M = <FS_ALV>-QTY9M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC12M = <FS_ALV>-QTY12M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC18M = <FS_ALV>-QTY18M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC24M = <FS_ALV>-QTY24M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC36M = <FS_ALV>-QTY36M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC60M = <FS_ALV>-QTY60M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
          <FS_ALV>-PRC61M = <FS_ALV>-QTY61M * ( WK_QTY-DMBTR / WK_QTY-MENGE ).
        ENDIF.
    
    *   差异列累计
        CLEAR L_DMBTR.
        L_DMBTR = <FS_ALV>-PRC3M + <FS_ALV>-PRC6M + <FS_ALV>-PRC9M
                + <FS_ALV>-PRC12M + <FS_ALV>-PRC18M + <FS_ALV>-PRC24M
                + <FS_ALV>-PRC36M + <FS_ALV>-PRC60M + <FS_ALV>-PRC61M.
        IF <FS_ALV>-SALK3 <> L_DMBTR.
          <FS_ALV>-PRC3M = <FS_ALV>-PRC3M + ( <FS_ALV>-SALK3 - L_DMBTR ).
        ENDIF.
    
    *   跌价金额/跌价维护标志
        CLEAR WK_ZFIT017.
        READ TABLE IT_ZFIT017 INTO WK_ZFIT017
                              WITH KEY MATKL = <FS_ALV>-MATKL
                                       PRCTR = <FS_ALV>-PRCTR
                                       BINARY SEARCH.
        IF SY-SUBRC = 0.
          <FS_ALV>-PERPRC = <FS_ALV>-PRC3M * WK_ZFIT017-PER3M / 100 +
                          <FS_ALV>-PRC6M * WK_ZFIT017-PER6M / 100 +
                          <FS_ALV>-PRC9M * WK_ZFIT017-PER9M / 100 +
                          <FS_ALV>-PRC12M * WK_ZFIT017-PER12M / 100 +
                          <FS_ALV>-PRC18M * WK_ZFIT017-PER18M / 100 +
                          <FS_ALV>-PRC24M * WK_ZFIT017-PER24M / 100 +
                          <FS_ALV>-PRC36M * WK_ZFIT017-PER36M / 100 +
                          <FS_ALV>-PRC60M * WK_ZFIT017-PER60M / 100 +
                          <FS_ALV>-PRC61M * WK_ZFIT017-PER61M / 100.
          <FS_ALV>-PERFLG = C_X.
        ENDIF.
    
    *   同组物料的最后一行数据
        CLEAR LW_ALV.
        READ TABLE IT_ALV INTO LW_ALV INDEX L_INDEX.
        IF <FS_ALV>-MATNR <> LW_ALV-MATNR.
    *     库位差异金额
          <FS_ALV>-SALK3 = <FS_ALV>-SALK3 + ( WK_QTY-DMBTR - L_SALK3 ).
          <FS_ALV>-PRC3M = <FS_ALV>-PRC3M + ( WK_QTY-DMBTR - L_SALK3 ).
          CLEAR L_SALK3.
        ENDIF.
      ENDLOOP.
    
    * 特殊行:0库存物料金额
      LOOP AT IT_ZFIT015 INTO WK_ZFIT015.
        READ TABLE IT_ALV TRANSPORTING NO FIELDS
                          WITH KEY MATNR = WK_ZFIT015-MATNR.
        IF SY-SUBRC <> 0.
          CLEAR LW_ALV.
          LW_ALV-ZYEAR = V_GJAHR.
          LW_ALV-ZMONTH = V_MONAT.
          LW_ALV-WERKS = WK_ZFIT015-WERKS.
          LW_ALV-MATNR = WK_ZFIT015-MATNR.
          LW_ALV-MAKTX = 'Special line: Qty:0/Amount'.
          LW_ALV-SALK3 = WK_ZFIT015-DMBTR.
          LW_ALV-PRC3M = WK_ZFIT015-DMBTR.
          APPEND LW_ALV TO IT_ALV.
        ENDIF.
      ENDLOOP.
    
    * 特殊行追加: 在制品
      CLEAR WK_OBJ.
      LOOP AT IT_FAG1 INTO WK_FAG1.
        WK_OBJ-HSLVT = WK_OBJ-HSLVT + WK_FAG1-HSLVT.
        WK_OBJ-HSL01 = WK_OBJ-HSL01 + WK_FAG1-HSL01.
        WK_OBJ-HSL02 = WK_OBJ-HSL02 + WK_FAG1-HSL02.
        WK_OBJ-HSL03 = WK_OBJ-HSL03 + WK_FAG1-HSL03.
        WK_OBJ-HSL04 = WK_OBJ-HSL04 + WK_FAG1-HSL04.
        WK_OBJ-HSL05 = WK_OBJ-HSL05 + WK_FAG1-HSL05.
        WK_OBJ-HSL06 = WK_OBJ-HSL06 + WK_FAG1-HSL06.
        WK_OBJ-HSL07 = WK_OBJ-HSL07 + WK_FAG1-HSL07.
        WK_OBJ-HSL08 = WK_OBJ-HSL08 + WK_FAG1-HSL08.
        WK_OBJ-HSL09 = WK_OBJ-HSL09 + WK_FAG1-HSL09.
        WK_OBJ-HSL10 = WK_OBJ-HSL10 + WK_FAG1-HSL10.
        WK_OBJ-HSL11 = WK_OBJ-HSL11 + WK_FAG1-HSL11.
        WK_OBJ-HSL12 = WK_OBJ-HSL12 + WK_FAG1-HSL12.
      ENDLOOP.
    * 指针指向对象行
      ASSIGN WK_OBJ TO <FS_HEAD>.
    
    * 默认值
      V_VALUE = WK_OBJ-HSLVT. "余额结转
    
      V_COUT = V_MONAT.
    
    * 得到指定月的累积金额
      CLEAR V_NUM.
      DO V_COUT TIMES.
    *   字段
        V_NUM = V_NUM + 1.
        CONCATENATE 'HSL'
                    V_NUM
               INTO V_FIELD.
        ASSIGN COMPONENT V_FIELD OF STRUCTURE <FS_HEAD> TO <FS_FIELD>.
        IF <FS_FIELD> <> 0.
          V_VALUE = V_VALUE + <FS_FIELD>.
        ENDIF.
      ENDDO.
      CLEAR LW_ALV.
      LW_ALV-ZYEAR = V_GJAHR.
      LW_ALV-ZMONTH = V_MONAT.
      LW_ALV-MAKTX = 'Special line: 14100000'.
      LW_ALV-SALK3 = V_VALUE.
      LW_ALV-PRC3M = V_VALUE.
      APPEND LW_ALV TO IT_ALV.
    
    * 特殊行追加: 尾差
      CLEAR L_DMBTR.
      LOOP AT IT_ZFIT016 INTO WK_ZFIT016.
        IF WK_ZFIT016-SHKZG = 'S'.
          L_DMBTR = L_DMBTR + WK_ZFIT016-DMBTR.
        ELSE.
          L_DMBTR = L_DMBTR - WK_ZFIT016-DMBTR.
        ENDIF.
      ENDLOOP.
      CLEAR LW_ALV.
      LW_ALV-ZYEAR = V_GJAHR.
      LW_ALV-ZMONTH = V_MONAT.
      LW_ALV-MAKTX = 'Special line: Tail Difference'.
      LW_ALV-SALK3 = L_DMBTR.
      LW_ALV-PRC3M = L_DMBTR.
      APPEND LW_ALV TO IT_ALV.
    
    
    ENDFORM.                    " EDIT_DATA
    *&---------------------------------------------------------------------*
    *&      Form  SET_FIELDCAT
    *&---------------------------------------------------------------------*
    *       设定 FIELDCAT
    *----------------------------------------------------------------------*
    FORM SET_FIELDCAT .
    
      DATA LW_FIEDCAT TYPE SLIS_FIELDCAT_ALV.
      REFRESH IT_FIELDCAT.
    
    * 仓库
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'LGORT'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T01.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 年
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'ZYEAR'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T02.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 月
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'ZMONTH'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T03.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 产品编号
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'MATNR'.
      LW_FIEDCAT-EDIT_MASK = '==MATN1'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T04.
    
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 产品描述
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'MAKTX'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T05.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 物料组
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'MATKL'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T40.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 利润中心
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRCTR'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T06.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 利润中心描述
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRTXT'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T43.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 批次管理
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'XCHPF'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T39.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    ** 最后异动日期
    *  CLEAR LW_FIEDCAT.
    *  LW_FIEDCAT-FIELDNAME = 'LDATE1'.
    *  LW_FIEDCAT-SELTEXT_L = TEXT-T07.
    *  APPEND LW_FIEDCAT TO IT_FIELDCAT.
    *
    ** 最后销售日期
    *  CLEAR LW_FIEDCAT.
    *  LW_FIEDCAT-FIELDNAME = 'LDATE2'.
    *  LW_FIEDCAT-SELTEXT_L = TEXT-T08.
    *  APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 成本单价
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRICE'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T09.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 价格单位
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'WAERS'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T44.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 实际成本金额
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'SALK3'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T10.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 数量(基本计量单位)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'LBKUM1'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T11.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 基本计量单位
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'MEINS1'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T12.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 数量(财务价量统一单位)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'LBKUM2'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T13.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 财务统一计量单位
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'MEINS2'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T14.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(3月以内)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY3M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T15.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(4-6月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY6M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T16.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(7-9月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY9M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T17.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(10-12月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY12M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T18.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(13-18月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY18M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T19.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(19-24月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY24M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T20.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(25-36月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY36M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T21.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(37-60月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY60M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T22.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄数量(60月以上)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'QTY61M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T23.
      LW_FIEDCAT-EMPHASIZE = 'C500'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    
    * 库龄金额(3月以内)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC3M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T24.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(4-6月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC6M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T25.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(7-9月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC9M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T26.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(10-12月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC12M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T27.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(13-18月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC18M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T28.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(19-24月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC24M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T29.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(25-36月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC36M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T30.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(37-60月)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC60M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T31.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 库龄金额(60月以上)
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PRC61M'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T32.
      LW_FIEDCAT-EMPHASIZE = 'C410'.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 跌价金额
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PERPRC'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T41.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    * 跌价维护标志
      CLEAR LW_FIEDCAT.
      LW_FIEDCAT-FIELDNAME = 'PERFLG'.
      LW_FIEDCAT-SELTEXT_L = TEXT-T42.
      APPEND LW_FIEDCAT TO IT_FIELDCAT.
    
    ENDFORM.                    " SET_FIELDCAT
    *&---------------------------------------------------------------------*
    *&      Form  SET_LAYOUT
    *&---------------------------------------------------------------------*
    *       设定 LAYOUT
    *----------------------------------------------------------------------*
    FORM SET_LAYOUT .
    
      WK_LAYOUT-ZEBRA = C_X.
      WK_LAYOUT-COLWIDTH_OPTIMIZE = C_X.
      WK_LAYOUT-BOX_FIELDNAME = 'CHK'.
    
    ENDFORM.                    " SET_LAYOUT
    *&---------------------------------------------------------------------*
    *&      Form  SET_ALV_EVENT
    *&---------------------------------------------------------------------*
    *       设定 Eventa
    *----------------------------------------------------------------------*
    FORM SET_ALV_EVENT .
    
      DATA: LW_EVENT TYPE SLIS_ALV_EVENT,
            LW_NAME  TYPE SLIS_FORMNAME VALUE 'TOP_OF_PAGE'.
      REFRESH IT_EVENT.
      CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
       EXPORTING
         I_LIST_TYPE           = 0
       IMPORTING
         ET_EVENTS             = IT_EVENT
       EXCEPTIONS
         LIST_TYPE_WRONG       = 1
         OTHERS                = 2.
      IF SY-SUBRC <> 0.
       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      CLEAR LW_EVENT.
      READ TABLE IT_EVENT INTO LW_EVENT
                          WITH KEY NAME = LW_NAME.
      IF SY-SUBRC = 0.
        MOVE LW_NAME TO LW_EVENT-FORM.
        MODIFY IT_EVENT FROM LW_EVENT INDEX SY-TABIX..
      ELSE.
        LW_EVENT-FORM = LW_NAME.
        LW_EVENT-NAME = LW_NAME.
        APPEND LW_EVENT TO IT_EVENT.
      ENDIF.
    
    ENDFORM.                    " SET_ALV_EVENT
    *&---------------------------------------------------------------------*
    *&      Form  SHOW_ALV
    *&---------------------------------------------------------------------*
    *       输出 ALV
    *----------------------------------------------------------------------*
    FORM SHOW_ALV .
    
    * Call ALV
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
          I_CALLBACK_PROGRAM                = SY-REPID
          IT_EVENTS                         = IT_EVENT
          IS_LAYOUT                         = WK_LAYOUT
          IT_FIELDCAT                       = IT_FIELDCAT
          I_SAVE                            = C_X
        TABLES
          T_OUTTAB                          = IT_ALV
        EXCEPTIONS
          PROGRAM_ERROR                     = 1
          OTHERS                            = 2.
      IF SY-SUBRC <> 0.
       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
    
    ENDFORM.                    " SHOW_ALV
    *&---------------------------------------------------------------------*
    *&      Form  TOP_OF_PAGE1
    *&---------------------------------------------------------------------*
    *       ALV Header Setting
    *----------------------------------------------------------------------*
    FORM TOP_OF_PAGE.
    
      DATA: L_MATNR1 TYPE MARA-MATNR,
            L_MATNR2 TYPE MARA-MATNR,
            LT_HEAD  TYPE SLIS_T_LISTHEADER,
            LW_HEAD  TYPE SLIS_LISTHEADER.
    
      REFRESH LT_HEAD.
      CLEAR LW_HEAD.
      LW_HEAD-TYP = 'H'.       "Header
      LW_HEAD-INFO = TEXT-T33. "财务库龄表
      APPEND LW_HEAD TO LT_HEAD.
      CLEAR LW_HEAD.
      LW_HEAD-TYP = 'S'.       "Selection
      LW_HEAD-KEY = TEXT-T35.  "会计期间:
      CONCATENATE V_GJAHR
                  '/'
                  V_MONAT
             INTO LW_HEAD-INFO.
      APPEND LW_HEAD TO LT_HEAD.
      CLEAR LW_HEAD.
      LW_HEAD-TYP = 'S'.       "Selection
      LW_HEAD-KEY = TEXT-T34.  "Company Name:
      LW_HEAD-INFO = P_BUKRS.
      APPEND LW_HEAD TO LT_HEAD.
    * 工厂
      IF S_WERKS IS NOT INITIAL.
        CLEAR LW_HEAD.
        LW_HEAD-TYP = 'S'.       "Selection
        LW_HEAD-KEY = TEXT-T36.  "工厂:
    *   多个单值查询
        IF S_WERKS-LOW IS NOT INITIAL
       AND S_WERKS-HIGH IS INITIAL.
          LOOP AT S_WERKS.
            CONCATENATE LW_HEAD-INFO
                        S_WERKS-LOW
                   INTO LW_HEAD-INFO
                   SEPARATED BY '/'.
          ENDLOOP.
          LW_HEAD-INFO+0(1) = ''.
        ENDIF.
    *   范围查询
        IF S_WERKS-HIGH IS NOT INITIAL.
          CONCATENATE S_WERKS-LOW
                      '~'
                      S_WERKS-HIGH
                 INTO LW_HEAD-INFO.
        ENDIF.
        APPEND LW_HEAD TO LT_HEAD.
      ENDIF.
    * 物料编号
      IF S_MATNR IS NOT INITIAL.
        CLEAR LW_HEAD.
        LW_HEAD-TYP = 'S'.       "Selection
        LW_HEAD-KEY = TEXT-T37.  "物料编号:
    *   多个单值查询
        IF S_MATNR-LOW IS NOT INITIAL
       AND S_MATNR-HIGH IS INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
          EXPORTING
            INPUT         = S_MATNR-LOW
          IMPORTING
            OUTPUT        = LW_HEAD-INFO.
        ENDIF.
    *   范围查询
        IF S_MATNR-HIGH IS NOT INITIAL.
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
            EXPORTING
              INPUT         = S_MATNR-LOW
            IMPORTING
              OUTPUT        = L_MATNR1.
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
            EXPORTING
              INPUT         = S_MATNR-HIGH
            IMPORTING
              OUTPUT        = L_MATNR2.
          CONCATENATE L_MATNR1
                      '~'
                      L_MATNR2
                 INTO LW_HEAD-INFO.
        ENDIF.
        APPEND LW_HEAD TO LT_HEAD.
      ENDIF.
    * 库存地点
      IF S_LGORT IS NOT INITIAL.
        CLEAR LW_HEAD.
        LW_HEAD-TYP = 'S'.       "Selection
        LW_HEAD-KEY = TEXT-T38.  "库存地点:
    *   多个单值查询
        IF S_LGORT-LOW IS NOT INITIAL
       AND S_LGORT-HIGH IS INITIAL.
          LW_HEAD-INFO = S_LGORT-LOW.
        ENDIF.
    *   范围查询
        IF S_LGORT-HIGH IS NOT INITIAL.
          CONCATENATE S_LGORT-LOW
                      '~'
                      S_LGORT-HIGH
                 INTO LW_HEAD-INFO.
        ENDIF.
        APPEND LW_HEAD TO LT_HEAD.
      ENDIF.
      CLEAR LW_HEAD.
      LW_HEAD-TYP = 'S'.
      APPEND LW_HEAD TO LT_HEAD.
      CLEAR LW_HEAD.
      LW_HEAD-TYP = 'S'.
      APPEND LW_HEAD TO LT_HEAD.
      CLEAR LW_HEAD.
      LW_HEAD-TYP = 'S'.
      APPEND LW_HEAD TO LT_HEAD.
      CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
        EXPORTING
          IT_LIST_COMMENTARY       = LT_HEAD.
    
    ENDFORM.                    " TOP_OF_PAGE
    *&---------------------------------------------------------------------*
    *&      Form  GET_DATE
    *&---------------------------------------------------------------------*
    *       得到查询日期范围
    *----------------------------------------------------------------------*
    *      -->I_IDATE  输入日期
    *      -->I_MONTH  月份
    *      <--C_DATE  查询日期
    *----------------------------------------------------------------------*
    FORM GET_DATE  USING  I_IDATE TYPE SY-DATUM
                          I_MONTH TYPE T5A4A-DLYMO
                   CHANGING C_DATE.
    
      CLEAR C_DATE.
      CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
        EXPORTING
          DATE            = I_IDATE
          DAYS            = '00'
          MONTHS          = I_MONTH
          SIGNUM          = '-'
          YEARS           = '00'
        IMPORTING
          CALC_DATE       = C_DATE.
    
    ENDFORM.                    " GET_DATE
    *&---------------------------------------------------------------------*
    *&      Form  SET_MONTH
    *&---------------------------------------------------------------------*
    *       设置各期间的范围
    *----------------------------------------------------------------------*
    FORM SET_MONTH .
    
      DATA: L_DATE1  TYPE SY-DATUM,
            L_DATE2  TYPE SY-DATUM,
            LW_MONTH LIKE LINE OF S_3M.
    
    * 得到查询日期范围(3月以内)
      PERFORM GET_DATE USING P_SDATE
                             '03'
                    CHANGING L_DATE1.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE1.
      LW_MONTH-HIGH = P_SDATE.
      APPEND LW_MONTH TO S_3M.
    
    * 得到查询日期范围(4-6月)
      PERFORM GET_DATE USING L_DATE1
                             '03'
                    CHANGING L_DATE2.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE2.
      LW_MONTH-HIGH = L_DATE1.
      APPEND LW_MONTH TO S_6M.
    
    * 得到查询日期范围(7-9月)
      PERFORM GET_DATE USING L_DATE2
                             '03'
                    CHANGING L_DATE1.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE1.
      LW_MONTH-HIGH = L_DATE2.
      APPEND LW_MONTH TO S_9M.
    
    * 得到查询日期范围(10-12月)
      PERFORM GET_DATE USING L_DATE1
                             '03'
                    CHANGING L_DATE2.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE2.
      LW_MONTH-HIGH = L_DATE1.
      APPEND LW_MONTH TO S_12M.
    
    * 得到查询日期范围(13-18月)
      PERFORM GET_DATE USING L_DATE2
                             '06'
                    CHANGING L_DATE1.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE1.
      LW_MONTH-HIGH = L_DATE2.
      APPEND LW_MONTH TO S_18M.
    
    * 得到查询日期范围(19-24月)
      PERFORM GET_DATE USING L_DATE1
                             '06'
                    CHANGING L_DATE2.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE2.
      LW_MONTH-HIGH = L_DATE1.
      APPEND LW_MONTH TO S_24M.
    
    * 得到查询日期范围(25-36月)
      PERFORM GET_DATE USING L_DATE2
                             '12'
                    CHANGING L_DATE1.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE1.
      LW_MONTH-HIGH = L_DATE2.
      APPEND LW_MONTH TO S_36M.
    
    * 得到查询日期范围(37-60月)
      PERFORM GET_DATE USING L_DATE1
                             '24'
                    CHANGING L_DATE2.
      CLEAR LW_MONTH.
      LW_MONTH-SIGN = 'I'.
      LW_MONTH-OPTION = 'BT'.
      LW_MONTH-LOW = L_DATE2.
      LW_MONTH-HIGH = L_DATE1.
      APPEND LW_MONTH TO S_60M.
    
    * 得到查询日期范围(61月)
      S_61M = L_DATE2.
    
    ENDFORM.                    " SET_MONTH
    *&---------------------------------------------------------------------*
    *&      Form  SET_DATE
    *&---------------------------------------------------------------------*
    *       查询日期设置
    *----------------------------------------------------------------------*
    FORM SET_DATE .
    
       CLEAR P_SDATE.
       CALL FUNCTION 'LAST_DAY_OF_MONTHS'
         EXPORTING
           DAY_IN                  = SY-DATUM
         IMPORTING
           LAST_DAY_OF_MONTH       = P_SDATE
         EXCEPTIONS
           DAY_IN_NO_DATE          = 1
           OTHERS                  = 2.
       IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
       ENDIF.
    
    ENDFORM.                    " SET_DATE

    本文转载自:https://blog.csdn.net/sinat_28730703/article/details/46357159

  • 相关阅读:
    Golang ECHOhtml模板处理【5】
    Golang ECHO处理请求结果【4】
    Golang ECHO处理请求参数【3】
    Golang ECHO路由与控制器【2】
    Golang ECHO框架入门【1】
    GoLang GORM-CRUD
    Flume—(2)实时读取本地文件到HDFS
    Hive—开启日志
    Flume—(1)监控本机端口数据
    Hive—分桶及抽样查询
  • 原文地址:https://www.cnblogs.com/BruceKing/p/10729845.html
Copyright © 2020-2023  润新知