开发笔记-VMI库存发货与领用监控报表

*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2019-06-26
*& Program Type        :  Report
*& Description         :  VMI库存发货与领用监控报表
*&---------------------------------------------------------------------*
REPORT ZMMR154C.
*&---------------------------------------------------------------------*
*& 包含               YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:EKPO,EKKO,EKET,MARC,KNA1.

TYPE-POOLS:SLIS,T001W.

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

DATA:TOPMAT  LIKE CSTMAT .
DATA:DSTST   LIKE CSDATA-XFELD .
DATA:STB     LIKE STPOX OCCURS WITH HEADER LINE  .
DATA:MATCAT  LIKE CSCMAT OCCURS WITH HEADER LINE .
DATA:GT_MARD LIKE MARD OCCURS WITH HEADER LINE  .
DATA:GT_MSKA LIKE MSKA OCCURS WITH HEADER LINE  .
DATA:E_MT61D LIKE MT61D .
DATA:E_MDKP  LIKE MDKP  .
DATA:MDPSX   LIKE MDPS OCCURS WITH HEADER LINE  .
DATA:MDEZX   LIKE MDEZ OCCURS WITH HEADER LINE  .
DATA:MDSUX   LIKE MDSU OCCURS WITH HEADER LINE  .

TYPESBEGIN OF GTS_DATA,
         KUNNR     TYPE  KNA1-KUNNR,                       "客户
         NAME      TYPE  CHAR100,                          "客户名称
         MATNR     TYPE  MARC-MATNR,                       "物料编码
         MAKTX     TYPE  MAKT-MAKTX,                       "物料描述
         KDMAT     TYPE  KNMT-KDMAT,                       "客户物料编码
         KDMAT1    TYPE  KNMT-KDMAT,                       "客户物料编码
         WERKS     TYPE  MARC-WERKS,                       "工厂
         CHARG     TYPE  MATDOC-CHARG,                     "批次
         MENGE     TYPE  MATDOC-MENGE,                     "数量
         MEINS     TYPE  MATDOC-MEINS,                     "单位
         BWART     TYPE  MATDOC-BWART,                     "移动类型
         MAHN1     TYPE  EKPO-MAHN1,                       "到期天数
         MENGE1    TYPE  MATDOC-MENGE,                     "已领数量
         MENGE2    TYPE  MATDOC-MENGE,                     "未领数量
         MENGE3    TYPE  MATDOC-MENGE,                     "客户领用数
         KATR4     TYPE  CHAR10,                           "耗用期限
         LAND1     TYPE  ZTMM02-LAND1,                     "国家/地区代码
         BUDAT     TYPE  MATDOC-BUDAT,                     "发货过账日期
         ZYSSJ     TYPE  ZTMM02-ZYSSJ,                     "运输时间
         DATUM     TYPE  DATUM,                            "到达客户处日期
         KDAUF     TYPE  MATDOC-KDAUF,                     "SO
         KDPOS     TYPE  MATDOC-KDPOS,                     "SO项目
         VBELN_IM  TYPE  MATDOC-VBELN_IM,                  "DN
         VBELP_IM  TYPE  MATDOC-VBELP_IM,                  "DN项目
         ITM_KZGBE TYPE  LIKP-ITM_KZGBE,                   "运输延期时间
         MAHN2     TYPE  EKPO-MAHN1,                       "运输延期时间
         MENGE4    TYPE  MATDOC-MENGE,                     "现有寄售库存
         MENGE5    TYPE  MATDOC-MENGE,                     "客户退货数
         VKORG     TYPE  VBAK-VKORG,                       "销售组织
         VTWEG     TYPE  VBAK-VTWEG,                       "分销渠道
         BSTNK     TYPE  VBAK-BSTNK,                       "客户参考
         WAERK     TYPE  VBAP-WAERK,                       "货币
         NETWR     TYPE  VBRP-NETWR,                       "未领金额
         NETWR_CNY TYPE  VBRP-NETWR,                       "未领人民币金额
         VBELN_YS  TYPE  VBRK-VBELN,                       "原始形式发票
         VBELN_ZZ  TYPE  VBRK-VBELN,                       "最终形式发票
         KDGRP     TYPE  KNVV-KDGRP,                       "客户组
         BZIRK     TYPE  KNVV-BZIRK,                       "销售区域
         BZTXT     TYPE  T171T-BZTXT ,                     "销售区域
         L_RATE    TYPE DECIMALS 4,                      "对人民币的汇率

         ATWRT     TYPE  AUSP-ATWRT,                        "售后产品

         KEY1      TYPE  MATDOC-KEY1,                      "主键
         KEY2      TYPE  MATDOC-KEY2,                      "主键
         KEY3      TYPE  MATDOC-KEY3,                      "主键
         KEY4      TYPE  MATDOC-KEY4,                      "主键
         KEY5      TYPE  MATDOC-KEY5,                      "主键
         KEY6      TYPE  MATDOC-KEY6,                      "主键

         CELLCOLOR TYPE  LVC_T_SCOL,                       "单元格颜色
       END OF GTS_DATA.

