*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2020-02-21
*& Program Type : Report
*& Description : 库存周转率报表
*&---------------------------------------------------------------------*
REPORT ZMMR132.
*&---------------------------------------------------------------------*
*& 包含 YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:MSEG,MARA,MARC,CKMLCR,VBAP,MATDOC.
TYPE-POOLS:SLIS.
"定义ALV输出所需变量
DATA: S_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
TYPES: BEGIN OF GTS_DATA,
VLFAG TYPE C, "标记字段
MATNR TYPE MSEG-MATNR, "物料编码
MAKTX TYPE MAKT-MAKTX, "物料描述
WERKS TYPE MSEG-WERKS, "工厂
BDATJ TYPE CKMLCR-BDATJ, "年度
POPER TYPE CKMLCR-POPER, "月份
DISPO TYPE MARC-DISPO, "MRP控制员
SOBSL TYPE MARC-SOBSL, "特殊采购类型
DSNAM TYPE T024D-DSNAM, "MRP控制员描述
MTART TYPE MARA-MTART, "物料类型
MTBEZ TYPE T134T-MTBEZ, "物料类型描述
MATKL TYPE MARA-MATKL, "物料组
WGBEZ TYPE V023-WGBEZ, "物料组描述
EXTWG TYPE MARA-EXTWG, "系列
MEINSJ TYPE MARA-MEINS, "基本单位
QCWJG TYPE ZCURRA, "期初物料工厂价格(5位小数位)
QMWJG TYPE ZCURRA, "期末物料工厂价格(5位小数位)
QCKCS TYPE ZQUAN, "期初库存数量
QCKCJ TYPE ZCURRA, "期初库存金额
QJCKS TYPE ZQUAN, "期间出库数量
QJCKJ TYPE ZCURRA, "期间出库金额
QJCKSZ TYPE ZQUAN, "参与周转率计算的期间出库数量
QJCKJZ TYPE ZCURRA, "参与周转率计算的期间出库金额
QJRKS TYPE ZQUAN, "期间入库数量
QJRKJ TYPE ZCURRA, "期间入库金额
QMKCS TYPE ZQUAN, "期末库存数量
QMKCJ TYPE ZCURRA, "期末库存金额
KCZZL TYPE CHAR12, "库存周转率
KCZTS TYPE ZQUAN, "周转天数
BWART TYPE MSEG-BWART, "移动类型
SHKZG TYPE MSEG-SHKZG, "借贷方标识
MENGE TYPE MSEG-MENGE, "数量
MEINS TYPE MSEG-MEINS, "基本计量单位
ZKCJE TYPE ZCURRA, "库存金额
ZUBIE TYPE ZTMM_ST02-ZUBIE, "类别组
ZUBMS TYPE ZTMM_ST02-ZUBMS, "类别描述
ZYDFX TYPE ZTMM_ST02-ZYDFX, "移动方向(OUT/IN)
SHKZG_ST TYPE ZTMM_ST02-SHKZG_ST, "借方/贷方标识
BWART_ST TYPE ZTMM_ST02-BWART_ST, "移动类型(库存管理)
SZDZF TYPE ZTMM_ST02-SZDZF, "正负值(+/-)
ZCYJS TYPE ZTMM_ST02-ZCYJS, "是否参与周转率计算
MBLNR TYPE MSEG-MBLNR, "凭证中的过帐日期
MJAHR TYPE MSEG-MJAHR, "凭证中的过帐日期
ZEILE TYPE MSEG-ZEILE, "凭证中的过帐日期
BUDAT TYPE MKPF-BUDAT, "凭证中的过帐日期
END OF GTS_DATA.
DATA: LV_DATUMU TYPE DATUM .
DATA: LV_DATUMD TYPE DATUM .
DATA: LV_DATUML TYPE DATUM .
DATA: LV_DATUMN TYPE DATUM .
DATA: LV_YEARL TYPE NUMC4 .
DATA: LV_YEARN TYPE NUMC4 .
DATA: LV_POPEL TYPE POPER .
DATA: LV_POPEN TYPE POPER .
DATA: LV_DYTS TYPE CHAR3 .
DATA: GT_DATA TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_B TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GV_TOP TYPE SDYDO_TEXT_ELEMENT.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONS: S_MATNR FOR MSEG-MATNR MODIF ID C1, "物料编码
S_WERKS FOR MSEG-WERKS MODIF ID C1, "工厂
S_MTART FOR MARA-MTART MODIF ID C1, "物料类型
S_MATKL FOR MARA-MATKL MODIF ID C1, "物料组
S_EXTWG FOR MARA-EXTWG MODIF ID C1, "系列
S_DISPO FOR MARC-DISPO MODIF ID C1. "MRP控制员
PARAMETERS: P_BDATJ TYPE NUMC4 MODIF ID C1 OBLIGATORY, "年度
P_POPER TYPE NUMC2 MODIF ID C1 OBLIGATORY. "月份
SELECTION-SCREEN END OF BLOCK B1.
*&---------------------------------------------------------------------*
*& 包含 YN_TEST02_FOM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& 包含 ZFIR092_FOM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_EXCLUDE_OPTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_EXCLUDE_OPTION .
** Define the object to be passed to the RESTRICTION parameter
*DATA RESTRICT TYPE SSCR_RESTRICT.
*
** Auxiliary objects for filling RESTRICT
*DATA : OPTLIST TYPE SSCR_OPT_LIST,
* ASS TYPE SSCR_ASS.
*
** 限制MATNR参数只能使用‘EQ’ 和‘BT’.
* OPTLIST-NAME = 'OBJECTKEY1'.
* OPTLIST-OPTIONS-EQ = 'X'.
* OPTLIST-OPTIONS-BT = 'X'.
* APPEND OPTLIST TO RESTRICT-OPT_LIST_TAB.
*
* ASS-KIND = 'S'.
* ASS-NAME = 'S_MONAT'.
* ASS-SG_MAIN = 'I'.
* ASS-SG_ADDY = SPACE.
* ASS-OP_MAIN = 'OBJECTKEY1'.
* APPEND ASS TO RESTRICT-ASS_TAB.
*
* CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
* EXPORTING
* RESTRICTION = RESTRICT
* EXCEPTIONS
* TOO_LATE = 1
* REPEATED = 2
* SELOPT_WITHOUT_OPTIONS = 3
* SELOPT_WITHOUT_SIGNS = 4
* INVALID_SIGN = 5
* EMPTY_OPTION_LIST = 6
* INVALID_KIND = 7
* REPEATED_KIND_A = 8
* OTHERS = 9
* .
*
* IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
* ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_OUTPUT .
LOOP AT SCREEN.
CASE SCREEN-GROUP1.
WHEN 'M1'.
SCREEN-INPUT = '0'.
ENDCASE.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
* AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
* ID 'WERKS' FIELD P_WERKS.
* IF SY-SUBRC <> 0.
* MESSAGE '您没有工厂:'&& P_WERKS && ' 的权限!' TYPE 'E' .
* ENDIF.
DATA: GT_T001W TYPE TABLE OF T001W WITH HEADER LINE.
DATA LV_FLAG TYPE C.
CLEAR LV_FLAG .
CLEAR GT_T001W[].
SELECT WERKS INTO CORRESPONDING FIELDS OF TABLE GT_T001W[] FROM T001W
WHERE WERKS IN S_WERKS .
LOOP AT GT_T001W.
AUTHORITY-CHECK OBJECT 'M_MSEG_WMB'
ID 'WERKS' FIELD GT_T001W-WERKS.
IF SY-SUBRC <> 0.
LV_FLAG = 'X' .
EXIT .
ENDIF.
CLEAR GT_T001W .
ENDLOOP.
IF LV_FLAG IS NOT INITIAL.
MESSAGE '您没有工厂:'&& GT_T001W-WERKS && ' 的权限!' TYPE 'E' .
ENDIF.
LV_DATUMD(6) = P_BDATJ && P_POPER .
IF SY-DATUM(6) =< LV_DATUMD(6).
MESSAGE '不能查询当月及之后的期间!' TYPE 'E' .
ELSE.
LV_DATUMD = LV_DATUMD(6) && '01'.
LV_DATUMU(6) = LV_DATUMD(6) .
LV_DATUMU+6(2) = '27'.
LV_DATUMU = LV_DATUMU + 6.
LV_DATUMU+6(2) = '01'.
LV_DATUMU = LV_DATUMU - 1.
LV_DATUMN = LV_DATUMD .
LV_DATUML = LV_DATUMD - 1.
LV_YEARL = LV_DATUML(4).
LV_YEARN = LV_DATUMN(4).
LV_POPEL = LV_DATUML+4(2).
LV_POPEN = LV_DATUMN+4(2).
*当月天数
LV_DYTS = LV_DATUMU+6(2).
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
DATA GT_CKMLCR TYPE TABLE OF CKMLCR WITH HEADER LINE.
DATA GT_MARD TYPE TABLE OF MARD WITH HEADER LINE.
DATA GT_MARDA TYPE TABLE OF MARD WITH HEADER LINE.
DATA GT_MARDH TYPE TABLE OF MARDH WITH HEADER LINE.
DATA GT_MSLB TYPE TABLE OF MSLB WITH HEADER LINE.
DATA GT_MSLBA TYPE TABLE OF MSLB WITH HEADER LINE.
DATA GT_MSLBH TYPE TABLE OF MSLBH WITH HEADER LINE.
DATA GT_MSKU TYPE TABLE OF MSKU WITH HEADER LINE.
DATA GT_MSKUA TYPE TABLE OF MSKU WITH HEADER LINE.
DATA GT_MSKUH TYPE TABLE OF MSKUH WITH HEADER LINE.
DATA GT_MSKA TYPE TABLE OF MSKA WITH HEADER LINE.
DATA GT_MSKAA TYPE TABLE OF MSKA WITH HEADER LINE.
DATA GT_MSKAH TYPE TABLE OF MSKAH WITH HEADER LINE.
DATA GT_MSFD TYPE TABLE OF MSFD WITH HEADER LINE.
DATA GT_MSFDA TYPE TABLE OF MSFD WITH HEADER LINE.
DATA GT_MSFDH TYPE TABLE OF MSFDH WITH HEADER LINE.
* CLEAR GT_DATA[] .
* SELECT
* MSEG~MATNR
* MSEG~WERKS
* MSEG~BWART
* MSEG~SHKZG
* MSEG~MENGE
* MSEG~MEINS
* MARC~DISPO
* MARA~MTART
* MARA~MATKL
* MARA~EXTWG
* ZTMM_ST02~ZUBIE
* ZTMM_ST02~ZYDFX
* ZTMM_ST02~ZCYJS
* ZTMM_ST02~ZUBMS
* INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
* FROM MSEG
* INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
* INNER JOIN ZTMM_ST02 ON ZTMM_ST02~BWART_ST = MSEG~BWART AND ZTMM_ST02~SHKZG_ST = MSEG~SHKZG
* INNER JOIN MARA ON MARA~MATNR = MSEG~MATNR
* INNER JOIN MARC ON MARC~MATNR = MSEG~MATNR AND MARC~WERKS = MSEG~WERKS
* WHERE MKPF~BUDAT >= LV_DATUMD
* AND MKPF~BUDAT <= LV_DATUMU
* AND MSEG~MATNR IN S_MATNR
* AND MSEG~WERKS IN S_WERKS
* AND MARA~MTART IN S_MTART
* AND MARA~MATKL IN S_MATKL
* AND MARA~EXTWG IN S_EXTWG
* AND MARC~DISPO IN S_DISPO
* .
CLEAR GT_DATA[] .
SELECT
MARC~MATNR
MARC~WERKS
MARC~DISPO
MARC~SOBSL
MARA~MTART
MARA~MATKL
MARA~EXTWG
MARA~MEINS AS MEINSJ
INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
FROM MARC
INNER JOIN MARA ON MARA~MATNR = MARC~MATNR
* LEFT JOIN MSEG ON MSEG~MATNR = MARC~MATNR
WHERE MARC~MATNR IN S_MATNR
AND MARC~WERKS IN S_WERKS
AND MARA~MTART IN S_MTART
AND MARA~MATKL IN S_MATKL
AND MARA~EXTWG IN S_EXTWG
AND MARC~DISPO IN S_DISPO
.
IF GT_DATA[] IS NOT INITIAL .
CLEAR GT_DATA_A[] .
SELECT
MSEG~MATNR
MSEG~WERKS
MSEG~BWART
MSEG~SHKZG
MSEG~MENGE
MSEG~MEINS
ZTMM_ST02~ZUBIE
ZTMM_ST02~ZYDFX
ZTMM_ST02~ZCYJS
ZTMM_ST02~ZUBMS
ZTMM_ST02~SZDZF
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_A[]
FROM MSEG
INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INNER JOIN ZTMM_ST02 ON ZTMM_ST02~BWART_ST = MSEG~BWART AND ZTMM_ST02~SHKZG_ST = MSEG~SHKZG
FOR ALL ENTRIES IN GT_DATA[]
WHERE MKPF~BUDAT >= LV_DATUMD
AND MKPF~BUDAT <= LV_DATUMU
AND MSEG~MATNR = GT_DATA-MATNR
AND MSEG~WERKS = GT_DATA-WERKS
.
ENDIF.
LOOP AT GT_DATA_A.
IF GT_DATA_A-SZDZF = '-'.
GT_DATA_A-MENGE = GT_DATA_A-MENGE * -1 .
ENDIF.
MODIFY GT_DATA_A.
CLEAR GT_DATA_A.
ENDLOOP.
LOOP AT GT_DATA.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
INPUT = GT_DATA-MEINSJ
LANGUAGE = 'E'
IMPORTING
OUTPUT = GT_DATA-MEINSJ
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
SELECT SINGLE MAKTX INTO GT_DATA-MAKTX FROM MAKT
WHERE MATNR = GT_DATA-MATNR
.
SELECT SINGLE DSNAM INTO GT_DATA-DSNAM FROM T024D
WHERE WERKS = GT_DATA-WERKS
AND DISPO = GT_DATA-DISPO
.
SELECT SINGLE MTBEZ INTO GT_DATA-MTBEZ FROM T134T
WHERE MTART = GT_DATA-MTART
.
SELECT SINGLE WGBEZ INTO GT_DATA-WGBEZ FROM T023T
WHERE MATKL = GT_DATA-MATKL
.
GT_DATA-BDATJ = P_BDATJ.
GT_DATA-POPER = P_POPER.
LOOP AT GT_DATA_A WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
IF GT_DATA_A-ZYDFX = 'OUT'.
* 期间出库数量
GT_DATA-QJCKS = GT_DATA-QJCKS + GT_DATA_A-MENGE .
IF GT_DATA_A-ZCYJS IS NOT INITIAL.
* 参与周转率计算的期间出库数量
GT_DATA-QJCKSZ = GT_DATA-QJCKSZ + GT_DATA_A-MENGE .
ENDIF.
ELSEIF GT_DATA_A-ZYDFX = 'IN'.
* 期间入库数量
GT_DATA-QJRKS = GT_DATA-QJRKS + GT_DATA_A-MENGE .
ENDIF.
ENDLOOP.
CLEAR GT_CKMLCR[].
SELECT
CKMLCR~PEINH
CKMLCR~VPRSV
CKMLCR~STPRS
CKMLCR~PVPRS
CKMLCR~WAERS
CKMLCR~BDATJ
CKMLCR~POPER
INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR[]
FROM CKMLCR
INNER JOIN CKMLHD ON CKMLHD~KALNR = CKMLCR~KALNR
WHERE CKMLHD~MATNR = GT_DATA-MATNR
AND CKMLHD~BWKEY = GT_DATA-WERKS
AND CKMLCR~CURTP = '10'
AND ( ( CKMLCR~BDATJ = LV_YEARL AND CKMLCR~POPER = LV_POPEL ) OR ( CKMLCR~BDATJ = LV_YEARN AND CKMLCR~POPER = LV_POPEN ) )
.
* 获取期初物料工厂价格
CLEAR GT_CKMLCR.
READ TABLE GT_CKMLCR WITH KEY VPRSV = 'V' BDATJ = LV_YEARL POPER = LV_POPEL .
IF SY-SUBRC = 0.
GT_DATA-QCWJG = GT_CKMLCR-PVPRS / GT_CKMLCR-PEINH .
ELSE.
READ TABLE GT_CKMLCR WITH KEY VPRSV = 'S' BDATJ = LV_YEARL POPER = LV_POPEL .
IF SY-SUBRC = 0.
GT_DATA-QCWJG = GT_CKMLCR-STPRS / GT_CKMLCR-PEINH .
ENDIF.
ENDIF.
* 获取期末物料工厂价格
CLEAR GT_CKMLCR.
READ TABLE GT_CKMLCR WITH KEY VPRSV = 'V' BDATJ = LV_YEARN POPER = LV_POPEN .
IF SY-SUBRC = 0.
GT_DATA-QMWJG = GT_CKMLCR-PVPRS / GT_CKMLCR-PEINH .
ELSE.
READ TABLE GT_CKMLCR WITH KEY VPRSV = 'S' BDATJ = LV_YEARN POPER = LV_POPEN .
IF SY-SUBRC = 0.
GT_DATA-QMWJG = GT_CKMLCR-STPRS / GT_CKMLCR-PEINH .
ENDIF.
ENDIF.
IF GT_DATA-QMWJG IS INITIAL.
GT_DATA-QMWJG = GT_DATA-QCWJG .
ENDIF.
*期间出库金额
GT_DATA-QJCKJ = GT_DATA-QJCKS * GT_DATA-QMWJG .
*参与周转率计算的期间出库金额
GT_DATA-QJCKJZ = GT_DATA-QJCKSZ * GT_DATA-QMWJG .
*期间入库金额
GT_DATA-QJRKJ = GT_DATA-QJRKS * GT_DATA-QMWJG .
*----------------------------------------------------------------------------
*期初普通库存(非限制库存LABST、质检库存INSME):
CLEAR GT_MARD[].
SELECT *
FROM MARD
INTO CORRESPONDING FIELDS OF TABLE GT_MARD[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MARDH[].
SELECT *
FROM MARDH
INTO CORRESPONDING FIELDS OF TABLE GT_MARDH[]
WHERE ( LFGJA > LV_YEARL OR ( LFGJA = LV_YEARL AND LFMON >= LV_POPEL ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MARDH[] BY MATNR WERKS LGORT LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MARDH[] COMPARING MATNR WERKS LGORT .
LOOP AT GT_MARD.
READ TABLE GT_MARDH WITH KEY MATNR = GT_MARD-MATNR
WERKS = GT_MARD-WERKS
LGORT = GT_MARD-LGORT
.
IF SY-SUBRC = 0.
GT_MARD-LABST = GT_MARDH-LABST .
GT_MARD-INSME = GT_MARDH-INSME .
ENDIF.
GT_DATA-QCKCS = GT_DATA-QCKCS + GT_MARD-LABST + GT_MARD-INSME .
MODIFY GT_MARD .
CLEAR GT_MARD .
ENDLOOP.
*期末期初普通库存(非限制库存LABST、质检库存INSME):
CLEAR GT_MARDA[].
SELECT *
FROM MARD
INTO CORRESPONDING FIELDS OF TABLE GT_MARDA[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MARDH[].
SELECT *
FROM MARDH
INTO CORRESPONDING FIELDS OF TABLE GT_MARDH[]
WHERE ( LFGJA > LV_YEARN OR ( LFGJA = LV_YEARN AND LFMON >= LV_POPEN ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MARDH[] BY MATNR WERKS LGORT LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MARDH[] COMPARING MATNR WERKS LGORT .
LOOP AT GT_MARDA.
READ TABLE GT_MARDH WITH KEY MATNR = GT_MARDA-MATNR
WERKS = GT_MARDA-WERKS
LGORT = GT_MARDA-LGORT
.
IF SY-SUBRC = 0.
GT_MARDA-LABST = GT_MARDH-LABST .
GT_MARDA-INSME = GT_MARDH-INSME .
ENDIF.
GT_DATA-QMKCS = GT_DATA-QMKCS + GT_MARDA-LABST + GT_MARDA-INSME .
MODIFY GT_MARDA .
CLEAR GT_MARDA .
ENDLOOP.
*----------------------------------------------------------------------------
*期初供应商库存(非限制库存LBLAB、质检库存LBINS)
CLEAR GT_MSLB[].
SELECT *
FROM MSLB
INTO CORRESPONDING FIELDS OF TABLE GT_MSLB[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSLBH[].
SELECT *
FROM MSLBH
INTO CORRESPONDING FIELDS OF TABLE GT_MSLBH[]
WHERE ( LFGJA > LV_YEARL OR ( LFGJA = LV_YEARL AND LFMON >= LV_POPEL ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSLBH[] BY MATNR WERKS CHARG SOBKZ LIFNR LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MSLBH[] COMPARING MATNR WERKS CHARG SOBKZ LIFNR.
LOOP AT GT_MSLB.
READ TABLE GT_MSLBH WITH KEY MATNR = GT_MSLB-MATNR
WERKS = GT_MSLB-WERKS
CHARG = GT_MSLB-CHARG
SOBKZ = GT_MSLB-SOBKZ
LIFNR = GT_MSLB-LIFNR
.
IF SY-SUBRC = 0.
GT_MSLB-LBLAB = GT_MSLBH-LBLAB .
GT_MSLB-LBINS = GT_MSLBH-LBINS .
ENDIF.
GT_DATA-QCKCS = GT_DATA-QCKCS + GT_MSLB-LBLAB + GT_MSLB-LBINS .
MODIFY GT_MSLB .
CLEAR GT_MSLB .
ENDLOOP.
*期末供应商库存(非限制库存LBLAB、质检库存LBINS)
CLEAR GT_MSLBA[].
SELECT *
FROM MSLB
INTO CORRESPONDING FIELDS OF TABLE GT_MSLBA[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSLBH[].
SELECT *
FROM MSLBH
INTO CORRESPONDING FIELDS OF TABLE GT_MSLBH[]
WHERE ( LFGJA > LV_YEARN OR ( LFGJA = LV_YEARN AND LFMON >= LV_POPEN ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSLBH[] BY MATNR WERKS CHARG SOBKZ LIFNR LFGJA LFMON.
DELETE ADJACENT DUPLICATES FROM GT_MSLBH[] COMPARING MATNR WERKS CHARG SOBKZ LIFNR.
LOOP AT GT_MSLBA.
READ TABLE GT_MSLBH WITH KEY MATNR = GT_MSLBA-MATNR
WERKS = GT_MSLBA-WERKS
CHARG = GT_MSLBA-CHARG
SOBKZ = GT_MSLBA-SOBKZ
LIFNR = GT_MSLBA-LIFNR
.
IF SY-SUBRC = 0.
GT_MSLBA-LBLAB = GT_MSLBH-LBLAB .
GT_MSLBA-LBINS = GT_MSLBH-LBINS .
ENDIF.
GT_DATA-QMKCS = GT_DATA-QMKCS + GT_MSLBA-LBLAB + GT_MSLBA-LBINS .
MODIFY GT_MSLBA .
CLEAR GT_MSLBA .
ENDLOOP.
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*期初客户寄售库存(非限制库存KULAB、质检库存KUINS)
CLEAR GT_MSKU[].
SELECT *
FROM MSKU
INTO CORRESPONDING FIELDS OF TABLE GT_MSKU[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSKUH[].
SELECT *
FROM MSKUH
INTO CORRESPONDING FIELDS OF TABLE GT_MSKUH[]
WHERE ( LFGJA > LV_YEARL OR ( LFGJA = LV_YEARL AND LFMON >= LV_POPEL ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSKUH[] BY MATNR WERKS CHARG SOBKZ KUNNR LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MSKUH[] COMPARING MATNR WERKS CHARG SOBKZ KUNNR .
LOOP AT GT_MSKU.
READ TABLE GT_MSKUH WITH KEY MATNR = GT_MSKU-MATNR
WERKS = GT_MSKU-WERKS
CHARG = GT_MSKU-CHARG
SOBKZ = GT_MSKU-SOBKZ
KUNNR = GT_MSKU-KUNNR
.
IF SY-SUBRC = 0.
GT_MSKU-KULAB = GT_MSKUH-KULAB .
GT_MSKU-KUINS = GT_MSKUH-KUINS .
ENDIF.
GT_DATA-QCKCS = GT_DATA-QCKCS + GT_MSKU-KULAB + GT_MSKU-KUINS .
MODIFY GT_MSKU .
CLEAR GT_MSKU .
ENDLOOP.
*期末供应商库存(非限制库存KULAB、质检库存KUINS)
CLEAR GT_MSKUA[].
SELECT *
FROM MSKU
INTO CORRESPONDING FIELDS OF TABLE GT_MSKUA[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSKUH[].
SELECT *
FROM MSKUH
INTO CORRESPONDING FIELDS OF TABLE GT_MSKUH[]
WHERE ( LFGJA > LV_YEARN OR ( LFGJA = LV_YEARN AND LFMON >= LV_POPEN ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSKUH[] BY MATNR WERKS CHARG SOBKZ KUNNR LFGJA LFMON.
DELETE ADJACENT DUPLICATES FROM GT_MSKUH[] COMPARING MATNR WERKS CHARG SOBKZ KUNNR .
LOOP AT GT_MSKUA.
READ TABLE GT_MSKUH WITH KEY MATNR = GT_MSKUA-MATNR
WERKS = GT_MSKUA-WERKS
CHARG = GT_MSKUA-CHARG
SOBKZ = GT_MSKUA-SOBKZ
KUNNR = GT_MSKUA-KUNNR
.
IF SY-SUBRC = 0.
GT_MSKUA-KULAB = GT_MSKUH-KULAB .
GT_MSKUA-KUINS = GT_MSKUH-KUINS .
ENDIF.
GT_DATA-QMKCS = GT_DATA-QMKCS + GT_MSKUA-KULAB + GT_MSKUA-KUINS .
MODIFY GT_MSKUA .
CLEAR GT_MSKUA .
ENDLOOP.
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*期初销售订单库存(非限制库存KALAB、质检库存KAINS)
CLEAR GT_MSKA[].
SELECT *
FROM MSKA
INTO CORRESPONDING FIELDS OF TABLE GT_MSKA[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSKAH[].
SELECT *
FROM MSKAH
INTO CORRESPONDING FIELDS OF TABLE GT_MSKAH[]
WHERE ( LFGJA > LV_YEARL OR ( LFGJA = LV_YEARL AND LFMON >= LV_POPEL ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSKAH[] BY MATNR WERKS LGORT CHARG SOBKZ VBELN POSNR LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MSKAH[] COMPARING MATNR WERKS LGORT CHARG SOBKZ VBELN POSNR .
LOOP AT GT_MSKA.
READ TABLE GT_MSKAH WITH KEY MATNR = GT_MSKA-MATNR
WERKS = GT_MSKA-WERKS
LGORT = GT_MSKA-LGORT
CHARG = GT_MSKA-CHARG
SOBKZ = GT_MSKA-SOBKZ
VBELN = GT_MSKA-VBELN
POSNR = GT_MSKA-POSNR
.
IF SY-SUBRC = 0.
GT_MSKA-KALAB = GT_MSKAH-KALAB .
GT_MSKA-KAINS = GT_MSKAH-KAINS .
ENDIF.
GT_DATA-QCKCS = GT_DATA-QCKCS + GT_MSKA-KALAB + GT_MSKA-KAINS .
MODIFY GT_MSKA .
CLEAR GT_MSKA .
ENDLOOP.
*期末销售订单库存(非限制库存KALAB、质检库存KAINS)
CLEAR GT_MSKAA[].
SELECT *
FROM MSKA
INTO CORRESPONDING FIELDS OF TABLE GT_MSKAA[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSKAH[].
SELECT *
FROM MSKAH
INTO CORRESPONDING FIELDS OF TABLE GT_MSKAH[]
WHERE ( LFGJA > LV_YEARN OR ( LFGJA = LV_YEARN AND LFMON >= LV_POPEN ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSKAH[] BY MATNR WERKS LGORT CHARG SOBKZ VBELN POSNR LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MSKAH[] COMPARING MATNR WERKS LGORT CHARG SOBKZ VBELN POSNR .
LOOP AT GT_MSKAA.
READ TABLE GT_MSKAH WITH KEY MATNR = GT_MSKAA-MATNR
WERKS = GT_MSKAA-WERKS
LGORT = GT_MSKAA-LGORT
CHARG = GT_MSKAA-CHARG
SOBKZ = GT_MSKAA-SOBKZ
VBELN = GT_MSKAA-VBELN
POSNR = GT_MSKAA-POSNR
.
IF SY-SUBRC = 0.
GT_MSKAA-KALAB = GT_MSKAH-KALAB .
GT_MSKAA-KAINS = GT_MSKAH-KAINS .
ENDIF.
GT_DATA-QMKCS = GT_DATA-QMKCS + GT_MSKAA-KALAB + GT_MSKAA-KAINS .
MODIFY GT_MSKAA .
CLEAR GT_MSKAA .
ENDLOOP.
*----------------------------------------------------------------------------
*----------------------------------------------------------------------------
*期初外发供应商销售订单库存(非限制库存FDLAB、质检库存FDINS)
CLEAR GT_MSFD[].
SELECT *
FROM MSFD
INTO CORRESPONDING FIELDS OF TABLE GT_MSFD[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSFDH[].
SELECT *
FROM MSFDH
INTO CORRESPONDING FIELDS OF TABLE GT_MSFDH[]
WHERE ( LFGJA > LV_YEARL OR ( LFGJA = LV_YEARL AND LFMON >= LV_POPEL ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSFDH[] BY MATNR WERKS CHARG SOBKZ LIFNR VBELN POSNR LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MSFDH[] COMPARING MATNR WERKS CHARG SOBKZ LIFNR VBELN POSNR .
LOOP AT GT_MSFD.
READ TABLE GT_MSFDH WITH KEY MATNR = GT_MSFD-MATNR
WERKS = GT_MSFD-WERKS
CHARG = GT_MSFD-CHARG
SOBKZ = GT_MSFD-SOBKZ
LIFNR = GT_MSFD-LIFNR
VBELN = GT_MSFD-VBELN
POSNR = GT_MSFD-POSNR
.
IF SY-SUBRC = 0.
GT_MSFD-FDLAB = GT_MSFDH-FDLAB .
GT_MSFD-FDINS = GT_MSFDH-FDINS .
ENDIF.
GT_DATA-QCKCS = GT_DATA-QCKCS + GT_MSFD-FDLAB + GT_MSFD-FDINS .
MODIFY GT_MSFD .
CLEAR GT_MSFD .
ENDLOOP.
*期末外发供应商销售订单库存(非限制库存FDLAB、质检库存FDINS)
CLEAR GT_MSFDA[].
SELECT *
FROM MSFD
INTO CORRESPONDING FIELDS OF TABLE GT_MSFDA[]
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
CLEAR GT_MSFDH[].
SELECT *
FROM MSFDH
INTO CORRESPONDING FIELDS OF TABLE GT_MSFDH[]
WHERE ( LFGJA > LV_YEARN OR ( LFGJA = LV_YEARN AND LFMON >= LV_POPEN ) )
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_MSFDH[] BY MATNR WERKS CHARG SOBKZ LIFNR VBELN POSNR LFGJA LFMON .
DELETE ADJACENT DUPLICATES FROM GT_MSFDH[] COMPARING MATNR WERKS CHARG SOBKZ LIFNR VBELN POSNR .
LOOP AT GT_MSFDA.
READ TABLE GT_MSFDH WITH KEY MATNR = GT_MSFDA-MATNR
WERKS = GT_MSFDA-WERKS
CHARG = GT_MSFDA-CHARG
SOBKZ = GT_MSFDA-SOBKZ
LIFNR = GT_MSFDA-LIFNR
VBELN = GT_MSFDA-VBELN
POSNR = GT_MSFDA-POSNR
.
IF SY-SUBRC = 0.
GT_MSFDA-FDLAB = GT_MSFDH-FDLAB .
GT_MSFDA-FDINS = GT_MSFDH-FDINS .
ENDIF.
GT_DATA-QMKCS = GT_DATA-QMKCS + GT_MSFDA-FDLAB + GT_MSFDA-FDINS .
MODIFY GT_MSFDA .
CLEAR GT_MSFDA .
ENDLOOP.
*----------------------------------------------------------------------------
*期初库存金额
GT_DATA-QCKCJ = GT_DATA-QCKCS * GT_DATA-QCWJG .
*期初库存金额
GT_DATA-QMKCJ = GT_DATA-QMKCS * GT_DATA-QMWJG .
*库存周转率计算
* 如果物料类型为 MARA-MTART =Z004 OR MARC-SOBSL='99',出库数量/(期初数量+期末数量)/2,
* 出库数量为出库类型=OUT 且参与库存周转率计算移动类型的出口库存汇总
IF GT_DATA-MTART = 'Z004' OR GT_DATA-SOBSL = '99'.
IF GT_DATA-QCKCS + GT_DATA-QMKCS <> 0.
GT_DATA-KCZZL = GT_DATA-QJCKSZ / ( ( GT_DATA-QCKCS + GT_DATA-QMKCS ) / 2 ) .
ENDIF.
ELSE.
* 否则出库金额/(期初+期末金额)/2 ,出库数量为出库类型=OUT类型 且 参与库存周转率计算的库存金额汇总
IF GT_DATA-QCKCJ + GT_DATA-QMKCJ <> 0.
GT_DATA-KCZZL = GT_DATA-QJCKJZ / ( ( GT_DATA-QCKCJ + GT_DATA-QMKCJ ) / 2 ) .
ENDIF.
ENDIF.
*库存周转天数计算
IF GT_DATA-KCZZL <> 0.
GT_DATA-KCZTS = LV_DYTS / GT_DATA-KCZZL.
ENDIF.
MODIFY GT_DATA.
CLEAR GT_DATA.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
CLEAR S_LAYOUT.
S_LAYOUT-ZEBRA = 'X'.
S_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
* s_layout-box_fieldname = 'BOX'.
PERFORM FRM_FILL_FIELD .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
IS_LAYOUT = S_LAYOUT
IT_FIELDCAT = GT_FIELDCAT
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_CALLBACK_HTML_TOP_OF_PAGE = 'F_HTML_TOP_OF_PAGE'
I_HTML_HEIGHT_TOP = 8 "指定ALV表头宽度
TABLES
T_OUTTAB = GT_DATA[].
ENDFORM.
FORM FRM_FILL_FIELD .
DATA: WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DEFINE FILL_FIELD.
wa_fieldcat-fieldname = &1.
wa_fieldcat-seltext_l = &2.
* IF wa_fieldcat-fieldname = 'MSLJH' or wa_fieldcat-fieldname = 'WCBJH'.
* wa_fieldcat-EMPHASIZE = 'C600'. "设置字段的颜色
* ENDIF.
*
* IF wa_fieldcat-fieldname = 'MSLMB' or wa_fieldcat-fieldname = 'WCBMB'.
* wa_fieldcat-EMPHASIZE = 'C710'. "设置字段的颜色
* ENDIF.
IF wa_fieldcat-fieldname = 'PLNBEZ' OR wa_fieldcat-fieldname = 'MATNR' .
wa_fieldcat-ref_tabname = 'MARA'.
wa_fieldcat-ref_fieldname = 'MATNR'.
ENDIF.
IF wa_fieldcat-fieldname = 'ARKTX' OR wa_fieldcat-fieldname = 'WAKTX' .
wa_fieldcat-ref_tabname = 'VBAP'.
wa_fieldcat-ref_fieldname = 'ARKTX'.
ENDIF.
IF wa_fieldcat-fieldname = 'AUFNR' .
wa_fieldcat-ref_tabname = 'AUFK'.
wa_fieldcat-ref_fieldname = 'AUFNR'.
ENDIF.
APPEND wa_fieldcat TO gt_fieldcat.
CLEAR wa_fieldcat.
END-OF-DEFINITION.
IF SY-TCODE = 'ZMMR034'."不显示金额
FILL_FIELD :
'MATNR' '物料编码',
'MAKTX' '物料描述',
'WERKS' '工厂',
'BDATJ' '年度',
'POPER' '月份',
'DISPO' 'MRP控制员',
'DSNAM' 'MRP控制员描述',
'MTART' '物料类型',
'MTBEZ' '物料类型描述',
'MATKL' '物料组',
'WGBEZ' '物料组描述',
'EXTWG' '系列',
'MEINSJ' '基本单位',
'QCKCS' '期初库存数量',
* 'QCKCJ' '期初库存金额',
'QJCKS' '期间出库数量',
* 'QJCKJ' '期间出库金额',
'QJRKS' '期间入库数量',
* 'QJRKJ' '期间入库金额',
'QMKCS' '期末库存数量',
* 'QMKCJ' '期末库存金额',
'KCZZL' '库存周转率',
'KCZTS' '周转天数'.
ELSE .
FILL_FIELD :
'MATNR' '物料编码',
'MAKTX' '物料描述',
'WERKS' '工厂',
'BDATJ' '年度',
'POPER' '月份',
'DISPO' 'MRP控制员',
'DSNAM' 'MRP控制员描述',
'MTART' '物料类型',
'MTBEZ' '物料类型描述',
'MATKL' '物料组',
'WGBEZ' '物料组描述',
'EXTWG' '系列',
'MEINSJ' '基本单位',
'QCKCS' '期初库存数量',
'QCKCJ' '期初库存金额',
'QJCKS' '期间出库数量',
'QJCKJ' '期间出库金额',
'QJRKS' '期间入库数量',
'QJRKJ' '期间入库金额',
'QMKCS' '期末库存数量',
'QMKCJ' '期末库存金额',
'KCZZL' '库存周转率',
'KCZTS' '周转天数'.
ENDIF.
ENDFORM.
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
IS_SELFIELD TYPE SLIS_SELFIELD.
DATA: REF TYPE REF TO CL_GUI_ALV_GRID.
DATA : LV_STABLE TYPE LVC_S_STBL. "刷新稳定性
RANGES: L_WERKS FOR T001W-WERKS.
RANGES: L_MATNR FOR MARA-MATNR.
DATA:L_BUKRS TYPE T001K-BUKRS.
LV_STABLE-ROW = '1'.
LV_STABLE-COL = '1'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF.
CALL METHOD REF->CHECK_CHANGED_DATA.
CASE I_UCOMM.
WHEN '&IC1'."表示双击
WHEN 'POST_T'.
ENDCASE.
CALL METHOD REF->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
ENDFORM.
FORM F_HTML_TOP_OF_PAGE USING PR_DOCUMENT TYPE REF TO CL_DD_DOCUMENT.
CALL METHOD PR_DOCUMENT->ADD_TEXT(
TEXT = '库存周转率报表'
* SAP_FONTSIZE = '1'
SAP_EMPHASIS = CL_DD_DOCUMENT=>HEADING ).
CALL METHOD PR_DOCUMENT->NEW_LINE( ).
CALL METHOD PR_DOCUMENT->ADD_TEXT(
TEXT = '查询时间:' && SY-DATUM(4) && '年' && SY-DATUM+4(2) && '月' && SY-DATUM+6(2) && '日'
SAP_EMPHASIS = CL_DD_DOCUMENT=>HEADING ).
CALL METHOD PR_DOCUMENT->NEW_LINE( ).
CALL METHOD PR_DOCUMENT->ADD_TEXT(
TEXT = '查询期间:' && P_BDATJ && '年' && P_POPER && '月'
SAP_EMPHASIS = CL_DD_DOCUMENT=>HEADING ).
* CALL METHOD PR_DOCUMENT->ADD_GAP( WIDTH = 2 ).
ENDFORM. "f_html_top_of_page
INITIALIZATION .
PERFORM FRM_EXCLUDE_OPTION.
AT SELECTION-SCREEN OUTPUT.
PERFORM SCREEN_OUTPUT.
AT SELECTION-SCREEN.
PERFORM SCREEN_SETTING.
START-OF-SELECTION.
PERFORM FOM_GETDATA .
PERFORM FRM_DISPLAY.