实现业务:计算财务库龄表从查询日期起到过去60个月之间的库龄数量/金额。
计算难点:SAP涉及到MSEG物料表,分摊库龄会特别慢,库龄表更是SAP的痛点。
实现思路: 批次物料可以从MCHB等表中读取库龄数,减少MSEG访问量。
&---------------------------------------------------------------------*
*& Report ZFIR005
*&
*&---------------------------------------------------------------------*
*& Programe ID: ZFIR005
*& Programe Discription: 财务库龄表
*& Change Date: 2015/1/15
*& Change By: **有希望的草根,QQ:654563691**
*& 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