DATAGT_DATA       TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA1      TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_SUB   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_ALV        TYPE TABLE OF GTS_DATA WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONSS_KUNNR  FOR   KNA1-KUNNR   MODIF ID C1 .                        "客户编码
SELECT-OPTIONSS_MATNR  FOR   MARC-MATNR   MODIF ID C1 .                        "物料编码
SELECT-OPTIONSS_WERKS  FOR   MARC-WERKS   MODIF ID C1 .                        "工厂
SELECT-OPTIONSS_MAHN1  FOR   EKPO-MAHN1   MODIF ID C1 .                        "到期天数
PARAMETERS:     CH_01    AS CHECKBOX DEFAULT 'X'.                                "只显示客户未领用数据>0
PARAMETERS:     CH_02    AS CHECKBOX DEFAULT ''.                                "不包含售后产品
SELECTION-SCREEN END OF BLOCK B1.

*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  DATA LV_KNA1 TYPE KNA1 .

  TYPESBEGIN OF GTS_KONP,
           KBETR TYPE KONP-KBETR,
           KPEIN TYPE KONP-KPEIN,
           KONWA TYPE KONP-KONWA,
           KMEIN TYPE KONP-KMEIN,
           DATAB TYPE A305-DATAB,
           DATBI TYPE A305-DATBI,
         END OF GTS_KONP.

  DATALV_KONP  TYPE GTS_KONP .
  DATAGT_KONP  TYPE TABLE OF GTS_KONP .
  DATA LV_LIPS  TYPE LIPS .
  DATA LV_KUNNR TYPE A305-KUNNR .
  DATA LV_KUNNR1 TYPE A305-KUNNR .
  DATA LV_KUNNR2 TYPE A305-KUNNR .
  DATA LV_CHAR TYPE CHAR16 .
  DATA GT_VBRK    TYPE TABLE OF VBRK WITH HEADER LINE .
  DATA GT_VBRK_F8 TYPE TABLE OF VBRK WITH HEADER LINE .
  DATA IW_CELLCOLOR TYPE LVC_T_SCOL WITH HEADER LINE.
  DATA TDID       TYPE TABLE OF TDID WITH HEADER LINE .
  DATA TLINE      TYPE TABLE OF TLINE WITH HEADER LINE .
  DATA TDNAME     TYPE TDOBNAME .
  DATA LV_TVKWZ   TYPE TVKWZ .
  DATA LV_KNMT    TYPE KNMT .
  DATA GT_KNMT    TYPE TABLE OF KNMT WITH HEADER LINE.
  DATA LV_OBJEK   TYPE AUSP-OBJEK  .
  DATA GT_AUSP    TYPE TABLE OF AUSP WITH HEADER LINE .
  DATA GT_CAWNT   TYPE TABLE OF CAWNT WITH HEADER LINE .

  DATACW_RATE LIKE BAPI1093_0.
  DATAS_C_FACTOR TYPE DECIMALS 3.
  DATAT_C_FACTOR TYPE DECIMALS 3.
  DATAL_RATE   TYPE DECIMALS 4.
  DATAFACTOR  TYPE DECIMALS 3.

