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