开发笔记-VMI或JIT客户下单申请

*&---------------------------------------------------------------------*
*& Report ZSDR040 tcode-ZSDR040
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZSDR040C.
TABLES:SSCRFIELDS,KNMT,CAWNT,ZTSD_ZSDR043.
TYPE-POOLS:SLIS.

"定义ALV输出所需变量
DATAS_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

DATA GT_EXDATA TYPE ALSMEX_TABLINE OCCURS 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 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 .

TYPESBEGIN 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.

DATALV_MODE   TYPE C.
DATAGT_DATA   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_ZSDR043 TYPE TABLE OF ZTSD_ZSDR043 WITH HEADER LINE.

TYPESBEGIN 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.

TYPESBEGIN OF GTS_VBFA,
         VBELN TYPE VBFA-VBELN,
         POSNN TYPE VBFA-POSNN,
         ZEILE TYPE MATDOC-ZEILE,
       END OF GTS_VBFA.

SELECTION-SCREENFUNCTION 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
*-----------------------------------------------------------------------------
PARAMETERSP_FILE  LIKE RLGRAP-FILENAME MODIF ID C1.                        "请选择文件
PARAMETERSP_PERX1 LIKE ZTSD_ZSDR043-PERXX MODIF ID C1 DEFAULT SY-DATUM(6). "查询期间
PARAMETERSP_ZENN1 LIKE ZTSD_ZSDR043-ZENNR MODIF ID C1.                     "版本号
*-----------------------------------------------------------------------------
SELECT-OPTIONSS_ZENN2  FOR  ZTSD_ZSDR043-ZENNR   MODIF ID C2.              "版本号
SELECT-OPTIONSS_KUNNR  FOR  ZTSD_ZSDR043-KUNNR   MODIF ID C2.              "客户编号
SELECT-OPTIONSS_MATNR  FOR  ZTSD_ZSDR043-MATNR   MODIF ID C2.              "物料编号
SELECT-OPTIONSS_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 <> 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.
  DATAGT_MATDOC_H TYPE TABLE OF GTS_MATDOC WITH HEADER LINE.

  LV_DATUM1(6) = P_PERX1 .
  LV_DATUM1 LV_DATUM1(6&& '01'.
  LV_DATUM2 P_PERX1 && '01'.
  LV_DATUM2 LV_DATUM2 .
  LV_DATUM3 P_PERX1 && '01'.
  LV_DATUM4 P_PERX1 && '26'.
  LV_DATUM4 LV_DATUM4 + .
  LV_DATUM4 LV_DATUM4(6&& '01'.
  LV_DATUM4 LV_DATUM4 .

  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 .

*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 * -.
      ENDIF.
      GT_DATA-ZCACHE GT_DATA-ZCACHE + GT_MATDOC-MENGE.
      CLEAR GT_MATDOC .
    ENDLOOP.
    GT_DATA-ZQUAN1C GT_DATA-ZCACHE"当月已出货数量(基本单位)

*4.如果客户KATR1属性1D,将第一步的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 * -.
      ENDIF.
      GT_DATA-ZCACHE GT_DATA-ZCACHE + GT_MATDOC-MENGE.
      CLEAR GT_MATDOC .
    ENDLOOP.
    GT_DATA-ZCACHE GT_DATA-ZCACHE / .
    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行第3d步骤计算出的当月已出货数量 即为当月已下单未出货数量 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 .
    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 * -.
          ENDIF.
          GT_DATA-ZQUAN5 GT_DATA-ZQUAN5 GT_MATDOC_H-MENGE .
          CLEAR GT_MATDOC_H .
        ENDLOOP.
      ENDIF.
    ENDIF.
*减去历史月份出货数-------------------------------------------------------

    GT_DATA-ZQUAN7 GT_DATA-ZQUAN1 / .

*扣除需求后剩余净库存数量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  .
    ELSEIF GT_DATA-ZQUAN8 < AND GT_DATA-ZQUAN4 < GT_DATA-ZQUAN7 .
      GT_DATA-ZQUAN9 GT_DATA-ZQUAN7 GT_DATA-ZQUAN4 + GT_DATA-ZQUAN3.
    ELSEIF GT_DATA-ZQUAN8 < 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.
  DATAREF TYPE REF TO CL_GUI_ALV_GRID.
  DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性
  RANGESL_WERKS FOR T001W-WERKS.
  RANGESL_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.

  DATALV_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.
  DATALV_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.

  DATALV_FILENAME TYPE STRING,
        LV_RESULT,
        LV_SUBRC    TYPE SY-SUBRC.

  DATALV_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 OR LV_OBJDATA-OBJID EQ SPACE.
    CONCATENATE '模板文件:LV_OBJID '不存在,请用TCODESMW0进行加载'
    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 'VMIJIT客户下单申请上载模板.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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值