*根据选择条件的客户编码,物料编码,工厂到表MSKU取出批次CHARG,数量KULAB
  CLEAR GT_DATA[].
  SELECT
    MSKU~KUNNR
    MSKU
~MATNR
    MSKU
~WERKS
    MSKU
~CHARG
    MSKU
~KULAB AS MENGE4
    
INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
    
FROM MSKU
    
WHERE MSKU~KUNNR IN S_KUNNR
      
AND MSKU~MATNR IN S_MATNR
      
AND MSKU~WERKS IN S_WERKS
      
AND MSKU~KULAB <> 0
      .

*根据步骤1客户编码、物料、工厂、批次到表MATDOC取出移动类型=‘633’'634' 寄售库存发货数量MENGE
*如移动类型为634时,数量乘以-1,按客户编码、物料、工厂、批次做数量汇总得到客户+物料+工厂+批次的寄售发货总数量
  IF GT_DATA[] IS NOT INITIAL.
    CLEAR GT_DATA1[].
    SELECT
      MATDOC~KEY1
      MATDOC
~KEY2
      MATDOC
~KEY3
      MATDOC
~KEY4
      MATDOC
~KEY5
      MATDOC
~KEY6
      MATDOC
~KUNNR
      MATDOC
~MATNR
      MATDOC
~WERKS
      MATDOC
~CHARG
      MATDOC
~BWART
      MATDOC
~MENGE
      MATDOC
~MEINS
      
INTO CORRESPONDING FIELDS OF TABLE GT_DATA1[]
      
FROM MATDOC
      
FOR ALL ENTRIES IN GT_DATA[]
      
WHERE MATDOC~KUNNR GT_DATA-KUNNR
        
AND MATDOC~MATNR GT_DATA-MATNR
        
AND MATDOC~WERKS GT_DATA-WERKS
        
AND MATDOC~CHARG GT_DATA-CHARG
        
AND MATDOC~BWART IN '633','634' )
        .
  ENDIF.

  SORT GT_DATA BY KUNNR MATNR WERKS CHARG .
*  GT_DATA1[] = GT_DATA[].
*  DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING KUNNR MATNR WERKS CHARG.

  CLEAR GT_ALV[] .
  LOOP AT GT_DATA.
    CLEAR GT_DATA-MENGE .
    LOOP AT GT_DATA1 WHERE KUNNR GT_DATA-KUNNR
                       
AND MATNR GT_DATA-MATNR
                       
AND WERKS GT_DATA-WERKS
                       
AND CHARG GT_DATA-CHARG
                       
.
      IF GT_DATA1-BWART '634'.
        GT_DATA1-MENGE GT_DATA1-MENGE * -.
      ENDIF.
      GT_DATA-MENGE GT_DATA-MENGE + GT_DATA1-MENGE .
      CLEAR GT_DATA1.
    ENDLOOP.

    CLEAR LV_KNA1 .
    SELECT SINGLE NAME1 NAME2 KATR4 LAND1 INTO CORRESPONDING FIELDS OF LV_KNA1 FROM KNA1
      
WHERE KUNNR GT_DATA-KUNNR
      
.

    GT_DATA-NAME  LV_KNA1-NAME1 && LV_KNA1-NAME2 .
    GT_DATA-KATR4 LV_KNA1-KATR4 .
    GT_DATA-LAND1 LV_KNA1-LAND1 .

    SELECT SINGLE ZYSSJ INTO GT_DATA-ZYSSJ FROM ZTMM02
      
WHERE LAND1 GT_DATA-LAND1
      
.

    SELECT SINGLE MAKTX INTO GT_DATA-MAKTX FROM MAKT
      
WHERE MATNR GT_DATA-MATNR
        
AND SPRAS SY-LANGU
        
.

    CLEAR GT_KNMT[].
    SELECT INTO CORRESPONDING FIELDS OF TABLE GT_KNMT[] FROM KNMT
      
WHERE MATNR =  GT_DATA-MATNR
        
AND KUNNR =  GT_DATA-KUNNR
        
