*&---------------------------------------------------------------------*
*& Report ZSDR040 tcode-ZSDR040
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZSDR040C.
TABLES:SSCRFIELDS,KNMT,CAWNT,ZTSD_ZSDR043.
TYPE-POOLS:SLIS.
"定义ALV输出所需变量
DATA: S_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA GT_EXDATA TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
DATA IW_CELLCOLOR TYPE LVC_T_SCOL WITH HEADER LINE.
DATA L_FILENAME TYPE STRING .
DATA L_MUBAN TYPE STRING .
DATA GV_FULLPATH TYPE STRING .
DATA GV_PATH TYPE STRING .
DATA GV_NAME TYPE STRING .
DATA:MESSAGE TYPE BAPI_MSG .
DATA:SUBRC LIKE SYST-SUBRC .
DATA:FLAG TYPE C .
DATA:MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA GT_AUSP TYPE TABLE OF AUSP WITH HEADER LINE .
DATA LV_OBJEK TYPE AUSP-OBJEK .
DATA GT_CAWNT TYPE TABLE OF CAWNT WITH HEADER LINE .
DATA GT_CAWN TYPE TABLE OF CAWN WITH HEADER LINE .
TYPES: BEGIN OF GTS_DATA,
DATUM_SQ TYPE DATUM , "申请日期
ZENNR TYPE CHAR20 , "版本号
PERXX TYPE PERXX , "查询期间
KUNNR TYPE KUNNR , "客户编号
KUNNR1 TYPE KUNNR , "客户编号
NAME TYPE CHAR80 , "客户名称
WERKS TYPE WERKS_D, "销售工厂
MATNR TYPE MATNR , "物料编码
MAKTX TYPE MAKTX , "物料描述
MEINS TYPE MEINS , "计量单位
ZQUAN1 TYPE ZQUAN0 , "市场提供当月预测(已批准)A
ZQUAN1C TYPE ZQUAN5 , "当月已出货数量
ZQUAN2 TYPE ZQUAN0 , "前3月客户月均实际提货数(参考)
ZQUAN3 TYPE ZQUAN0 , "客户系统预测(4周)B
ZQUAN4 TYPE ZQUAN0 , "厂外库存 C
ZQUAN5 TYPE ZQUAN0 , "当月已下单未出货数量 E
ZQUAN6 TYPE ZQUAN0 , "客户T-3需求 F
ZQUAN7 TYPE ZQUAN0 , "厂外安全库存需求(3周)G=A/3
ZQUAN8 TYPE ZQUAN0 , "扣除需求后剩余净库存数量H=C+E-F-G
ZQUAN9 TYPE ZQUAN0 , "理论下单数J
ZQUAN10 TYPE ZQUAN0 , "库存(不含安全库存)+当月备货总数L=C+E+J-F
ZQUAN11 TYPE ZQUAN1 , "库存+当月货物总数占当月预测比率(%) L/A
ZCACHE TYPE ZQUAN5 , "缓存
TEXT1 TYPE CHAR10 , "市场建议下单数量
TEXT2 TYPE CHAR10 , "CS建议下单数量
TEXT3 TYPE CHAR10 , "结论建议
CELLCOLOR TYPE LVC_T_SCOL, "单元格颜色
* INCLUDE TYPE ZTSD_ZSDR043.
END OF GTS_DATA.
DATA: LV_MODE TYPE C.
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_ZSDR043 TYPE TABLE OF ZTSD_ZSDR043 WITH HEADER LINE.
TYPES: BEGIN OF GTS_VBDT,
KUNNR TYPE VBAK-KUNNR,
MATNR TYPE VBAP-MATNR,
VBELN TYPE VBAP-VBELN,
POSNR TYPE VBAP-POSNR,
ABGRU TYPE VBAP-ABGRU,
PSTYV TYPE VBAP-PSTYV,
EDATU TYPE VBEP-EDATU,
WMENG TYPE VBEP-WMENG,
VRKME TYPE VBEP-VRKME,
DLVQTY_SU TYPE VBEP-DLVQTY_SU,
END OF GTS_VBDT.
TYPES: BEGIN OF GTS_VBFA,
VBELN TYPE VBFA-VBELN,
POSNN TYPE VBFA-POSNN,
ZEILE TYPE MATDOC-ZEILE,
END OF GTS_VBFA.
SELECTION-SCREEN: FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS P_RD1 RADIOBUTTON GROUP GP1 DEFAULT 'X' USER-COMMAND MXX."用来显示 p_AUFNR
PARAMETERS P_RD2 RADIOBUTTON GROUP GP1 ."用来隐藏 p_AUFNR
*-----------------------------------------------------------------------------
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME MODIF ID C1. "请选择文件
PARAMETERS: P_PERX1 LIKE ZTSD_ZSDR043-PERXX MODIF ID C1 DEFAULT SY-DATUM(6). "查询期间
PARAMETERS: P_ZENN1 LIKE ZTSD_ZSDR043-ZENNR MODIF ID C1. "版本号
*-----------------------------------------------------------------------------
SELECT-OPTIONS: S_ZENN2 FOR ZTSD_ZSDR043-ZENNR MODIF ID C2. "版本号
SELECT-OPTIONS: S_KUNNR FOR ZTSD_ZSDR043-KUNNR MODIF ID C2. "客户编号
SELECT-OPTIONS: S_MATNR FOR ZTSD_ZSDR043-MATNR MODIF ID C2. "物料编号
SELECT-OPTIONS: S_PERX2 FOR ZTSD_ZSDR043-PERXX MODIF ID C2. "查询期间
SELECTION-SCREEN END OF BLOCK B1.
IF P_RD1 IS NOT INITIAL.
IF P_FILE IS INITIAL .
MESSAGE '没有选择文件!' TYPE 'E'.
ELSEIF P_PERX1 IS INITIAL .
MESSAGE '查询期间为空!' TYPE 'E'.
ELSEIF P_ZENN1 IS INITIAL .
MESSAGE '版本号为空!' TYPE 'E'.
ENDIF.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF GT_ZSDR043 FROM ZTSD_ZSDR043
WHERE ZENNR = P_ZENN1
.
IF SY-SUBRC = 0.
MESSAGE '版本号已存在!' TYPE 'E'.
ELSE.
CLEAR GT_ZSDR043.
ENDIF.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
IF P_RD1 IS NOT INITIAL.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',Excel Files,*.xls,All Files,*.*.'(101)
TITLE = '选择文件'(100)
IMPORTING
FILENAME = P_FILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0 AND SY-SUBRC <> 3.
MESSAGE '选择文件出错!' TYPE 'E'.
ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*& Form SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_OUTPUT .
LOOP AT SCREEN .
IF P_RD1 = 'X' .
IF SCREEN-GROUP1 = 'C1'.
SCREEN-ACTIVE = '1'.
IF SCREEN-NAME = 'P_FILE' OR SCREEN-NAME = 'P_PERX1' OR SCREEN-NAME = 'P_ZENN1'
.
SCREEN-REQUIRED = '2'.
ENDIF.
MODIFY SCREEN.
ELSEIF SCREEN-GROUP1 = 'C2' OR SCREEN-GROUP1 = 'C3'.
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.
ENDIF.
ELSEIF P_RD2 = 'X' .
IF SCREEN-GROUP1 = 'C2' OR SCREEN-GROUP1 = 'C3'.
SCREEN-ACTIVE = '1'.
MODIFY SCREEN.
ELSEIF SCREEN-GROUP1 = 'C1' .
SCREEN-ACTIVE = '0'.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM FOM_UPDATA .
DATA LV_KNA1 TYPE KNA1.
DATA LV_MARA TYPE MARA.
DATA LV_DATUM1 TYPE DATUM.
DATA LV_DATUM2 TYPE DATUM.
DATA LV_DATUM3 TYPE DATUM.
DATA LV_DATUM4 TYPE DATUM.
DATA I_MENGE TYPE EKPO-MENGE .
DATA I_MENGE1 TYPE EKPO-MENGE .
DATA GT_ZTPIRIMPLOG TYPE TABLE OF ZTPIRIMPLOG WITH HEADER LINE.
DATA GT_MATDOC TYPE TABLE OF MATDOC WITH HEADER LINE.
DATA GT_MSKU TYPE TABLE OF MSKU WITH HEADER LINE.
DATA GT_VBDT TYPE TABLE OF GTS_VBDT WITH HEADER LINE.
DATA GT_VBFA TYPE TABLE OF GTS_VBFA WITH HEADER LINE.
TYPES BEGIN OF GTS_MATDOC.
INCLUDE TYPE MATDOC.
TYPES AUART LIKE ZTWEEKA-AUART.
TYPES END OF GTS_MATDOC.
DATA: GT_MATDOC_H TYPE TABLE OF GTS_MATDOC WITH HEADER LINE.
LV_DATUM1(6) = P_PERX1 - 3 .
LV_DATUM1 = LV_DATUM1(6) && '01'.
LV_DATUM2 = P_PERX1 && '01'.
LV_DATUM2 = LV_DATUM2 - 1 .
LV_DATUM3 = P_PERX1 && '01'.
LV_DATUM4 = P_PERX1 && '26'.
LV_DATUM4 = LV_DATUM4 + 8 .
LV_DATUM4 = LV_DATUM4(6) && '01'.
LV_DATUM4 = LV_DATUM4 - 1 .
CLEAR GT_EXDATA[].
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' "读取excel文件中的内容
EXPORTING
FILENAME = P_FILE
I_BEGIN_COL = '1'
I_BEGIN_ROW = '3'
I_END_COL = '10'
I_END_ROW = '5000'
TABLES
INTERN = GT_EXDATA[].
SORT GT_EXDATA BY ROW COL VALUE.
**---整理到内表数据
CLEAR GT_DATA[] .
LOOP AT GT_EXDATA.
CLEAR FLAG .
AT END OF ROW .
FLAG = 'X'.
ENDAT .
CASE GT_EXDATA-COL.
WHEN 1.
GT_DATA-KUNNR = GT_EXDATA-VALUE.
WHEN 2.
GT_DATA-WERKS = GT_EXDATA-VALUE.
WHEN 3.
GT_DATA-MATNR = GT_EXDATA-VALUE.
WHEN 4.
GT_DATA-ZQUAN3 = GT_EXDATA-VALUE.
WHEN 5.
GT_DATA-ZQUAN6 = GT_EXDATA-VALUE.
WHEN 6.
GT_DATA-MEINS = GT_EXDATA-VALUE.
ENDCASE.
IF FLAG IS NOT INITIAL.
APPEND GT_DATA."append要加在最后一列.
CLEAR GT_DATA.
ENDIF.
ENDLOOP.
CLEAR GT_ZSDR043[].
LOOP AT GT_DATA.
GT_DATA-DATUM_SQ = SY-DATUM .
GT_DATA-ZENNR = P_ZENN1 .
GT_DATA-PERXX = P_PERX1 .
GT_DATA-KUNNR1 = '%' && GT_DATA-KUNNR && '%' .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GT_DATA-KUNNR
IMPORTING
OUTPUT = GT_DATA-KUNNR.
CLEAR LV_KNA1.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LV_KNA1 FROM KNA1
WHERE KUNNR = GT_DATA-KUNNR
.
GT_DATA-NAME = LV_KNA1-NAME1 && LV_KNA1-NAME2 .
SELECT SINGLE MAKTX INTO GT_DATA-MAKTX FROM MAKT
WHERE MATNR = GT_DATA-MATNR
AND SPRAS = SY-LANGU
.
*1.根据客户 KUNNR +期间 PERXX +物料号 MATNR +工厂 WERKS 到表
* ZTPIRIMPLOG找出按创建日期ERSDA倒序第一条数据的PLNMG计划数量、MEINS基本单位
*2.根据客户到表KNA1取出KATR1属性1
CLEAR GT_ZTPIRIMPLOG[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_ZTPIRIMPLOG FROM ZTPIRIMPLOG
WHERE KUNNR = GT_DATA-KUNNR
AND PERXX = GT_DATA-PERXX
AND MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
.
SORT GT_ZTPIRIMPLOG[] BY ERSDA DESCENDING .
CLEAR GT_ZTPIRIMPLOG.
READ TABLE GT_ZTPIRIMPLOG INDEX 1 .
*3.按以下逻辑取出当月已出货数:
*a.根据物料编码+销售工厂+客户编号 到表 MATDOC 取出在过账日期查询期间中、库存地点 LGORT 不为空、交货单 LE_VBELN 不为空,
* 客户KUNNR不为空的 基本单位数量 MENGE 、交货单号 LE_VBELN , 交货单项目 VBELP_IM ,借贷项 SHKZG ,如果为S,则数量*-1;
*b.根据第一步的交货单号+项目号到表 LIPS 取出项目类别 PSTYV,如等于 KEN 或 REN 或 KAN 或为空,则此行数据行删除;
*c.根据交货单号+项目找到SO类型VBAK-AUART,如为 ZKB ,则删除此行数据
*d.汇总基本单位数量 即为 当月已出货数量。
CLEAR GT_MATDOC[].
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_MATDOC
FROM MATDOC
INNER JOIN LIPS ON MATDOC~LE_VBELN = LIPS~VBELN AND MATDOC~VBELP_IM = LIPS~POSNR
INNER JOIN VBAP ON LIPS~VGBEL = VBAP~VBELN AND LIPS~VGPOS = VBAP~POSNR
INNER JOIN VBAK ON VBAP~VBELN = VBAK~VBELN
WHERE MATDOC~MATNR = GT_DATA-MATNR
AND MATDOC~WERKS = GT_DATA-WERKS
AND MATDOC~KUNNR = GT_DATA-KUNNR
AND MATDOC~LGORT <> ''
AND MATDOC~LE_VBELN <> ''
AND MATDOC~KUNNR <> ''
AND MATDOC~BUDAT >= LV_DATUM3
AND MATDOC~BUDAT <= LV_DATUM4
AND VBAP~PSTYV NOT IN ( 'KEN' , 'REN' , 'KAN' , '' )
AND VBAK~AUART <> 'ZKB'
.
CLEAR GT_DATA-ZCACHE.
LOOP AT GT_MATDOC.
IF GT_MATDOC-SHKZG = 'S'.
GT_MATDOC-MENGE = GT_MATDOC-MENGE * -1 .
ENDIF.
GT_DATA-ZCACHE = GT_DATA-ZCACHE + GT_MATDOC-MENGE.
CLEAR GT_MATDOC .
ENDLOOP.
GT_DATA-ZQUAN1C = GT_DATA-ZCACHE. "当月已出货数量(基本单位)
*4.如果客户KATR1属性1为D,将第一步的PLNMG计划数量使用单位转换函数计算出按计量单位的数量即为市场提供当月预测(已批准)A;
* 如果客户KATR1属性1不为D,将第一步的PLNMG计划数量+当月已出货数量
* 再使用单位转换函数计算出按计量单位的数量即为市场提供当月预测(已批准)A;
CLEAR LV_MARA.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LV_MARA FROM MARA
WHERE MATNR = GT_DATA-MATNR
.
I_MENGE = 1.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = GT_DATA-MATNR
I_IN_ME = LV_MARA-MEINS
I_OUT_ME = GT_DATA-MEINS
I_MENGE = I_MENGE
IMPORTING
E_MENGE = I_MENGE
EXCEPTIONS
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.
IF LV_KNA1-KATR1 = 'D'.
GT_DATA-ZCACHE = GT_ZTPIRIMPLOG-PLNMG .
ELSE.
GT_DATA-ZCACHE = GT_ZTPIRIMPLOG-PLNMG + GT_DATA-ZQUAN1C.
ENDIF.
IF I_MENGE <> 0.
GT_DATA-ZQUAN1 = GT_DATA-ZCACHE * I_MENGE .
ENDIF.
*1.根据物料编码+销售工厂到表MATDOC取出过账日期在查询期间-3至查询期间首日-1期间内库存地点LGORT不为空、
* 交货单LE_VBELN不为空,客户KUNNR like客户编号的 基本单位数量MENGE、交货单号LE_VBELN,
* 交货单项目VBELP_IM,借贷项SHKZG,如果为S,则数量*-1;
*2.根据第一步的交货单号+项目号到表LIPS取出项目类别 PSTYV,如不等于KEN,则此行数据行删除;
*3.汇总基本单位数量除以3,再使用单位转换函数计算出按计量单位的数量即为前3月客户月均实际提货数(参考)"
CLEAR GT_MATDOC[].
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_MATDOC
FROM MATDOC
INNER JOIN LIPS ON MATDOC~LE_VBELN = LIPS~VBELN AND MATDOC~VBELP_IM = LIPS~POSNR
INNER JOIN VBAP ON LIPS~VGBEL = VBAP~VBELN AND LIPS~VGPOS = VBAP~POSNR
WHERE MATDOC~MATNR = GT_DATA-MATNR
AND MATDOC~WERKS = GT_DATA-WERKS
AND MATDOC~KUNNR LIKE GT_DATA-KUNNR1
AND MATDOC~BUDAT >= LV_DATUM1
AND MATDOC~BUDAT <= LV_DATUM2
* AND MATDOC~LGORT <> ''
AND MATDOC~LE_VBELN <> ''
AND VBAP~PSTYV = 'KEN'
* AND MATDOC~KUNNR <> ''
.
CLEAR GT_DATA-ZCACHE.
LOOP AT GT_MATDOC.
IF GT_MATDOC-SHKZG = 'S'.
GT_MATDOC-MENGE = GT_MATDOC-MENGE * -1 .
ENDIF.
GT_DATA-ZCACHE = GT_DATA-ZCACHE + GT_MATDOC-MENGE.
CLEAR GT_MATDOC .
ENDLOOP.
GT_DATA-ZCACHE = GT_DATA-ZCACHE / 3 .
IF I_MENGE <> 0.
GT_DATA-ZQUAN2 = GT_DATA-ZCACHE * I_MENGE .
ENDIF.
*根据物料编码+销售工厂 到表 MSKU 取出客户KUNNR like 客户编号,特殊库存标识 SOBKZ =W的
*非限制使用库存 KULAB 进行汇总后,再使用单位转换函数计算出按计量单位的数量即为厂外库存C"
CLEAR GT_MSKU[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_MSKU[] FROM MSKU
WHERE MATNR = GT_DATA-MATNR
AND WERKS = GT_DATA-WERKS
AND KUNNR LIKE GT_DATA-KUNNR1
AND SOBKZ = 'W'
.
CLEAR GT_DATA-ZCACHE.
LOOP AT GT_MSKU.
GT_DATA-ZCACHE = GT_DATA-ZCACHE + GT_MSKU-KULAB.
CLEAR GT_MSKU .
ENDLOOP.
IF I_MENGE <> 0.
GT_DATA-ZQUAN4 = GT_DATA-ZCACHE * I_MENGE .
ENDIF.
*1.计算当月已下单数计算逻辑参考 ZSDR037 程序1374行开始的计算逻辑,
* 只使用客户不为空的逻辑段即可,区别为用客户编码*做客户限制。
*2.将第1步使用单位转换幻术计算出基本单位计量的数量
*3.将第二步数量-43行第3步d步骤计算出的当月已出货数量 即为当月已下单未出货数量 E
CLEAR GT_VBDT[].
SELECT
VBAK~KUNNR
VBAP~MATNR
VBAP~VBELN
VBAP~POSNR
VBAP~ABGRU
VBAP~PSTYV
VBEP~EDATU
VBEP~WMENG
VBEP~VRKME
INTO CORRESPONDING FIELDS OF TABLE GT_VBDT[]
FROM VBAK
INNER JOIN VBAP ON VBAK~VBELN = VBAP~VBELN
INNER JOIN VBEP ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR
WHERE VBAK~KUNNR LIKE GT_DATA-KUNNR1
AND VBAP~MATNR = GT_DATA-MATNR
AND VBAP~ABGRU = ''
AND VBAP~PSTYV NOT IN ( 'KEN' , 'REN' , 'KAN' )
AND VBEP~EDATU >= LV_DATUM3
AND VBEP~EDATU <= LV_DATUM4
.
CLEAR GT_DATA-ZCACHE.
LOOP AT GT_VBDT.
GT_DATA-ZCACHE = GT_DATA-ZCACHE + GT_VBDT-WMENG .
CLEAR GT_VBDT .
ENDLOOP.
READ TABLE GT_VBDT INDEX 1 .
I_MENGE1 = 1.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = GT_DATA-MATNR
I_IN_ME = GT_VBDT-VRKME
I_OUT_ME = LV_MARA-MEINS
I_MENGE = I_MENGE1
IMPORTING
E_MENGE = I_MENGE1
EXCEPTIONS
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.
IF I_MENGE1 <> 0.
GT_DATA-ZCACHE = GT_DATA-ZCACHE * I_MENGE1 .
ENDIF.
GT_DATA-ZQUAN5 = GT_DATA-ZCACHE - GT_DATA-ZQUAN1C .
*减去历史月份出货数-------------------------------------------------------
IF GT_VBDT[] IS NOT INITIAL.
CLEAR GT_VBFA[] .
SELECT
VBFA~VBELN
VBFA~POSNN
VBFA~POSNN AS ZEILE
INTO CORRESPONDING FIELDS OF TABLE GT_VBFA[]
FROM VBFA
FOR ALL ENTRIES IN GT_VBDT[]
WHERE VBFA~VBELV = GT_VBDT-VBELN
AND VBFA~POSNV = GT_VBDT-POSNR
AND ( VBFA~VBTYP_N = 'R' OR VBFA~VBTYP_N = 'h')
AND VBFA~RFMNG <> 0
.
IF GT_VBFA[] IS NOT INITIAL.
CLEAR GT_MATDOC_H[] .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE GT_MATDOC_H[]
FROM MATDOC
FOR ALL ENTRIES IN GT_VBFA[]
WHERE MATDOC~MBLNR = GT_VBFA-VBELN
AND MATDOC~ZEILE = GT_VBFA-ZEILE
AND MATDOC~BUDAT < LV_DATUM3
AND MATDOC~XAUTO = ''
.
LOOP AT GT_MATDOC_H.
IF GT_MATDOC_H-SHKZG = 'S'.
GT_MATDOC_H-MENGE = GT_MATDOC_H-MENGE * -1 .
ENDIF.
GT_DATA-ZQUAN5 = GT_DATA-ZQUAN5 - GT_MATDOC_H-MENGE .
CLEAR GT_MATDOC_H .
ENDLOOP.
ENDIF.
ENDIF.
*减去历史月份出货数-------------------------------------------------------
GT_DATA-ZQUAN7 = GT_DATA-ZQUAN1 / 4 * 3 .
*扣除需求后剩余净库存数量H=C+E-F-G = 厂外库存 C+当月已下单未出货数量 E-客户T-3需求 F- 厂外安全库存需求(3周)G=A/3
GT_DATA-ZQUAN8 = GT_DATA-ZQUAN4 + GT_DATA-ZQUAN5 - GT_DATA-ZQUAN6 - GT_DATA-ZQUAN7 .
*理论下单数J:
*如果扣除需求后剩余净库存数量>=0,则为0
*如果扣除需求后剩余净库存数量<0 且 厂外库存C<厂外安全库存需求(3周)G=A/3,则为
*厂外安全库存需求(3周)G=A/3 - 厂外库存C + 客户系统预测(4周)B
*如果扣除需求后剩余净库存数量<0 且 厂外库存C>=厂外安全库存需求(3周)G=A/3,则为
*客户系统预测(4周)B/4
IF GT_DATA-ZQUAN8 >= 0.
GT_DATA-ZQUAN9 = 0 .
ELSEIF GT_DATA-ZQUAN8 < 0 AND GT_DATA-ZQUAN4 < GT_DATA-ZQUAN7 .
GT_DATA-ZQUAN9 = GT_DATA-ZQUAN7 - GT_DATA-ZQUAN4 + GT_DATA-ZQUAN3.
ELSEIF GT_DATA-ZQUAN8 < 0 AND GT_DATA-ZQUAN4 >= GT_DATA-ZQUAN7 .
GT_DATA-ZQUAN9 = GT_DATA-ZQUAN3.
ENDIF.
*库存(不含安全库存)+当月备货总数 = 厂外库存C+当月已下单未出货数量E+理论下单数J-客户T-3需求 F
GT_DATA-ZQUAN10 = GT_DATA-ZQUAN4 + GT_DATA-ZQUAN5 + GT_DATA-ZQUAN9 - GT_DATA-ZQUAN6 .
*库存+当月货物总数占当月预测比率(%) L/A = (库存(不含安全库存)+当月备货总数)/市场提供当月预测(已批准)A
IF GT_DATA-ZQUAN1 <> 0.
GT_DATA-ZQUAN11 = GT_DATA-ZQUAN10 / GT_DATA-ZQUAN1 .
ENDIF.
MOVE-CORRESPONDING GT_DATA TO GT_ZSDR043 .
APPEND GT_ZSDR043.
CLEAR GT_ZSDR043.
MODIFY GT_DATA.
CLEAR GT_DATA.
ENDLOOP.
MODIFY ZTSD_ZSDR043 FROM TABLE GT_ZSDR043[].
COMMIT WORK .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
CLEAR GT_DATA[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_DATA[] FROM ZTSD_ZSDR043
WHERE ZENNR IN S_ZENN2
AND KUNNR IN S_KUNNR
AND MATNR IN S_MATNR
AND PERXX IN S_PERX2
.
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-COLTAB_FIELDNAME = 'CELLCOLOR'. "单元格颜色内表字段
* 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_SAVE = 'A'
* I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
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 = 'KUNNR' .
wa_fieldcat-ref_tabname = 'KNA1'.
wa_fieldcat-ref_fieldname = 'KUNNR'.
ENDIF.
APPEND wa_fieldcat TO gt_fieldcat.
CLEAR wa_fieldcat.
END-OF-DEFINITION.
FILL_FIELD :
'DATUM_SQ' '申请日期',
'ZENNR' '版本号',
'PERXX' '查询期间',
'KUNNR' '客户编号',
'NAME' '客户名称',
'WERKS' '销售工厂',
'MATNR' '物料编码',
'MAKTX' '物料描述',
'MEINS' '计量单位',
'ZQUAN1' '市场提供当月预测(已批准)A',
'ZQUAN2' '前3月客户月均实际提货数(参考)',
'ZQUAN3' '客户系统预测(4周)B',
'ZQUAN4' '厂外库存 C',
'ZQUAN5' '当月已下单未出货数量 E',
'ZQUAN6' '客户T-3需求 F',
'ZQUAN7' '厂外安全库存需求(3周)G=A/3',
'ZQUAN8' '扣除需求后剩余净库存数量H=C+E-F-G',
'ZQUAN9' '理论下单数J',
'ZQUAN10' '库存(不含安全库存)+当月备货总数L=C+E+J-F',
'ZQUAN11' '库存+当月货物总数占当月预测比率(%) L/A',
'TEXT1' '市场建议下单数量',
'TEXT2' 'CS建议下单数量',
'TEXT3' '结论建议'.
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 FRM_GET_FULLPATH CHANGING PV_FULLPATH TYPE STRING
PV_PATH TYPE STRING
PV_NAME TYPE STRING.
DATA: LV_INIT_PATH TYPE STRING,
LV_INIT_FNAME TYPE STRING,
LV_PATH TYPE STRING,
LV_FILENAME TYPE STRING,
LV_FULLPATH TYPE STRING.
*&---初始名称(输出的文件名称)
* concatenate 'Material_Doc_' SY-DATUM '.xslx' into L_INIT_FNAME.
LV_INIT_FNAME = L_FILENAME.
* 获取桌面路径
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
CHANGING
DESKTOP_DIRECTORY = LV_INIT_PATH
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
*&---用户选择名称、路径
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
EXPORTING
* window_title = '指定保存文件名'
* default_extension = 'DOC'
DEFAULT_FILE_NAME = LV_INIT_FNAME
FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
* FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_WORD
INITIAL_DIRECTORY = LV_INIT_PATH
PROMPT_ON_OVERWRITE = 'X'
CHANGING
FILENAME = LV_FILENAME
PATH = LV_PATH
FULLPATH = LV_FULLPATH
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC = 0.
PV_FULLPATH = LV_FULLPATH.
PV_PATH = LV_PATH.
ENDIF.
ENDFORM.
*--------------------------------------------------------------------*
* 下载文件
*--------------------------------------------------------------------*
FORM FRM_DOWN USING PR_FILENAME.
DATA: LV_OBJDATA LIKE WWWDATATAB,
LV_MIME LIKE W3MIME,
LV_DESTINATION LIKE RLGRAP-FILENAME,
LV_OBJNAM TYPE STRING,
LV_RC LIKE SY-SUBRC,
LV_ERRTXT TYPE STRING.
DATA: LV_FILENAME TYPE STRING,
LV_RESULT,
LV_SUBRC TYPE SY-SUBRC.
DATA: LV_OBJID TYPE WWWDATATAB-OBJID .
LV_OBJID = L_MUBAN. "上传的模版名称
*&---查找文件是否存在。
SELECT SINGLE RELID OBJID
FROM WWWDATA
INTO CORRESPONDING FIELDS OF LV_OBJDATA
WHERE SRTF2 = 0
AND RELID = 'MI'
AND OBJID = LV_OBJID.
*&---判断模版不存在则报错
IF SY-SUBRC NE 0 OR LV_OBJDATA-OBJID EQ SPACE.
CONCATENATE '模板文件:' LV_OBJID '不存在,请用TCODE:SMW0进行加载'
INTO LV_ERRTXT.
MESSAGE LV_ERRTXT TYPE 'E'.
ENDIF.
LV_FILENAME = PR_FILENAME.
"判断本地地址是否已经存在此文件。
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
EXPORTING
FILE = LV_FILENAME
RECEIVING
RESULT = LV_RESULT
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
WRONG_PARAMETER = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
CASE SY-SUBRC.
WHEN 1.
WHEN 2.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF LV_RESULT EQ 'X'. "如果存在则删除原始文件,重新覆盖
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
EXPORTING
FILENAME = LV_FILENAME
CHANGING
RC = LV_SUBRC
EXCEPTIONS
FILE_DELETE_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
FILE_NOT_FOUND = 4
ACCESS_DENIED = 5
UNKNOWN_ERROR = 6
NOT_SUPPORTED_BY_GUI = 7
WRONG_PARAMETER = 8
OTHERS = 9.
IF SY-SUBRC <> 0.
CASE SY-SUBRC.
WHEN 1.
WHEN 2.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF LV_SUBRC <> 0. "如果删除失败,则报错。
CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
INTO LV_ERRTXT.
MESSAGE LV_ERRTXT TYPE 'E'.
ENDIF.
ENDIF.
LV_DESTINATION = PR_FILENAME.
*&---下载模版。
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = LV_OBJDATA
DESTINATION = LV_DESTINATION
IMPORTING
RC = LV_RC.
IF LV_RC NE 0.
CONCATENATE '模板文件' '下载失败' INTO LV_ERRTXT.
MESSAGE LV_ERRTXT TYPE 'E'.
ENDIF.
ENDFORM.
INITIALIZATION.
SSCRFIELDS-FUNCTXT_01 = '@49@ 模板下载'.
AT SELECTION-SCREEN OUTPUT.
PERFORM SCREEN_OUTPUT.
AT SELECTION-SCREEN .
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'.
L_FILENAME = 'VMI或JIT客户下单申请上载模板.xls'.
L_MUBAN = 'ZSDR043'.
*&---下载模板
PERFORM FRM_GET_FULLPATH CHANGING GV_FULLPATH GV_PATH GV_NAME.
*&---路径为空则退出
IF GV_FULLPATH IS INITIAL.
MESSAGE '用户取消操作' TYPE 'S'.
RETURN.
ENDIF.
PERFORM FRM_DOWN USING GV_FULLPATH.
WHEN OTHERS.
ENDCASE.
START-OF-SELECTION.
IF P_RD1 IS NOT INITIAL.
PERFORM FOM_UPDATA.
ELSE.
PERFORM FOM_GETDATA.
ENDIF.
PERFORM FRM_DISPLAY.