&---------------------------------------------------------------------*
*& Report ZFIR005
*&
*&---------------------------------------------------------------------*
*& Programe ID: ZFIR005
*& Programe Discription: 财务库龄表
*& Change Date:
*& Change By:
*& Version: Ver0.
*&---------------------------------------------------------------------* 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 ''. *&---------------------------------------------------------------------*
*& 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 <> .
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+() = ''.
CONCATENATE '该公司代码不包含工厂:'
L_STR
INTO L_STR.
MESSAGE E398() 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+()
''
INTO V_FDATE.
V_GJAHR = P_SDATE+().
V_MONAT = P_SDATE+(). * 得到批次管理物料数据
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
''
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 =
AND CUMLM =
AND CINSM = . 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
''
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 =
AND CUMLM =
AND CINSM = . 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
''
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 =
AND CUMLM =
AND CINSM = . 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
''
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 =
AND CUMLM =
AND CINSM = . APPEND LINES OF IT_MARC TO IT_DATA. * 排除库存数量为0的对象数据
DELETE IT_DATA WHERE ( CLABS =
AND CUMLM =
AND CINSM = )
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 = .
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 = .
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 <>
AND MSEG~BWART IN ('', '', '')
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 = .
<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 <> ''
AND P_BUKRS <> ''.
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 = ''
AND RBUKRS = P_BUKRS
AND RBUSA IN S_WERKS
AND RRCTY = ''
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 + . 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 = .
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 <> .
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 + . * 库位数量在物料总数量所占比例
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 <> .
<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 = .
<FS_ALV>-PERPRC = <FS_ALV>-PRC3M * WK_ZFIT017-PER3M / +
<FS_ALV>-PRC6M * WK_ZFIT017-PER6M / +
<FS_ALV>-PRC9M * WK_ZFIT017-PER9M / +
<FS_ALV>-PRC12M * WK_ZFIT017-PER12M / +
<FS_ALV>-PRC18M * WK_ZFIT017-PER18M / +
<FS_ALV>-PRC24M * WK_ZFIT017-PER24M / +
<FS_ALV>-PRC36M * WK_ZFIT017-PER36M / +
<FS_ALV>-PRC60M * WK_ZFIT017-PER60M / +
<FS_ALV>-PRC61M * WK_ZFIT017-PER61M / .
<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 <> .
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 + .
CONCATENATE 'HSL'
V_NUM
INTO V_FIELD.
ASSIGN COMPONENT V_FIELD OF STRUCTURE <FS_HEAD> TO <FS_FIELD>.
IF <FS_FIELD> <> .
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. * 库龄数量(-6月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'QTY6M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T16.
LW_FIEDCAT-EMPHASIZE = 'C500'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄数量(-9月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'QTY9M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T17.
LW_FIEDCAT-EMPHASIZE = 'C500'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄数量(-12月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'QTY12M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T18.
LW_FIEDCAT-EMPHASIZE = 'C500'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄数量(-18月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'QTY18M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T19.
LW_FIEDCAT-EMPHASIZE = 'C500'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄数量(-24月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'QTY24M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T20.
LW_FIEDCAT-EMPHASIZE = 'C500'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄数量(-36月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'QTY36M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T21.
LW_FIEDCAT-EMPHASIZE = 'C500'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄数量(-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. * 库龄金额(-6月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'PRC6M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T25.
LW_FIEDCAT-EMPHASIZE = 'C410'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄金额(-9月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'PRC9M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T26.
LW_FIEDCAT-EMPHASIZE = 'C410'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄金额(-12月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'PRC12M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T27.
LW_FIEDCAT-EMPHASIZE = 'C410'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄金额(-18月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'PRC18M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T28.
LW_FIEDCAT-EMPHASIZE = 'C410'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄金额(-24月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'PRC24M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T29.
LW_FIEDCAT-EMPHASIZE = 'C410'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄金额(-36月)
CLEAR LW_FIEDCAT.
LW_FIEDCAT-FIELDNAME = 'PRC36M'.
LW_FIEDCAT-SELTEXT_L = TEXT-T30.
LW_FIEDCAT-EMPHASIZE = 'C410'.
APPEND LW_FIEDCAT TO IT_FIELDCAT. * 库龄金额(-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 =
IMPORTING
ET_EVENTS = IT_EVENT
EXCEPTIONS
LIST_TYPE_WRONG =
OTHERS = .
IF SY-SUBRC <> .
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 = .
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 =
OTHERS = .
IF SY-SUBRC <> .
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+() = ''.
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 = ''
MONTHS = I_MONTH
SIGNUM = '-'
YEARS = ''
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
''
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. * 得到查询日期范围(-6月)
PERFORM GET_DATE USING L_DATE1
''
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. * 得到查询日期范围(-9月)
PERFORM GET_DATE USING L_DATE2
''
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. * 得到查询日期范围(-12月)
PERFORM GET_DATE USING L_DATE1
''
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. * 得到查询日期范围(-18月)
PERFORM GET_DATE USING L_DATE2
''
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. * 得到查询日期范围(-24月)
PERFORM GET_DATE USING L_DATE1
''
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. * 得到查询日期范围(-36月)
PERFORM GET_DATE USING L_DATE2
''
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. * 得到查询日期范围(-60月)
PERFORM GET_DATE USING L_DATE1
''
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 =
OTHERS = .
IF SY-SUBRC <> .
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

SAP库龄表的更多相关文章

  1. 【MM系列】SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解   第一篇 ...

  2. 【MM系列】SAP SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解   ...

  3. Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)

    问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...

  4. 用友ERP T6技术解析(六) 库龄分析

    2.4 库存管理   2.4.1 库龄分析 介绍:库存账龄是在某时间节点,某种或某类存货的库存时间的加权平均值,跟库存周转率关系明显,库存周转率越高,库存账龄越低,可是二者又不是反比关系.不能简单把库 ...

  5. MySQL 库、表、记录、相关操作(3)

    MySQL 库.表.记录.相关操作(3) 单表查询 """ 增: insert [into] [数据库名.]表名[(字段1[, ..., 字段n])] values (数 ...

  6. 116_Power Pivot 先进先出原则库龄库存计算相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一背景 前面写过了一个关于进销存的案例,留一个话题就是先进先出的库存计算. 刚好有朋友提了相关这样的需求.先来看看效果. ...

  7. SQL Server跨库复制表数据错误的解决办法

    SQL Server跨库复制表数据的解决办法   跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...

  8. 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验

    一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...

  9. 获取sqlserver数据库中所有库、表、字段名的方法

    获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...

随机推荐

  1. 带你从零学ReactNative开发跨平台App开发(三)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  2. JS DOM节点增删改查 属性设置

    一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加   删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...

  3. PyQt4(简单界面)

    import sys; from PyQt4 import QtCore, QtGui; app=QtGui.QApplication(sys.argv); widget=QtGui.QWidget( ...

  4. 用UIScrollView产生视差效果

    用UIScrollView产生视差效果 效果: 高级效果: 源码: MoreInfoView.h  +  MoreInfoView.m // // MoreInfoView.h // YXCell / ...

  5. [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]

    USING GIT IN XCODE KEEPING IN SYNC WITH REMOTE REPOSITORIES As you make changes in your local workin ...

  6. 处理Account locked due to 217 failed logins的问题

    处理Account locked due to 217 failed logins的问题 [root@xxx1 ~]# scp 123.txt root@IP地址:/root Account lock ...

  7. 新手指南:Linux上vi(vim)编辑器使用教程

    vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是“visual interface”的缩 ...

  8. Echarts 曲线数少于图例数解决方法

    在上一篇文章 Echarts 多曲线“断点”问题解决方法 中说到了Angular 项目中要使用 Echarts 的方法. 说明了自己解决当“每一条曲线的横坐标不相同”时,在各条曲线上,它们的值采用数组 ...

  9. Java8新特性 -- Lambda 方法引用和构造器引用

    一. 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用” 要求 方法的参数和返回值类型 和 函数式接口中的参数类型和返回值类型保持一致. 主要有三种语法格式: 对象 :: ...

  10. etcd 删除

    vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="https://192.168.30.241:2379,https://192.168 ...