AND KDMAT <> ''
        .
    SORT GT_KNMT[] BY ERDAT DESCENDING .
    CLEAR GT_KNMT.
    READ TABLE GT_KNMT INDEX .

    GT_DATA-KDMAT GT_KNMT-KDMAT .
    SPLIT GT_DATA-KDMAT AT '&' INTO GT_DATA-KDMAT GT_DATA-KDMAT1.

*KDMAT
**根据选择条件的客户编码,物料编码,工厂到表 MSKU 取出批次 CHARG ,数量 KULAB
*    SELECT SINGLE KULAB INTO GT_DATA-MENGE4 FROM MSKU
*      WHERE KUNNR = GT_DATA-KUNNR
*        AND MATNR = GT_DATA-MATNR
*        AND WERKS = GT_DATA-WERKS
*        AND CHARG = GT_DATA-CHARG
*        .

*根据步骤1的客户编码,物料,工厂,批次到表MATDOC取出特殊库存标识SOBKZ='W',移动类型=631,632,701,702,561,562 非互为冲销的寄售库存补充的物料凭证信息
*互为冲销凭证判断逻辑:( ( MATDOC~CANCELLED =  '' AND MATDOC~SMBLN =  '') OR ( MATDOC~CANCELLED = '' AND MATDOC~SMBLN <> '' AND MATDOC~CANCELLATION_TYPE = '1' ) )
    CLEAR GT_DATA_SUB[].
    SELECT KUNNR MATNR WERKS CHARG BWART MENGE MEINS BUDAT KDAUF KDPOS VBELN_IM VBELP_IM
      
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_SUB[] FROM MATDOC
      
WHERE KUNNR GT_DATA-KUNNR
        
AND MATNR GT_DATA-MATNR
        
AND WERKS GT_DATA-WERKS
        
AND CHARG GT_DATA-CHARG
        
AND SOBKZ 'W'
        AND BWART IN '561','562','631','632','701','702' )
        AND ( ( MATDOC~CANCELLED '' AND MATDOC~SMBLN =  ''OR MATDOC~CANCELLED '' AND MATDOC~SMBLN <> '' AND MATDOC~CANCELLATION_TYPE '1' ) )
        .

    LOOP AT GT_DATA_SUB WHERE BWART '562'
                           OR BWART '632'
                           OR BWART '702'
                            .
*      GT_DATA_SUB-MENGE = GT_DATA_SUB-MENGE * -1 .
      GT_DATA-MENGE5 GT_DATA-MENGE5 + GT_DATA_SUB-MENGE .
      DELETE GT_DATA_SUB .
      CLEAR GT_DATA_SUB.
    ENDLOOP.

    SORT GT_DATA_SUB[] BY KUNNR MATNR WERKS CHARG BUDAT .
    LOOP AT GT_DATA_SUB.

      IF GT_DATA-MENGE5 <> 0.
        IF GT_DATA-MENGE5 >= GT_DATA_SUB-MENGE.
          GT_DATA-MENGE5 GT_DATA-MENGE5 GT_DATA_SUB-MENGE .
          DELETE GT_DATA_SUB[].
          CLEAR GT_DATA_SUB .
          CONTINUE.
        ELSE.
          GT_DATA_SUB-MENGE GT_DATA_SUB-MENGE GT_DATA-MENGE5 .
          GT_DATA-MENGE5 .
        ENDIF.
      ENDIF.

      CLEAR LV_LIPS.
      SELECT SINGLE INTO LV_LIPS FROM LIPS
        
WHERE VBELN  GT_DATA_SUB-VBELN_IM
          
AND POSNR  GT_DATA_SUB-VBELP_IM
          
.

      IF LV_LIPS-UECHA IS NOT INITIAL .
        GT_DATA_SUB-VBELP_IM LV_LIPS-UECHA .
      ENDIF.

      SELECT SINGLE VKORG VTWEG BSTNK INTO CORRESPONDING FIELDS OF GT_DATA_SUB FROM VBAK
        
WHERE VBELN GT_DATA_SUB-KDAUF
          
.

*GT_DATA_SUB-VKORG如为空,则通过工厂编码到表TVKWZ取得第一条数据的销售组织VKORG 、分销渠道VTWEG并赋值给GT_DATA_SUB
      IF GT_DATA_SUB-VKORG IS INITIAL.
        SELECT SINGLE VKORG VTWEG INTO GT_DATA_SUB-VKORG GT_DATA_SUB-VTWEG FROM TVKWZ
          
WHERE WERKS GT_DATA_SUB-WERKS
          
.
      ENDIF.

      CLEAR LV_KNMT.
      SELECT SINGLE INTO CORRESPONDING FIELDS OF LV_KNMT FROM KNMT
          
WHERE KUNNR GT_DATA_SUB-KUNNR
            
AND VKORG GT_DATA_SUB-VKORG
            
AND VTWEG GT_DATA_SUB-VTWEG
            
AND MATNR GT_DATA_SUB-MATNR
            
.

      IF LV_KNMT IS INITIAL.
        CLEAR GT_KNMT.
        SELECT INTO CORRESPONDING FIELDS OF TABLE GT_KNMT[] FROM KNMT
          
WHERE KUNNR GT_DATA_SUB-KUNNR
            
AND MATNR GT_DATA_SUB-MATNR
            
.

        SORT GT_KNMT[] BY ERDAT DESCENDING .
        READ TABLE GT_KNMT INTO LV_KNMT INDEX .
      ENDIF.

      CLEAR LV_OBJEK.
      LV_OBJEK LV_KNMT-VKORG && LV_KNMT-VTWEG && LV_KNMT-KUNNR .
      LV_OBJEK+16(40) = LV_KNMT-MATNR .

      CLEAR GT_AUSP.
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GT_AUSP FROM AUSP
        
WHERE ATINN '0000000825'"0000000823 ZCS_STAFF
          AND KLART '052'
          AND OBJEK LV_OBJEK
          
.

      IF FLOORGT_AUSP-DEC_VALUE_FROM <> 0.
        GT_DATA-KATR4 FLOORGT_AUSP-DEC_VALUE_FROM ).
      ENDIF.

*ATWRT_04
      CLEAR GT_AUSP.
      SELECT SINGLE INTO CORRESPONDING FIELDS OF  GT_AUSP FROM AUSP
        
WHERE ATINN '0000000828'"0000000828 ZCS_STAFF
          AND KLART '052'
          AND OBJEK LV_OBJEK
          
.

      GT_DATA-ATWRT GT_AUSP-ATWRT.

      GT_DATA_SUB-NAME   GT_DATA-NAME .
      GT_DATA_SUB-KATR4  GT_DATA-KATR4 .
      GT_DATA_SUB-ATWRT  GT_DATA-ATWRT .
      GT_DATA_SUB-LAND1  GT_DATA-LAND1 .
      GT_DATA_SUB-ZYSSJ  GT_DATA-ZYSSJ .
      GT_DATA_SUB-MAKTX  GT_DATA-MAKTX .
      GT_DATA_SUB-KDMAT  GT_DATA-KDMAT .
      GT_DATA_SUB-MENGE4 GT_DATA-MENGE4 .

      SELECT SINGLE ITM_KZGBE INTO GT_DATA_SUB-ITM_KZGBE FROM LIKP
        
WHERE VBELN GT_DATA_SUB-VBELN_IM
        
.

      CONDENSE GT_DATA_SUB-ITM_KZGBE NO-GAPS .
      IF CL_ABAP_MATCHER=>MATCHES(
          PATTERN '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
          TEXT GT_DATA_SUB-ITM_KZGBE ) = ABAP_TRUE.
        GT_DATA_SUB-MAHN2 GT_DATA_SUB-ITM_KZGBE.
      ELSE.
        GT_DATA_SUB-MAHN2 .
      ENDIF.

      IF GT_DATA_SUB-BWART '632' OR GT_DATA_SUB-BWART '562' .
        GT_DATA_SUB-MENGE GT_DATA_SUB-MENGE * -.
      ENDIF.

      IF GT_DATA-MENGE >= GT_DATA_SUB-MENGE.
        GT_DATA_SUB-MENGE1 GT_DATA_SUB-MENGE .
        GT_DATA_SUB-MENGE2 .
        GT_DATA-MENGE      GT_DATA-MENGE GT_DATA_SUB-MENGE .
        GT_DATA_SUB-MENGE3 GT_DATA-MENGE .
      ELSE.
        GT_DATA_SUB-MENGE1 GT_DATA-MENGE .
        GT_DATA_SUB-MENGE2 GT_DATA_SUB-MENGE GT_DATA-MENGE .
        GT_DATA-MENGE      .
        GT_DATA_SUB-MENGE3 GT_DATA-MENGE .
      ENDIF.

      GT_DATA_SUB-DATUM GT_DATA_SUB-BUDAT + GT_DATA_SUB-ZYSSJ + GT_DATA_SUB-MAHN2.
      IF GT_DATA_SUB-MENGE2 0.
        GT_DATA_SUB-MAHN1 .
      ELSE .
        GT_DATA_SUB-MAHN1 GT_DATA_SUB-DATUM + GT_DATA_SUB-KATR4 SY-DATUM .
      ENDIF.

根据物料MATNR、客户KUNNR、销售组织 VKORG ,分销渠道 VTWEG 
条件类型KSCHL='ZP00'关联表 A305 KONP取出DATAB生效起始日期<=凭证日期AUDAT  DATBI截止日期>=凭证日期AUDAT
且删除标记LOEVM_KO等于空的第一条数据行净价KONP-KBETR、价格单位KONP-KPEINKONP-KONWA 为币别,
净价/价格单位更新GT_ALV数据行的净价 NETPR 、价格单位 KPEIN 、货币 WAERK
 NETWR = 净价 NETPR /价格单位 KPEIN * KWMENG 数量
      CLEAR LV_KUNNR.
      CLEAR LV_KUNNR1.
      CLEAR LV_KUNNR2.
      CLEAR LV_CHAR.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
        EXPORTING
          INPUT  GT_ALV-KUNNR
        
IMPORTING
          OUTPUT LV_KUNNR.

      SPLIT LV_KUNNR AT '-' INTO LV_KUNNR1 LV_KUNNR2.
      LV_CHAR =  '%' && LV_KUNNR1 && '%'  .

      CLEAR LV_KONP.
      SELECT SINGLE
        KONP~KBETR
        KONP
~KPEIN
        KONP
~KONWA
        KONP
~KMEIN
        A305
~DATAB
        A305
~DATBI
        
INTO CORRESPONDING FIELDS OF LV_KONP
        
FROM KONP
        INNER 
JOIN A305 ON KONP~KNUMH A305~KNUMH
      
WHERE A305~MATNR  GT_DATA_SUB-MATNR
        
AND A305~KUNNR LIKE LV_CHAR
        
AND A305~VKORG  GT_DATA_SUB-VKORG
        
AND A305~VTWEG  GT_DATA_SUB-VTWEG
        
AND A305~KSCHL  'ZP00'
        AND A305~DATAB <= SY-DATUM
        
AND A305~DATBI >= SY-DATUM
        
AND KONP~LOEVM_KO ''
        .
      IF SY-SUBRC 0.
        GT_DATA_SUB-WAERK LV_KONP-KONWA .

*计算公式更改为:未领数量*单价/价格单位
        IF LV_KONP-KPEIN * GT_DATA_SUB-MENGE2 <> 0.
          GT_DATA_SUB-NETWR LV_KONP-KBETR / LV_KONP-KPEIN * GT_DATA_SUB-MENGE2.
        ENDIF.
      ELSE.
        CLEAR GT_KONP[].
        SELECT
          KONP~KBETR
          KONP
~KPEIN
          KONP
~KONWA
          KONP
~KMEIN
          A305
~DATAB
          A305
~DATBI
          
INTO CORRESPONDING FIELDS OF TABLE GT_KONP[]
          
FROM KONP
          INNER 
JOIN A305 ON KONP~KNUMH A305~KNUMH
        
WHERE A305~MATNR  GT_DATA_SUB-MATNR
          
AND A305~KUNNR LIKE LV_CHAR
          
AND A305~VKORG  GT_DATA_SUB-VKORG
          
AND A305~VTWEG  GT_DATA_SUB-VTWEG
          
AND A305~KSCHL  'ZP00'
          AND KONP~LOEVM_KO ''
          .
        IF SY-SUBRC 0.
          SORT GT_KONP[] BY DATBI DESCENDING.
          READ TABLE GT_KONP INTO LV_KONP INDEX .
          GT_DATA_SUB-WAERK LV_KONP-KONWA .

*计算公式更改为:未领数量*单价/价格单位
          IF LV_KONP-KPEIN * GT_DATA_SUB-MENGE2 <> 0.
            GT_DATA_SUB-NETWR LV_KONP-KBETR / LV_KONP-KPEIN * GT_DATA_SUB-MENGE2.
          ENDIF.
        ENDIF.
      ENDIF.

      IF 'CNY' <> GT_DATA_SUB-WAERK.
        CLEAR CW_RATE.
        CLEAR S_C_FACTOR.
        CLEAR T_C_FACTOR.
        CLEAR GT_DATA-L_RATE.
        IF GT_DATA_SUB-WAERK <> 'EUR'.
*1. 获取汇率信息
          CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
            EXPORTING
              RATE_TYPE  'M'
              FROM_CURR  GT_DATA_SUB-WAERK
              TO_CURRNCY 
'CNY'
              DATE       SY-DATUM
            
IMPORTING
              EXCH_RATE  CW_RATE.
*2. 获取转换因子
          CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
            EXPORTING
              CURRENCY GT_DATA_SUB-WAERK
            
IMPORTING
              FACTOR   S_C_FACTOR.

          CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
            EXPORTING
              CURRENCY 'CNY'
            IMPORTING
              FACTOR   T_C_FACTOR.

          GT_DATA_SUB-L_RATE CW_RATE-EXCH_RATE * CW_RATE-TO_FACTOR / CW_RATE-FROM_FACTOR ).

        ELSE.

*1. 获取汇率信息
          CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
            EXPORTING
              RATE_TYPE  'EURX'
              FROM_CURR  'CNY'
              TO_CURRNCY GT_DATA_SUB-WAERK
              
DATE       SY-DATUM
            
IMPORTING
              EXCH_RATE  CW_RATE.

          GT_DATA_SUB-L_RATE CW_RATE-EXCH_RATE_V .

        ENDIF.

      ELSE .
        GT_DATA_SUB-L_RATE .
      ENDIF.

      GT_DATA_SUB-NETWR_CNY GT_DATA_SUB-NETWR * GT_DATA_SUB-L_RATE .

*原始形式发票    根据DN+项目参考ZSDR012 884-918行程序获取
*最终形式发票
      CLEAR GT_VBRK_F8[] .
      SELECT
         VBRK~VBELN
         VBRK
~FKDAT
         VBRK
~VBTYP
         VBRK
~FKART
      
INTO CORRESPONDING FIELDS OF TABLE GT_VBRK_F8[]
        
FROM VBRP
        INNER 
JOIN VBRK ON VBRP~VBELN VBRK~VBELN
        
WHERE VBRP~VGBEL  GT_DATA_SUB-VBELN_IM
          
AND VBRP~VGPOS  GT_DATA_SUB-VBELP_IM
          
AND VBRK~FKART  'F8'
          AND VBRK~FKSTO  ''
          .

      "最终形式发票
      SORT GT_VBRK_F8[] BY VBELN DESCENDING.
      CLEAR GT_VBRK_F8.
      READ TABLE GT_VBRK_F8 INDEX .
      GT_DATA_SUB-VBELN_ZZ GT_VBRK_F8-VBELN .

      IF GT_DATA_SUB-VBELN_ZZ IS NOT INITIAL.
        "原始形式发票
        TDID 'Z008'.
        TDNAME GT_DATA_SUB-VBELN_ZZ .
        CLEAR TLINE[] .
        CALL FUNCTION 'READ_TEXT'
          EXPORTING
            OBJECT          'VBBK'
            NAME            TDNAME
            
ID              TDID
            
LANGUAGE        'E'
          TABLES
            LINES           TLINE
          
EXCEPTIONS
            OBJECT          1
            ID              2
            LANGUAGE        3
            NAME            4
            NOT_FOUND       5
            REFERENCE_CHECK 6.
        IF TLINE[] IS NOT INITIAL.
          LOOP AT TLINE.
            GT_DATA_SUB-VBELN_YS GT_DATA_SUB-VBELN_YS && TLINE-TDLINE .
          ENDLOOP.
        ENDIF.
      ENDIF.

      IF GT_DATA_SUB-MAHN1 < 0.
        IW_CELLCOLOR-FNAME 'MAHN1'.
        IW_CELLCOLOR-COLOR-COL 6.
        IW_CELLCOLOR-COLOR-INT 0.
        IW_CELLCOLOR-COLOR-INV 0.
        APPEND IW_CELLCOLOR TO GT_DATA_SUB-CELLCOLOR.
      ENDIF.

      SELECT SINGLE KDGRP INTO GT_DATA_SUB-KDGRP FROM KNVV
        
WHERE KUNNR GT_DATA_SUB-KUNNR
        
.

      CLEAR LV_TVKWZ .
      SELECT SINGLE INTO LV_TVKWZ FROM TVKWZ
        
WHERE WERKS GT_DATA_SUB-WERKS
        
.

      SELECT SINGLE
        KNVV~BZIRK
        T171T
~BZTXT
        
INTO CORRESPONDING FIELDS OF GT_DATA_SUB
        
FROM KNVV
        INNER 
JOIN T171T ON KNVV~BZIRK T171T~BZIRK
        
WHERE KUNNR GT_DATA_SUB-KUNNR
          
AND VKORG LV_TVKWZ-VKORG
          
.

      APPEND GT_DATA_SUB TO GT_ALV[] .
      CLEAR GT_DATA_SUB .
    ENDLOOP.

    MODIFY GT_DATA TRANSPORTING MENGE .
    CLEAR GT_DATA .
  ENDLOOP.

  DELETE GT_ALV[] WHERE MAHN1 NOT IN S_MAHN1.
  IF CH_01 IS NOT INITIAL.
    DELETE GT_ALV[] WHERE MENGE2 <= .
  ENDIF.
  IF CH_02 IS NOT INITIAL.
    DELETE GT_ALV[] WHERE ATWRT IS NOT INITIAL .
  ENDIF.
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-INFO_FIELDNAME 'CLR'.  "行颜色代码的字段
  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_ALV[].
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 :
        'KUNNR'    '客户',
        'NAME'     '客户名称',
        'MATNR'    '物料编码',
        'MAKTX'    '物料描述',
        'KDMAT'    '客户物料编码',
        'WERKS'    '工厂',
        'CHARG'    '批次',
        'MENGE'    '剩余发货数量',
        'MEINS'    '单位',
        'BWART'    '移动类型',
        'MAHN1'    '到期天数',
        'MENGE1'   '已领数量',
        'MENGE2'   '未领数量',
*        'MENGE3'   '客户领用数',
*        'MENGE4'   '现有寄售库存',
        'BSTNK'    '客户参考',
        'KATR4'    '耗用期限',
        'ATWRT'    '售后产品',
        'LAND1'    '国家/地区代码',
        'BUDAT'    '发货过账日期',
        'ZYSSJ'    '运输时间',
        'DATUM'    '到达客户处日期',
        'KDAUF'    'SO',
        'KDPOS'    'SO项目',
        'WAERK'    '币别',
        'NETWR'    '未领金额',
        'NETWR_CNY'    '未领人民币金额',
        'KDGRP'    '客户组',
        'BZTXT'    '销售区域',
        'VBELN_YS' '原始形式发票',
        'VBELN_ZZ' '最终形式发票',
        'MAHN2'    '运输延期时间',
        'VBELN_IM' 'DN',
        'VBELP_IM' 'DN项目'.

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.

INITIALIZATION .

AT SELECTION-SCREEN.
  PERFORM SCREEN_SETTING.

START-OF-SELECTION.
  PERFORM FOM_GETDATA .
  PERFORM FRM_DISPLAY.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值