开发笔记-工单领料查询报表

*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2019-06-26
*& Program Type        :  Report
*& Description         :  工单领料查询报表
*&---------------------------------------------------------------------*
REPORT ZPPR002H DEFINING DATABASE IOC.
*&---------------------------------------------------------------------*
*& 包含               YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:AFPO,MARA,EKET,AFKO,TJ30T,JCDS,CRHD,RESB.

TYPE-POOLS:SLIS,T001W.


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

TYPESBEGIN OF GTS_DATA,
         ZITEM     TYPE  CHAR12,                          "    
         PWERK     TYPE  AFPO-PWERK,                      "工厂
         AUFNR     TYPE  AFPO-AUFNR,                      "工单号
         VERID     TYPE  AFPO-VERID,                      "生产版本
         MATNR     TYPE  AFPO-MATNR,                      "成品项目号
         FEVOR     TYPE  MARC-FEVOR,                      "生产管理员
         TXT       TYPE  T024F-TXT,                       "生产管理员描述
         MEINS     TYPE  AFPO-MEINS,                      "单位
         MEINS_SUB TYPE  RESB-MEINS,                      "子件单位
         PSMNG     TYPE  AFPO-PSMNG,                      "工单数量
         WEMNG     TYPE  AFPO-WEMNG,                      "交货数量
         EXTWG     TYPE  MARA-EXTWG,                      "系列
         VTEXT     TYPE  T179T-VTEXT,                     "系列描述
         MAKTX     TYPE  MAKT-MAKTX,                      "项目号说明
         VORNR     TYPE  AFVC-VORNR,                      "项目号说明

         RSNUM     TYPE  RESB-RSNUM,                      "预留号
         RSPOS     TYPE  RESB-RSPOS,                      "预留项目
         MATNR_SUB TYPE  RESB-MATNR,                      "子件项目号
         MTART     TYPE  MARA-MTART,                      "子件物料类型
         MAKTX_SUB TYPE  MAKT-MAKTX,                      "子件项目号说明
         GMNGA     TYPE  AFRU-GMNGA,                      "确认数量
         STPRS     TYPE  MBEW-STPRS,                      "取标准价格
         VERPR     TYPE  MBEW-VERPR,                      "移动平均价格/周期单价
         ZPLP1     TYPE  MBEW-ZPLP1,                      "计划价格1

         ARBID     TYPE  AFVC-ARBID,                      "资源的对象 ID
         STAND     TYPE  CRCO-KOSTL,                      "管理部门成本中心
         STEXT     TYPE  CSKT-KTEXT,                      "管理部门

         GSTRI     TYPE  AFKO-GSTRI,                      "工单第一次报工日期
         GLTRI     TYPE  AFKO-GLTRI,                      "工单入库完成日期
         UDATE     TYPE  JCDS-UDATE,                      "工单TECO日期

         ZCBFL     TYPE  ZSTP01,                          "正常报废率
         ZCBFL_T   TYPE  STRING,                          "正常报废率
         YCBFL     TYPE  ZSTP01,                          "异常报废率
         YCBFL_T   TYPE  STRING,                          "异常报废率
         SZJBF     TYPE  MSEG-MENGE,                      "实际子件报废率
         SZJBFT    TYPE  CHAR10,                          "实际子件报废率
         SZJBS     TYPE  MSEG-MENGE,                      "实际子件报废数量
         ZCBFS     TYPE  MSEG-MENGE,                      "正常报废数
         YCBFS     TYPE  MSEG-MENGE,                      "异常报废数
         BZBFS     TYPE  MSEG-MENGE,                      "标准报废数
         BFJEJ     TYPE  ZSTPRS01,                        "报废金额小计
         ZCBFJ     TYPE  ZSTPRS01,                        "正常报废金额
         YCBFJ     TYPE  ZSTPRS01,                        "异常报废金额

         PEINH     TYPE  MBEW-PEINH,                      "价格单位
         VPRSV     TYPE  MBEW-VPRSV,                      "价格控制指示符
         ZGDCZ     TYPE  ZSTPRS,                          "产值
         AUSCH     TYPE  RESB-AUSCH,                      "BOM中的损耗率
         AUSCHT    TYPE  CHAR10,                          "BOM中的损耗率
         BDMNG     TYPE  ZBDMNG,                          "需求量
         BOMYL     TYPE  RESB-BDMNG,                      "目标用量(不含废品率)
         BOMBZ     TYPE  ZBDMNG,                          "各子件用量(不含废品率)
         FMENG     TYPE  RESB-FMENG,                      "固定数量
         SHKZG     TYPE  RESB-SHKZG,                      "借方/贷方标识
         STLNR     TYPE  RESB-STLNR,                      "BOM展开号
         WERKS     TYPE  RESB-WERKS,                      "子件工厂
         ERFME     TYPE  RESB-ERFME,                      "条目单位
         ERFMG     TYPE  RESB-ERFMG,                      "工单需求数
         RSART     TYPE  RESB-RSART,                      "记录类型
         MENGE     TYPE  MSEG-MENGE,                      "计划外发料数量
         MENGE_T   TYPE  MSEG-MENGE,                      "计划外发料数量
         MENGE_J   TYPE  MSEG-MENGE,                      "计划外发料数量
         MENGT     TYPE  MSEG-MENGE,                      "退料数量
         ZSFSL     TYPE  MSEG-MENGE,                      "实发数量
         ZFFCY     TYPE  MSEG-MENGE,                      "发放差异(实际VS 计划)
         ZCYBL     TYPE  MSEG-MENGE,                      "差异比例
         ZCYBLT    TYPE  CHAR10,                          "差异比例
         STTXT     TYPE  BSVX-STTXT,                      "工单状态
         ZTTXT     TYPE  BSVX-STTXT,                      "自定义用户状态
         RGEKZ     TYPE  RESB-RGEKZ,                      "反冲
         AUART     TYPE  AUFK-AUART,                      "工单类型
         OBJNR     TYPE  AUFK-OBJNR,                      "对象号
         ZADD1     TYPE  CHAR10,                          "原因分析
         ZADD2     TYPE  CHAR10,                          "改善措施
         ZADD3     TYPE  CHAR10,                          "CAR编号
         ZADD4     TYPE  CHAR10,                          "责任人
         ZADD5     TYPE  CHAR10,                          "担当人

         ZJHDJ     TYPE  ZCURR5,                          "计划单价
         SOLLKOST  TYPE  KKBCS_OUT-SOLLKOST_G,            "目标成本
         SOLLKOSTL TYPE  KKBCS_OUT-SOLLKOST_G,            "目标成本(不含废品率)
         FLAG      TYPE  C,                               "标记
         CLR       TYPE  CHAR4,                           "可以控制行颜色

       END OF GTS_DATA.

DATABEGIN OF STATUS_TMP OCCURS 0,
        STAT LIKE JEST-STAT,
        EXCL LIKE RC27X-FLG_SEL,
      END   OF STATUS_TMP.
DATASTATUS_HDR_TAB LIKE STATUS_TMP OCCURS WITH HEADER LINE,
      STATUS_OPR_TAB LIKE STATUS_TMP OCCURS WITH HEADER LINE,
      STATUS_CMP_TAB LIKE STATUS_TMP OCCURS WITH HEADER LINE.
TYPES:
  BEGIN OF TYP_S_AUFNR,
    AUFNR TYPE AUFNR,
  END OF TYP_S_AUFNR,
  TYP_TS_AUFNR TYPE SORTED TABLE OF TYP_S_AUFNR
               
WITH NON-UNIQUE KEY AUFNR,
  BEGIN OF TYP_S_OBJNR,
    AUFNR TYPE AUFNR,
    AUFPL TYPE CO_AUFPL,
    APLFL TYPE PLNFOLGE,
    PLNFL TYPE PLNFOLGE,
    OBJNR TYPE J_OBJNR,
  END OF TYP_S_OBJNR,
  TYP_TS_AUFNR_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR
                     
WITH NON-UNIQUE KEY AUFNR OBJNR,
  TYP_TS_AUFPL_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR
                     
WITH NON-UNIQUE KEY AUFPL OBJNR,
  TYP_TS_OBJNR       TYPE SORTED TABLE OF TYP_S_OBJNR,
  BEGIN OF TYP_S_VBELN,
    VBELN TYPE VBELN,
  END OF TYP_S_VBELN,
  TYP_TS_VBELN TYPE SORTED TABLE OF TYP_S_VBELN
               
WITH NON-UNIQUE KEY VBELN.

DATAYX             VALUE 'X'.
DATAGT_DATA        TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_HEAD   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_ITEM   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_ITEM_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_ITEM_C TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_AFRU        TYPE TABLE OF AFRU     WITH HEADER LINE.
DATAGT_MSEG        TYPE TABLE OF MSEG     WITH HEADER LINE.
DATAGT_AFVC        TYPE TABLE OF AFVC     WITH HEADER LINE.
DATAGT_CRHD        TYPE TABLE OF CRHD     WITH HEADER LINE.
DATAGT_T499S       TYPE TABLE OF T499S    WITH HEADER LINE.
DATAGT_CKMLCR      TYPE TABLE OF CKMLCR   WITH HEADER LINE.
DATALV_DATUM       TYPE  SYST_DATUM .
DATALV_DATUA       TYPE  SYST_DATUM .

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONSS_PWERK  FOR   AFPO-PWERK     MODIF ID C1 .                        "工厂
SELECT-OPTIONSS_AUFNR  FOR   AFPO-AUFNR     MODIF ID C1 .                        "工单号
SELECT-OPTIONSS_MATNR  FOR   AFPO-MATNR     MODIF ID C1 .                        "产品号码
SELECT-OPTIONSS_MATNS  FOR   RESB-MATNR     MODIF ID C1 .                        "子件物料
SELECT-OPTIONSS_EXTWG  FOR   MARA-EXTWG     MODIF ID C1 .                        "系列
SELECT-OPTIONSS_DISPO  FOR   AFKO-DISPO     MODIF ID C1 .                        "MRP控制员
SELECT-OPTIONSS_GLTRP  FOR   AFKO-GLTRP     MODIF ID C1 .                        "工单开始日期
SELECT-OPTIONSS_GSTRP  FOR   AFKO-GSTRP     MODIF ID C1 .                        "结束日期
SELECT-OPTIONSS_FEVOR  FOR   AFKO-FEVOR     MODIF ID C1 .                        "生产管理员
SELECT-OPTIONSS_STAND  FOR   CRHD-STAND     MODIF ID C1 .                        "管理部门成本中心
SELECT-OPTIONSS_LTRMI  FOR   AFPO-LTRMI     MODIF ID C1 .                        "工单实际完成日期
SELECT-OPTIONSS_UDATE  FOR   JCDS-UDATE     MODIF ID C1 .                        "TECO日期
SELECT-OPTIONSS_TXT04  FOR   TJ30T-TXT04    MODIF ID C1 DEFAULT 'ZINI'.          "自定义用户状态
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
  COMMENT 1(20TEXT-SYS FOR FIELD P_SYST1    MODIF ID C1,
  POSITION 33.
PARAMETERS:
  P_SYST1 LIKE TJ02T-TXT04                    MODIF ID C1,
  P_SYSH1 LIKE JEST-STAT                      NO-DISPLAY.
SELECTION-SCREEN
  POSITION 46.
PARAMETERS:
  P_EXCL1   LIKE RCOSA-EXCL1                  MODIF ID C1.
SELECTION-SCREEN:
  COMMENT 40(5TEXT-EXC FOR FIELD P_EXCL1    MODIF ID C1,
  COMMENT 52(3TEXT-AND FOR FIELD P_SYST2    MODIF ID C1,
    POSITION 58.
PARAMETERS:
  P_SYST2 LIKE TJ02T-TXT04                    MODIF ID C1,
  P_SYSH2 LIKE JEST-STAT                      NO-DISPLAY.
SELECTION-SCREEN
    POSITION 71.
PARAMETERS:
  P_EXCL2   LIKE RCOSA-EXCL1                  MODIF ID C1.
SELECTION-SCREEN:
    COMMENT 65(5TEXT-EXC FOR FIELD P_EXCL2  MODIF ID C1.
SELECTION-SCREEN END   OF LINE.
PARAMETERS:
  P_SELID  LIKE TJ48T-SELID                   NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.
*PARAMETERS: P_1 RADIOBUTTON GROUP GP1,
*            P_2 RADIOBUTTON GROUP GP1.
PARAMETERSCH_01 AS CHECKBOX DEFAULT ''MODIF ID C1.
PARAMETERSCH_02 AS CHECKBOX DEFAULT ''MODIF ID C1.
PARAMETERSCH_03 AS CHECKBOX DEFAULT ''MODIF ID C1.
SELECTION-SCREEN END OF BLOCK B2.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
  IF CH_02 IS NOT INITIAL AND CH_03 IS NOT INITIAL.
    MESSAGE '只显示超领数据 / 只显示领料数小于计划数 只能选其一!TYPE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  DATALV_CKMLHD TYPE CKMLHD.
  DATALV_MBEW   TYPE MBEW.
  DATALV_COST   TYPE COST.
  DATALV_CSSL   TYPE CSSL.
  DATAGT_CKMLCR TYPE TABLE OF CKMLCR WITH HEADER LINE.
  DATA:LTS_OBJNR TYPE TYP_TS_AUFNR_OBJNR.
  DATA:LINE TYPE BSVX-STTXT.
  DATA:GS_AFKO TYPE AFKO.
  DATAMATNR_L TYPE MATNR.
  DATAGT_JSTO   TYPE TABLE OF JSTO  WITH HEADER LINE.
  DATAGT_JEST   TYPE TABLE OF JEST  WITH HEADER LINE.
  DATAGT_TJ30   TYPE TABLE OF TJ30  WITH HEADER LINE.
  DATAGT_TJ30T  TYPE TABLE OF TJ30T WITH HEADER LINE.
  DATAGT_MARM   TYPE TABLE OF MARM WITH HEADER LINE.
  DATAFLAG      TYPE C.
* APPEND STATUS TO IMPORTED TABLE FOR HEADER SELECTION
  PERFORM FILL_STATUS_TABLE
          
TABLES STATUS_HDR_TAB
          
USING  P_SYST1
                 P_SYSH1
                 P_EXCL1
                 P_SYST2
                 P_SYSH2
                 P_EXCL2
                 
.

  CLEAR LTS_OBJNR[] .
  SELECT AUFNR OBJNR FROM AUFK
         
INTO CORRESPONDING FIELDS OF TABLE LTS_OBJNR[]
           
WHERE WERKS IN S_PWERK
             
AND AUFNR IN S_AUFNR
            
.

  IF STATUS_HDR_TAB[] IS NOT INITIAL.
    PERFORM REDUCE_AUFNR_OBJNR_BY_STATUS
            
TABLES STATUS_HDR_TAB
            
USING  P_SELID
            
CHANGING LTS_OBJNR[].
  ENDIF.

  IF LTS_OBJNR[] IS NOT INITIAL.
*    IF P_1 IS NOT INITIAL.
    CLEAR GT_DATA_HEAD[].
    SELECT
      AFPO~PWERK
      AFPO
~VERID
      AFPO
~AUFNR
      AFPO
~MATNR
      AFPO
~MEINS
      AFPO
~PSMNG
      AFPO
~WEMNG
      AUFK
~AUART
      AUFK
~OBJNR
      MARA
~EXTWG
      AFKO
~FEVOR
      AFKO
~GSTRI
      AFKO
~GLTRI
      AFKO
~AUFPL
    
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_HEAD[]
      
FROM AFPO
      INNER 
JOIN AFKO ON AFPO~AUFNR AFKO~AUFNR
      INNER 
JOIN MARA ON AFPO~MATNR MARA~MATNR
      INNER 
JOIN AUFK ON AFPO~AUFNR AUFK~AUFNR
      
FOR ALL ENTRIES IN LTS_OBJNR[]
      
WHERE AFPO~AUFNR  LTS_OBJNR-AUFNR
        
AND AFPO~PWERK IN S_PWERK
        
AND AFPO~AUFNR IN S_AUFNR
        
AND AFPO~MATNR IN S_MATNR
        
AND AFPO~LTRMI IN S_LTRMI
        
AND AFKO~DISPO IN S_DISPO
        
AND AFKO~GLTRP IN S_GLTRP
        
AND AFKO~GSTRP IN S_GSTRP
        
AND AFKO~FEVOR IN S_FEVOR
        
AND MARA~EXTWG IN S_EXTWG
        
.

*------------------------------------------------------------------------------
*      自定义用户状态
*------------------------------------------------------------------------------
    LOOP AT S_TXT04.
      TRANSLATE S_TXT04-LOW TO UPPER CASE.
      TRANSLATE S_TXT04-HIGH TO UPPER CASE.
      MODIFY S_TXT04 .
    ENDLOOP.

    LOOP AT GT_DATA_HEAD.

      CLEAR FLAG .
*         OBJNR   TYPE  AUFK-OBJNR,                        "对象号
*         STTXT   TYPE  BSVX-STTXT,                        "工单状态
*         ZTTXT   TYPE  BSVX-STTXT,                        "自定义用户状态

      CLEAR GT_JSTO .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GT_JSTO FROM JSTO
        
WHERE OBJNR GT_DATA_HEAD-OBJNR
          
.
      CLEAR GT_JEST[] .
      SELECT INTO CORRESPONDING FIELDS OF TABLE GT_JEST[] FROM JEST
        
WHERE OBJNR GT_DATA_HEAD-OBJNR
          
AND INACT ''
          .
      IF GT_JEST[] IS NOT INITIAL.
        CLEAR GT_TJ30[] .
        SELECT INTO CORRESPONDING FIELDS OF TABLE GT_TJ30[] FROM TJ30
          
FOR ALL ENTRIES IN GT_JEST[]
          
WHERE ESTAT GT_JEST-STAT
            
AND STSMA GT_JSTO-STSMA
            
.
      ENDIF.
      IF GT_TJ30[] IS NOT INITIAL.
        LOOP AT GT_TJ30.
          SELECT SINGLE INTO CORRESPONDING FIELDS OF GT_TJ30T FROM TJ30T
            
WHERE STSMA GT_TJ30-STSMA
              
AND ESTAT GT_TJ30-ESTAT
*            AND SPRAS = 1
              .

          IF GT_TJ30T-TXT04 NOT IN S_TXT04.
            FLAG 'X'.
            EXIT .
          ELSE .
            IF GT_DATA_HEAD-ZTTXT IS INITIAL.
              GT_DATA_HEAD-ZTTXT GT_TJ30T-TXT04 .
            ELSE .
              GT_DATA_HEAD-ZTTXT GT_DATA_HEAD-ZTTXT && '&& GT_TJ30T-TXT04 .
            ENDIF.
          ENDIF.

          CLEAR GT_TJ30 .
          CLEAR GT_TJ30T .
        ENDLOOP.
      ELSE .

        IF S_TXT04 IS NOT INITIAL.
          FLAG 'X'.
        ENDIF.
      ENDIF.

*  DATA: GT_JSTO   TYPE TABLE OF JSTO WITH HEADER LINE.
*  DATA: GT_JEST   TYPE TABLE OF JEST WITH HEADER LINE.

      IF FLAG IS INITIAL.
        MODIFY GT_DATA_HEAD .
      ELSE .
        DELETE GT_DATA_HEAD .
      ENDIF.

      CLEAR GT_DATA_HEAD .
    ENDLOOP.
*------------------------------------------------------------------------------
*      自定义用户状态
*------------------------------------------------------------------------------


    LOOP AT GT_DATA_HEAD.
      SELECT SINGLE MAKTX INTO GT_DATA_HEAD-MAKTX FROM MAKT
        
WHERE MATNR GT_DATA_HEAD-MATNR
        
.

*取工单状态文本
      CLEAR LINE .
      CALL FUNCTION 'STATUS_TEXT_EDIT'
        EXPORTING
          CLIENT           SY-MANDT
          OBJNR            
GT_DATA_HEAD-OBJNR
          SPRAS            
SY-LANGU
        
IMPORTING
          LINE             LINE
        EXCEPTIONS
          OBJECT_NOT_FOUND 1
                             OTHERS.      "
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.

      SEARCH LINE FOR 'CLSD'.
      IF SY-SUBRC 0.
        GT_DATA_HEAD-STTXT '订单已关闭'.
      ELSE.
        GT_DATA_HEAD-STTXT LINE .
      ENDIF.

*工单TECO日期:
*如果工单状态含有TECO,则通过对象号 AFUK-OBJNR 到表 JCDS 取出 INACT 激活状态为空,
*状态码为 I0045 并按日期倒排排序,其中第一条数据的日期 UDATE 即为工单TECO日期
      IF GT_DATA_HEAD-STTXT CS 'TECO'.
        SELECT SINGLE MAXUDATE INTO GT_DATA_HEAD-UDATE FROM JCDS
          
WHERE OBJNR GT_DATA_HEAD-OBJNR
            
AND STAT 'I0045'
            .
      ENDIF.

      SELECT SINGLE EWBEZ INTO GT_DATA_HEAD-VTEXT FROM TWEWT
        
WHERE EXTWG GT_DATA_HEAD-EXTWG
         
.

      GT_DATA_HEAD-CLR 'C310'.
      GT_DATA_HEAD-FLAG 'X'.

*        SELECT SINGLE FEVOR INTO GT_DATA_HEAD-FEVOR FROM MARC
*          WHERE MATNR = GT_DATA_HEAD-MATNR
*            AND WERKS = GT_DATA_HEAD-PWERK
*            .
      SELECT SINGLE TXT INTO GT_DATA_HEAD-TXT FROM T024F
        
WHERE WERKS GT_DATA_HEAD-PWERK
          
AND FEVOR GT_DATA_HEAD-FEVOR
          
.

*最后一道工序
      CLEAR GS_AFKO .
      SELECT SINGLE AUFPL INTO CORRESPONDING FIELDS OF GS_AFKO FROM AFKO
        
WHERE AUFNR GT_DATA_HEAD-AUFNR
        
.

*      SELECT MAX( AFVC~VORNR ) INTO GT_DATA_HEAD-VORNR FROM AFVC
*        WHERE AFVC~AUFPL = GS_AFKO-AUFPL
*        .

*报工数
      CLEAR GT_AFVC[].
      SELECT INTO CORRESPONDING FIELDS OF TABLE GT_AFVC[] FROM AFVC
        
WHERE AFVC~AUFPL GS_AFKO-AUFPL
        
.

      SORT GT_AFVC[] BY VORNR DESCENDING .
      READ TABLE GT_AFVC INDEX .

      GT_DATA_HEAD-VORNR GT_AFVC-VORNR .
      GT_DATA_HEAD-ARBID GT_AFVC-ARBID .

      CLEAR GT_CRHD[].
      SELECT INTO TABLE GT_CRHD[] FROM CRHD
        
FOR ALL ENTRIES IN GT_AFVC[]
        
WHERE OBJTY  =  'A'
          AND OBJID  =  GT_AFVC-ARBID
          
AND WERKS  =  GT_AFVC-WERKS
          
AND BEGDA <=  SY-DATUM
          
AND ENDDA >=  SY-DATUM
          
.

      IF GT_CRHD[] IS NOT INITIAL.
        CLEAR GT_T499S[].
        SELECT
          T499S~STAND
        
INTO CORRESPONDING FIELDS OF TABLE GT_T499S[]
          
FROM ADRC
          INNER 
JOIN T499S ON ADRC~ADDRNUMBER T499S~ADDRNUM
          
FOR ALL ENTRIES IN GT_CRHD[]
          
WHERE T499S~WERKS =  GT_CRHD-WERKS
            
AND T499S~STAND =  GT_CRHD-STAND
            
AND ADRC~SORT1  <> 'PUBLIC'
            .
        READ TABLE GT_T499S INDEX .
        GT_DATA_HEAD-STAND GT_T499S-STAND .
      ENDIF.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  GT_DATA_HEAD-STAND
        
IMPORTING
          OUTPUT GT_DATA_HEAD-STAND.

      SELECT SINGLE KTEXT INTO GT_DATA_HEAD-STEXT FROM CSKT
        
WHERE KOSTL =  GT_DATA_HEAD-STAND
          
AND SPRAS =  SY-LANGU
          
.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
        EXPORTING
          INPUT  GT_DATA_HEAD-STAND
        
IMPORTING
          OUTPUT GT_DATA_HEAD-STAND.

      CLEAR GT_AFRU[] .
      SELECT GMNGA INTO CORRESPONDING FIELDS OF TABLE GT_AFRU[] FROM AFRU
        
WHERE AUFNR GT_DATA_HEAD-AUFNR
          
AND VORNR GT_DATA_HEAD-VORNR
          
AND STOKZ ''
          AND STZHL ''
          .
      CLEAR GT_DATA_HEAD-GMNGA .
      LOOP AT GT_AFRU.
        GT_DATA_HEAD-GMNGA GT_DATA_HEAD-GMNGA + GT_AFRU-GMNGA .
        CLEAR GT_AFRU .
      ENDLOOP.

      CLEAR GT_CKMLCR[] .
      SELECT
      CKMLCR~KALNR
      CKMLCR
~BDATJ
      CKMLCR
~POPER
      CKMLCR
~UNTPER
      CKMLCR
~CURTP
      CKMLCR
~STPRS
      CKMLCR
~PVPRS
      CKMLCR
~VPRSV
      CKMLCR
~PEINH
      
INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR[]
      
FROM CKMLCR
      INNER 
JOIN CKMLHD ON CKMLCR~KALNR CKMLHD~KALNR
        
WHERE CKMLHD~MATNR  GT_DATA_HEAD-MATNR
          
AND CKMLHD~BWKEY  GT_DATA_HEAD-PWERK
          
.

      IF GT_DATA_HEAD-UDATE IS NOT INITIAL .
        LV_DATUM GT_DATA_HEAD-UDATE .
      ELSE .
        LV_DATUM SY-DATUM .
      ENDIF.

      LOOP AT GT_CKMLCR.
        LV_DATUA GT_CKMLCR-BDATJ && GT_CKMLCR-POPER .
        IF LV_DATUA(6> LV_DATUM.
          DELETE GT_CKMLCR .
        ENDIF.
        CLEAR GT_CKMLCR .
      ENDLOOP.

      SORT GT_CKMLCR[] BY BDATJ DESCENDING POPER DESCENDING .
      READ TABLE GT_CKMLCR INDEX .
      GT_DATA_HEAD-STPRS GT_CKMLCR-STPRS .
      GT_DATA_HEAD-VERPR GT_CKMLCR-PVPRS .
      GT_DATA_HEAD-VPRSV GT_CKMLCR-VPRSV .
      GT_DATA_HEAD-PEINH GT_CKMLCR-PEINH .

      IF GT_DATA_HEAD-VPRSV 'V'.
*        GT_DATA_HEAD-STPRS = GT_DATA_HEAD-ZPLP1 .
        GT_DATA_HEAD-STPRS GT_DATA_HEAD-VERPR .
      ENDIF.

*         FEVOR     TYPE  MARC-FEVOR,                      "生产管理员
*         TXT       TYPE  T024F-TXT,                       "生产管理员描述

      MODIFY GT_DATA_HEAD .
      CLEAR GT_DATA_HEAD .
      CLEAR GT_CKMLCR.
    ENDLOOP.

    DELETE GT_DATA_HEAD[] WHERE UDATE NOT IN S_UDATE .


*    ENDIF.
    IF GT_DATA_HEAD[] IS NOT INITIAL.
      CLEAR GT_DATA_ITEM[].
      SELECT
        AFPO~PWERK
        AFPO
~VERID
        AFPO
~AUFNR
        AFPO
~MATNR
        AFPO
~PSMNG
*      AFPO~WEMNG
        AUFK~AUART
        AUFK
~OBJNR
        MARA
~EXTWG
        RESB
~MATNR AS MATNR_SUB
        RESB
~MEINS
        RESB
~AUSCH
        RESB
~BDMNG
        RESB
~RGEKZ
        RESB
~RSNUM
        RESB
~RSPOS
        RESB
~FMENG
        RESB
~SHKZG
        RESB
~STLNR
        RESB
~WERKS
        RESB
~ERFME
        RESB
~ERFMG
        RESB
~RSART
        AFKO
~FEVOR
      
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_ITEM[]
        
FROM AFPO
        INNER 
JOIN AFKO ON AFPO~AUFNR AFKO~AUFNR
        INNER 
JOIN MARA ON AFPO~MATNR MARA~MATNR
        INNER 
JOIN AUFK ON AFPO~AUFNR AUFK~AUFNR
        INNER 
JOIN RESB ON AFPO~AUFNR RESB~AUFNR
        
FOR ALL ENTRIES IN GT_DATA_HEAD[]
        
WHERE AFPO~AUFNR  GT_DATA_HEAD-AUFNR
          
AND AFPO~PWERK  GT_DATA_HEAD-PWERK
          
AND AFPO~MATNR  GT_DATA_HEAD-MATNR
          
AND AFPO~LTRMI IN S_LTRMI
          
AND AFKO~DISPO IN S_DISPO
          
AND AFKO~GLTRP IN S_GLTRP
          
AND AFKO~GSTRP IN S_GSTRP
          
AND AFKO~FEVOR IN S_FEVOR
          
AND MARA~EXTWG IN S_EXTWG
          
AND RESB~MATNR IN S_MATNS
          
AND RESB~XLOEK '' OR RESB~ENMNG <> '0.000')

*          AND RESB~MATNR = 'H218-1-P067.A000.X4'

*        AND RESB~MATNR = 'RP-PA648-023.A001-T'
          .
    ENDIF.

    DELETE GT_DATA_ITEM[] WHERE MATNR_SUB CS '-FU' .

    CLEAR GT_DATA_ITEM_A[].
    LOOP AT GT_DATA_ITEM WHERE MATNR_SUB CS '-XO'
                            OR MATNR_SUB CS '-X0'.
      SELECT SINGLE STLNR INTO GT_DATA_ITEM_A-STLNR FROM MAST
        
WHERE MATNR GT_DATA_ITEM-MATNR_SUB
          
AND WERKS GT_DATA_ITEM-WERKS
          
.
      APPEND GT_DATA_ITEM_A .
      CLEAR GT_DATA_ITEM_A .
      DELETE GT_DATA_ITEM .
      CLEAR GT_DATA_ITEM .
    ENDLOOP.

    LOOP AT GT_DATA_ITEM.
      READ TABLE GT_DATA_ITEM_A WITH KEY STLNR GT_DATA_ITEM-STLNR .
      IF SY-SUBRC 0.
        DELETE GT_DATA_ITEM .
      ENDIF.
      CLEAR GT_DATA_ITEM .
    ENDLOOP.

    GT_DATA_ITEM_C[] GT_DATA_ITEM[].
    SORT GT_DATA_ITEM_C[] BY AUFNR MATNR_SUB RSPOS FMENG .
    DELETE ADJACENT DUPLICATES FROM GT_DATA_ITEM_C[] COMPARING AUFNR MATNR_SUB.

    LOOP AT GT_DATA_ITEM_C.

*计划外发料数量
      CLEAR GT_MSEG[] .
      SELECT
        MSEG~MENGE
        MSEG
~RSNUM
        MSEG
~RSPOS
        MSEG
~BWART
        MSEG
~AUFNR
        MSEG
~MBLNR
        
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
        
FROM MSEG
*        INNER JOIN MATDOC
*        ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
        WHERE MSEG~BWART IN '261','262' )
*          AND VGART_MKPF = 'WA'
*          AND RSNUM = ''
          AND MSEG~MATNR GT_DATA_ITEM_C-MATNR_SUB
          
AND MSEG~AUFNR GT_DATA_ITEM_C-AUFNR
*          AND MSEG~RSART = GT_DATA_ITEM_C-RSART
*          AND MATDOC~CANCELLED =  ''
*          AND MATDOC~SMBLN =  ''
          .

      CLEAR GT_DATA_ITEM_C-MENGE_J .
      LOOP AT GT_MSEG WHERE RSNUM '' AND BWART '261'.
        GT_DATA_ITEM_C-MENGE_J GT_DATA_ITEM_C-MENGE_J + GT_MSEG-MENGE .
        CLEAR GT_MSEG .
      ENDLOOP.

      CLEAR GT_DATA_ITEM_C-MENGE_T .
      LOOP AT GT_MSEG WHERE RSNUM '' AND BWART '262'.
        GT_DATA_ITEM_C-MENGE_T GT_DATA_ITEM_C-MENGE_T + GT_MSEG-MENGE .
        CLEAR GT_MSEG .
      ENDLOOP.

      MODIFY GT_DATA_ITEM_C.
      CLEAR GT_DATA_ITEM_C .
    ENDLOOP.

    LOOP AT GT_DATA_ITEM.

      SELECT SINGLE MAKTX INTO GT_DATA_ITEM-MAKTX FROM MAKT
        
WHERE MATNR GT_DATA_ITEM-MATNR
        
.
      SELECT SINGLE MAKTX INTO GT_DATA_ITEM-MAKTX_SUB FROM MAKT
        
WHERE MATNR GT_DATA_ITEM-MATNR_SUB
        
.

      CLEAR GT_DATA_HEAD .
      READ TABLE GT_DATA_HEAD WITH KEY
                                AUFNR GT_DATA_ITEM-AUFNR
                                PWERK 
GT_DATA_ITEM-PWERK
                                MATNR 
GT_DATA_ITEM-MATNR
                                
.

*      IF GT_DATA_ITEM-MATNR_SUB = 'KW0103-20.A001'.
*        BREAK-POINT .
*      ENDIF.
*      IF GT_DATA_HEAD-UDATE IS NOT INITIAL AND GT_DATA_HEAD-UDATE(6) <> SY-DATUM(6).

      CLEAR GT_CKMLCR[] .
      SELECT
      CKMLCR~KALNR
      CKMLCR
~BDATJ
      CKMLCR
~POPER
      CKMLCR
~UNTPER
      CKMLCR
~CURTP
      CKMLCR
~STPRS
      CKMLCR
~PVPRS
      CKMLCR
~VPRSV
      CKMLCR
~PEINH
      
INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR[]
      
FROM CKMLCR
      INNER 
JOIN CKMLHD ON CKMLCR~KALNR CKMLHD~KALNR
        
WHERE CKMLHD~MATNR  GT_DATA_ITEM-MATNR_SUB
          
AND CKMLHD~BWKEY  GT_DATA_ITEM-WERKS
          
.

      IF GT_DATA_HEAD-UDATE IS NOT INITIAL .
        LV_DATUM GT_DATA_HEAD-UDATE .
        GT_DATA_ITEM-UDATE GT_DATA_HEAD-UDATE .
      ELSE .
        LV_DATUM SY-DATUM .
      ENDIF.



      LOOP AT GT_CKMLCR.
        LV_DATUA GT_CKMLCR-BDATJ && GT_CKMLCR-POPER .
        IF LV_DATUA(6> LV_DATUM.
          DELETE GT_CKMLCR .
        ENDIF.
        CLEAR GT_CKMLCR .
      ENDLOOP.

      SORT GT_CKMLCR[] BY BDATJ DESCENDING POPER DESCENDING .
      READ TABLE GT_CKMLCR INDEX .
      GT_DATA_ITEM-STPRS GT_CKMLCR-STPRS .
      GT_DATA_ITEM-VERPR GT_CKMLCR-PVPRS .
      GT_DATA_ITEM-VPRSV GT_CKMLCR-VPRSV .
      GT_DATA_ITEM-PEINH GT_CKMLCR-PEINH .

      IF GT_DATA_ITEM-VPRSV 'V'.
*        GT_DATA_ITEM-STPRS = GT_DATA_ITEM-ZPLP1 .
        GT_DATA_ITEM-STPRS GT_DATA_ITEM-VERPR .
      ENDIF.
      CLEAR GT_CKMLCR.

      GT_DATA_ITEM-STAND GT_DATA_HEAD-STAND .
      GT_DATA_ITEM-STEXT GT_DATA_HEAD-STEXT .

* a)判断基本单位RESB- MEINS(也就是报表单位这一列的值 )   工单用料单位RESB- ERFME不一致时:
*    取出工单需求数RESB-ERFMG;
*    从表MARM根据子件编码+工单用料单位RESB- ERFME 取数计数器MARM-UMREZ  分母 MARM-UMREN;
*     计划数量 =  (工单需求数RESB-ERFMG * 计数器MARM-UMREZ)除以 分母 MARM-UMREN
*
* b) 如两个单位一致时:
*     计划数量 =  工单需求数RESB-ERFMG

      IF GT_DATA_ITEM-MEINS GT_DATA_ITEM-ERFME.
        GT_DATA_ITEM-BDMNG GT_DATA_ITEM-ERFMG .
      ELSE.
        CLEAR GT_MARM.
        SELECT SINGLE UMREZ UMREN INTO CORRESPONDING FIELDS OF GT_MARM FROM MARM
          
WHERE MATNR GT_DATA_ITEM-MATNR_SUB
            
AND MEINH GT_DATA_ITEM-ERFME.
        IF SY-SUBRC AND GT_MARM-UMREN <> 0.
          GT_DATA_ITEM-BDMNG GT_DATA_ITEM-ERFMG * GT_MARM-UMREZ / GT_MARM-UMREN.
        ENDIF.
      ENDIF.

*MARM-UMREZ  分母 MARM-UMREN;

      IF GT_DATA_ITEM-SHKZG 'S'.
        GT_DATA_ITEM-BDMNG GT_DATA_ITEM-BDMNG * -.
      ENDIF.

      IF GT_DATA_ITEM-AUART 'ZPP2' AND GT_DATA_ITEM-MATNR GT_DATA_ITEM-MATNR_SUB .
        GT_DATA_ITEM-AUSCH 0.
      ENDIF.

*不含损耗率的子件数量
      IF 100 + GT_DATA_ITEM-AUSCH <> 0.
        GT_DATA_ITEM-BOMYL GT_DATA_ITEM-BDMNG / ( ( 100 + GT_DATA_ITEM-AUSCH 100 ) .
      ELSE .
        GT_DATA_ITEM-BOMYL GT_DATA_ITEM-BDMNG.
      ENDIF.


*BOM的标准用量
      CLEAR GT_DATA_HEAD .
      READ TABLE GT_DATA_HEAD WITH KEY PWERK GT_DATA_ITEM-PWERK AUFNR GT_DATA_ITEM-AUFNR .
      IF GT_DATA_HEAD-PSMNG <> 0.
        GT_DATA_ITEM-BOMBZ GT_DATA_ITEM-BOMYL / GT_DATA_HEAD-PSMNG .
      ENDIF.

*BOMYL 计算逻辑 在原基础上 乘以(交货数量WEMNG/工单数量PSMNG.
      IF GT_DATA_ITEM-PSMNG <> 0.
        GT_DATA_ITEM-BOMYL GT_DATA_ITEM-BOMYL * GT_DATA_HEAD-WEMNG / GT_DATA_HEAD-PSMNG .
      ENDIF.

      IF GT_DATA_ITEM-SHKZG <> 'S'.

*预留发料数量
        CLEAR GT_MSEG[] .
        SELECT
          MSEG~MENGE
          MSEG
~AUFNR
          MSEG
~MBLNR
          
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
          
FROM MSEG
*          INNER JOIN MATDOC
*          ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
          WHERE MSEG~BWART '261'
            AND MSEG~RSNUM GT_DATA_ITEM-RSNUM
            
AND MSEG~RSPOS GT_DATA_ITEM-RSPOS
            
AND MSEG~MATNR GT_DATA_ITEM-MATNR_SUB
            
AND MSEG~AUFNR GT_DATA_ITEM-AUFNR
            
AND MSEG~RSART GT_DATA_ITEM-RSART
*            AND MATDOC~CANCELLED =  ''
*            AND MATDOC~SMBLN =  ''
            .

*        SELECT T1~MENGE,T1~MJAHR,T1~ZEILE
*          INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
*          FROM MSEG AS T1
*          WHERE T1~BWART = '261'
*            AND T1~RSNUM = GT_DATA_ITEM-RSNUM
*            AND T1~RSPOS = GT_DATA_ITEM-RSPOS
*            AND T1~MATNR = GT_DATA_ITEM-MATNR_SUB
*            AND T1~AUFNR = GT_DATA_ITEM-AUFNR
*           AND NOT EXISTS ( SELECT * FROM MSEG AS T2
*                             WHERE T2~SJAHR = T1~MJAHR
*                               AND T2~SMBLN = T1~MBLNR
*                               AND T2~SMBLP = T1~ZEILE ).

        CLEAR GT_DATA_ITEM-MENGE_J .
        LOOP AT GT_MSEG .
          GT_DATA_ITEM-MENGE_J GT_DATA_ITEM-MENGE_J + GT_MSEG-MENGE .
          CLEAR GT_MSEG .
        ENDLOOP.

*退料数量
        CLEAR GT_MSEG[] .
        SELECT
          MSEG~MENGE
          MSEG
~AUFNR
          MSEG
~MBLNR
          
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
          
FROM MSEG
*          INNER JOIN MATDOC
*          ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
          WHERE MSEG~BWART '262'
            AND MSEG~RSNUM GT_DATA_ITEM-RSNUM
            
AND MSEG~RSPOS GT_DATA_ITEM-RSPOS
            
AND MSEG~MATNR GT_DATA_ITEM-MATNR_SUB
            
AND MSEG~AUFNR GT_DATA_ITEM-AUFNR
            
AND MSEG~RSART GT_DATA_ITEM-RSART
*            AND MATDOC~CANCELLED =  ''
*            AND MATDOC~SMBLN = ''
            .
        LOOP AT GT_MSEG.
          GT_DATA_ITEM-MENGT GT_DATA_ITEM-MENGT + GT_MSEG-MENGE .
          CLEAR GT_MSEG .
        ENDLOOP.

*计划外合并
        READ TABLE GT_DATA_ITEM_C WITH KEY
              AUFNR GT_DATA_ITEM-AUFNR
              MATNR_SUB 
GT_DATA_ITEM-MATNR_SUB
              RSPOS 
GT_DATA_ITEM-RSPOS
              
.

        CLEAR GT_DATA_ITEM-MENGE .
        IF SY-SUBRC 0.
          GT_DATA_ITEM-MENGE_J GT_DATA_ITEM-MENGE_J + GT_DATA_ITEM_C-MENGE_J.
          GT_DATA_ITEM-MENGT   GT_DATA_ITEM-MENGT + GT_DATA_ITEM_C-MENGE_T.
          GT_DATA_ITEM-MENGE   GT_DATA_ITEM_C-MENGE_J GT_DATA_ITEM_C-MENGE_T .
        ENDIF.

      ELSE .

*预留发料数量
        CLEAR GT_MSEG[] .
        SELECT MSEG~MENGE
          
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
          
FROM MSEG
*          INNER JOIN MATDOC
*          ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
          WHERE MSEG~BWART '532'
*            AND RSNUM = GT_DATA_ITEM-RSNUM
*            AND RSPOS = GT_DATA_ITEM-RSPOS
            AND MSEG~MATNR GT_DATA_ITEM-MATNR_SUB
            
AND MSEG~AUFNR GT_DATA_ITEM-AUFNR
            
AND MSEG~RSART GT_DATA_ITEM-RSART
*            AND MATDOC~CANCELLED =  ''
*            AND MATDOC~SMBLN =  ''
            .
        CLEAR GT_DATA_ITEM-MENGE_J .
        LOOP AT GT_MSEG .
          GT_DATA_ITEM-MENGE_J GT_DATA_ITEM-MENGE_J + GT_MSEG-MENGE .
          CLEAR GT_MSEG .
        ENDLOOP.

*退料数量
        CLEAR GT_MSEG[] .
        SELECT MSEG~MENGE
          
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
          
FROM MSEG
*          INNER JOIN MATDOC
*          ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
          WHERE MSEG~BWART '531'
*            AND RSNUM = GT_DATA_ITEM-RSNUM
*            AND RSPOS = GT_DATA_ITEM-RSPOS
            AND MSEG~MATNR GT_DATA_ITEM-MATNR_SUB
            
AND MSEG~AUFNR GT_DATA_ITEM-AUFNR
            
AND MSEG~RSART GT_DATA_ITEM-RSART
*            AND MATDOC~CANCELLED =  ''
*            AND MATDOC~SMBLN =  ''
            .
        LOOP AT GT_MSEG.
          GT_DATA_ITEM-MENGT GT_DATA_ITEM-MENGT + GT_MSEG-MENGE .
          CLEAR GT_MSEG .
        ENDLOOP.
      ENDIF.


      DATA LV_AFKO TYPE AFKO .
      DATA LV_AFVC TYPE AFVC .
      DATA LV_CRHD TYPE CRHD .
      CLEAR AFKO .
      SELECT SINGLE INTO LV_AFKO FROM AFKO
        
WHERE AUFNR GT_DATA_ITEM-AUFNR
        
.

      CLEAR LV_AFVC .
      SELECT SINGLE INTO LV_AFVC FROM AFVC
        
WHERE AUFPL LV_AFKO-AUFPL
        
.

      CLEAR LV_CRHD .
      SELECT SINGLE INTO LV_CRHD FROM CRHD
        
WHERE OBJID LV_AFVC-ARBID
        
.

*实发数量(发料数量 - 退料数量)
      GT_DATA_ITEM-ZSFSL GT_DATA_ITEM-MENGE_J GT_DATA_ITEM-MENGT .

*发放差异(实际VS 计划)
      GT_DATA_ITEM-ZFFCY GT_DATA_ITEM-ZSFSL GT_DATA_ITEM-BDMNG .

*差异比例
      IF GT_DATA_ITEM-BDMNG <> 0.
        GT_DATA_ITEM-ZCYBL  GT_DATA_ITEM-ZFFCY * 100 / GT_DATA_ITEM-BDMNG  .
        GT_DATA_ITEM-ZCYBLT GT_DATA_ITEM-ZCYBL && '%' .
      ENDIF.

*产值
*      GT_DATA_ITEM-ZGDCZ = GT_DATA_ITEM-PSMNG * GT_DATA_ITEM-STPRS / GT_DATA_ITEM-PEINH.

      IF LV_CRHD-ARBPL <> 'H001S'.
*实际子件报废数量
        GT_DATA_ITEM-SZJBS GT_DATA_ITEM-ZSFSL GT_DATA_ITEM-BOMYL .
      ENDIF.

*标准报废数
      GT_DATA_ITEM-BZBFS GT_DATA_ITEM-AUSCH * '0.01' * GT_DATA_ITEM-BOMYL .

      IF GT_DATA_ITEM-SZJBS <= GT_DATA_ITEM-BZBFS.
*正常报废数
        GT_DATA_ITEM-ZCBFS GT_DATA_ITEM-SZJBS .
      ELSE .
*正常报废数
        GT_DATA_ITEM-ZCBFS GT_DATA_ITEM-BZBFS .
*异常报废数
        GT_DATA_ITEM-YCBFS GT_DATA_ITEM-SZJBS GT_DATA_ITEM-BZBFS .
      ENDIF.

      IF LV_CRHD-ARBPL 'H001S'.
        CLEAR GT_DATA-ZCBFS .
        CLEAR GT_DATA-YCBFS .
      ENDIF.


*正常报废金额
      GT_DATA_ITEM-ZCBFJ GT_DATA_ITEM-ZCBFS * GT_DATA_ITEM-STPRS / GT_DATA_ITEM-PEINH.
*      IF GT_DATA_ITEM-ZCBFJ < 0.
*        CLEAR GT_DATA_ITEM-ZCBFJ .
*      ENDIF.
*异常报废金额
      GT_DATA_ITEM-YCBFJ GT_DATA_ITEM-YCBFS * GT_DATA_ITEM-STPRS / GT_DATA_ITEM-PEINH.
*      IF GT_DATA_ITEM-YCBFJ < 0.
*        CLEAR GT_DATA_ITEM-YCBFJ .
*      ENDIF.
*报废金额小计
      GT_DATA_ITEM-BFJEJ GT_DATA_ITEM-ZCBFJ + GT_DATA_ITEM-YCBFJ .

*正常报废率-产值计
*      IF GT_DATA_ITEM-ZGDCZ <> 0.
*        GT_DATA_ITEM-ZCBFL = GT_DATA_ITEM-ZCBFJ / GT_DATA_ITEM-ZGDCZ .
*      ENDIF.

*异常报废率-产值计
*      IF GT_DATA_ITEM-ZGDCZ <> 0.
*        GT_DATA_ITEM-YCBFL = GT_DATA_ITEM-YCBFJ / GT_DATA_ITEM-ZGDCZ .
*      ENDIF.

*      IF GT_DATA_ITEM-SZJBS < 0.
*        CLEAR GT_DATA_ITEM-SZJBS .
*      ENDIF.
*实际子件报废率-数量计
      IF GT_DATA_ITEM-BOMYL <> 0.

        IF GT_DATA_ITEM-AUART 'ZPP2' AND GT_DATA_ITEM-MATNR GT_DATA_ITEM-MATNR_SUB .
          GT_DATA_ITEM-SZJBF .
          GT_DATA_ITEM-AUSCHT .
        ELSE.
          GT_DATA_ITEM-SZJBF GT_DATA_ITEM-SZJBS * 100 / GT_DATA_ITEM-BOMYL .
          GT_DATA_ITEM-AUSCHT GT_DATA_ITEM-AUSCH && '%' .
        ENDIF.

        GT_DATA_ITEM-SZJBFT GT_DATA_ITEM-SZJBF && '%' .

      ENDIF.

      SELECT SINGLE EWBEZ INTO GT_DATA_ITEM-VTEXT FROM TWEWT
        
WHERE EXTWG GT_DATA_ITEM-EXTWG
         
.

      IF GT_DATA_ITEM-SHKZG 'S'.
        CLEAR GT_DATA_ITEM-MENGT .
      ENDIF.

*      GT_DATA_ITEM-AUSCHT = GT_DATA_ITEM-AUSCH && '%' .

*      SELECT SINGLE FEVOR INTO GT_DATA_ITEM-FEVOR FROM MARC
*        WHERE MATNR = GT_DATA_ITEM-MATNR
*          AND WERKS = GT_DATA_ITEM-PWERK
*          .
      SELECT SINGLE TXT INTO GT_DATA_ITEM-TXT FROM T024F
        
WHERE WERKS GT_DATA_ITEM-PWERK
          
AND FEVOR GT_DATA_ITEM-FEVOR
          
.

      MODIFY GT_DATA_ITEM .
      CLEAR GT_DATA_ITEM .
    ENDLOOP.

*炮筒料处理
    DELETE GT_DATA_ITEM[] WHERE FMENG IS NOT INITIAL AND ZSFSL IS INITIAL .

*    LOOP AT GT_DATA_HEAD.
*      CLEAR GT_DATA_HEAD-BFJEJ.
*      CLEAR GT_DATA_HEAD-ZCBFJ.
*      CLEAR GT_DATA_HEAD-YCBFJ.
*      CLEAR GT_DATA_HEAD-ZGDCZ.
*      LOOP AT GT_DATA_ITEM WHERE PWERK = GT_DATA_HEAD-PWERK AND MATNR = GT_DATA_HEAD-MATNR AND AUFNR = GT_DATA_HEAD-AUFNR.
*        GT_DATA_HEAD-BFJEJ = GT_DATA_HEAD-BFJEJ + GT_DATA_ITEM-BFJEJ .
*        GT_DATA_HEAD-ZCBFJ = GT_DATA_HEAD-ZCBFJ + GT_DATA_ITEM-ZCBFJ .
*        GT_DATA_HEAD-YCBFJ = GT_DATA_HEAD-YCBFJ + GT_DATA_ITEM-YCBFJ .
**        GT_DATA_HEAD-ZGDCZ = GT_DATA_HEAD-ZGDCZ + GT_DATA_ITEM-ZGDCZ .
*        CLEAR GT_DATA_ITEM .
*      ENDLOOP.
*
**产值:交货数量 * 单价 / 价格单位
*      GT_DATA_HEAD-ZGDCZ = GT_DATA_HEAD-WEMNG * GT_DATA_HEAD-STPRS / GT_DATA_HEAD-PEINH .
*
**正常报废率-产值计
*      IF GT_DATA_HEAD-ZGDCZ <> 0.
*        GT_DATA_HEAD-ZCBFL = GT_DATA_HEAD-ZCBFJ * 100 / GT_DATA_HEAD-ZGDCZ .
*        GT_DATA_HEAD-ZCBFL_T = GT_DATA_HEAD-ZCBFL && '%' .
*      ENDIF.
*
**异常报废率-产值计
*      IF GT_DATA_HEAD-ZGDCZ <> 0.
*        GT_DATA_HEAD-YCBFL = GT_DATA_HEAD-YCBFJ * 100 / GT_DATA_HEAD-ZGDCZ .
*        GT_DATA_HEAD-YCBFL_T = GT_DATA_HEAD-YCBFL && '%' .
*      ENDIF.
*
*      MODIFY GT_DATA_HEAD .
*      CLEAR GT_DATA_HEAD .
*    ENDLOOP.

    CLEAR GT_DATA[] .
*    IF P_1 IS NOT INITIAL.
*      APPEND LINES OF GT_DATA_HEAD[] TO GT_DATA[] .
    APPEND LINES OF GT_DATA_ITEM[] TO GT_DATA[] .
    SORT GT_DATA[] BY PWERK MATNR AUFNR FLAG DESCENDING .
*    ELSE .
*      SORT GT_DATA_ITEM[] BY EXTWG .
*      APPEND LINES OF GT_DATA_ITEM[] TO GT_DATA[] .
*      DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING EXTWG.
*
*      LOOP AT GT_DATA.
*        CLEAR GT_DATA-GMNGA .
*        CLEAR GT_DATA-WEMNG .
*        CLEAR GT_DATA-SZJBS .
*        CLEAR GT_DATA-ZCBFS .
*        CLEAR GT_DATA-YCBFS .
*        CLEAR GT_DATA-BFJEJ .
*        CLEAR GT_DATA-ZCBFJ .
*        CLEAR GT_DATA-YCBFJ .
*        CLEAR GT_DATA-ZGDCZ .
*        CLEAR GT_DATA-BOMYL .
*        CLEAR GT_DATA-BDMNG .
*        CLEAR GT_DATA-MENGE .
*        CLEAR GT_DATA-MENGT .
*        CLEAR GT_DATA-ZSFSL .
*        CLEAR GT_DATA-ZFFCY .
*        CLEAR GT_DATA-ZCBFL .
*        CLEAR GT_DATA-ZCBFL_T.
*        CLEAR GT_DATA-YCBFL .
*        CLEAR GT_DATA-YCBFL_T.
*        CLEAR GT_DATA-SZJBF .
*        CLEAR GT_DATA-SZJBFT .
*        CLEAR GT_DATA-ZCYBL .
*        CLEAR GT_DATA-ZCYBLT .
*        CLEAR GT_DATA-PSMNG .
*
*        LOOP AT GT_DATA_ITEM WHERE EXTWG = GT_DATA-EXTWG.
*
*          GT_DATA-GMNGA =  GT_DATA-GMNGA + GT_DATA_ITEM-GMNGA.
*          GT_DATA-SZJBS =  GT_DATA-SZJBS + GT_DATA_ITEM-SZJBS.
*          GT_DATA-ZCBFS =  GT_DATA-ZCBFS + GT_DATA_ITEM-ZCBFS.
*          GT_DATA-YCBFS =  GT_DATA-YCBFS + GT_DATA_ITEM-YCBFS.
*          GT_DATA-BFJEJ =  GT_DATA-BFJEJ + GT_DATA_ITEM-BFJEJ.
**          GT_DATA-ZCBFJ =  GT_DATA-ZCBFJ + GT_DATA_ITEM-ZCBFJ.
**          GT_DATA-YCBFJ =  GT_DATA-YCBFJ + GT_DATA_ITEM-YCBFJ.
**          GT_DATA-ZGDCZ =  GT_DATA-ZGDCZ + GT_DATA_ITEM-ZGDCZ.
*          GT_DATA-BOMYL =  GT_DATA-BOMYL + GT_DATA_ITEM-BOMYL.
*          GT_DATA-BDMNG =  GT_DATA-BDMNG + GT_DATA_ITEM-BDMNG.
*          GT_DATA-MENGE =  GT_DATA-MENGE + GT_DATA_ITEM-MENGE.
*          GT_DATA-MENGT =  GT_DATA-MENGT + GT_DATA_ITEM-MENGT.
*          GT_DATA-ZSFSL =  GT_DATA-ZSFSL + GT_DATA_ITEM-ZSFSL.
*          GT_DATA-ZFFCY =  GT_DATA-ZFFCY + GT_DATA_ITEM-ZFFCY.
*
*          CLEAR GT_DATA_ITEM .
*        ENDLOOP.
*
*        LOOP AT GT_DATA_HEAD WHERE EXTWG = GT_DATA-EXTWG .
*          GT_DATA-WEMNG = GT_DATA-WEMNG + GT_DATA_HEAD-WEMNG .
*          GT_DATA-PSMNG = GT_DATA-PSMNG + GT_DATA_HEAD-PSMNG .
*          GT_DATA-ZCBFJ = GT_DATA-ZCBFJ + GT_DATA_HEAD-ZCBFJ .
*          GT_DATA-YCBFJ = GT_DATA-YCBFJ + GT_DATA_HEAD-YCBFJ .
*          GT_DATA-ZGDCZ = GT_DATA-ZGDCZ + GT_DATA_HEAD-ZGDCZ .
*        ENDLOOP.
*
*        GT_DATA-ZITEM = '   ' .
*
**正常报废率-产值计
*        IF GT_DATA-ZGDCZ <> 0.
*          GT_DATA-ZCBFL = GT_DATA-ZCBFJ * 100 / GT_DATA-ZGDCZ .
*          GT_DATA-ZCBFL_T = GT_DATA-ZCBFL && '%' .
*        ENDIF.
*
**异常报废率-产值计
*        IF GT_DATA-ZGDCZ <> 0.
*          GT_DATA-YCBFL = GT_DATA-YCBFJ * 100 / GT_DATA-ZGDCZ .
*          GT_DATA-YCBFL_T = GT_DATA-YCBFL && '%' .
*        ENDIF.
*
**实际子件报废率-数量计
*        IF GT_DATA-BOMYL <> 0.
*
*          IF GT_DATA-AUART = 'ZPP2' AND GT_DATA-MATNR = GT_DATA-MATNR_SUB .
*            GT_DATA-SZJBF = 0 .
*          ELSE.
*            GT_DATA-SZJBF = GT_DATA-SZJBS * 100 / GT_DATA-BOMYL .
*          ENDIF.
*
*          GT_DATA-SZJBFT = GT_DATA-SZJBF && '%' .
*        ENDIF.
*
**差异比例
*        IF GT_DATA-BDMNG <> 0.
*          GT_DATA-ZCYBL = GT_DATA-ZFFCY * 100 / GT_DATA-BDMNG  .
*          GT_DATA-ZCYBLT = GT_DATA-ZCYBL && '%' .
*        ENDIF.
*
*        MODIFY GT_DATA .
*        CLEAR GT_DATA .
*      ENDLOOP.
*
*    ENDIF.

    LOOP AT GT_DATA   .
      IF GT_DATA-AUART 'ZPP2'.
        CLEAR GT_DATA-ZGDCZ.
      ENDIF.


*ZPPR015字段子件项目号CKMLHD-MATNR +“子件工厂CKMLHD-BWKEY得到KALNR
*再以KALNR+"工单TECO日期">=OPERCKMLCR得到最近价格CKMLCR-STPRSCKMLCR-STPRS除以CKMLCR-PEINH算出单个价格
*如果上述都取价失败,取MBEW-VERPR移动均价;


      CLEAR LV_CKMLHD .
      SELECT SINGLE INTO LV_CKMLHD FROM CKMLHD
        
WHERE MATNR GT_DATA-MATNR_SUB
          
AND BWKEY GT_DATA-WERKS
          
.

      CLEAR GT_CKMLCR[] .
      SELECT INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR FROM CKMLCR
        
WHERE KALNR  LV_CKMLHD-KALNR
          
AND BDATJ <= GT_DATA-UDATE(4)
          AND POPER <= GT_DATA-UDATE+4(2)
          .

      SORT GT_CKMLCR[] BY BDATJ DESCENDING POPER DESCENDING .
      READ TABLE GT_CKMLCR INDEX .

      GT_DATA-ZJHDJ GT_CKMLCR-STPRS / GT_CKMLCR-PEINH .

      IF GT_DATA-ZJHDJ IS INITIAL .
        CLEAR LV_MBEW .
        SELECT SINGLE INTO LV_MBEW FROM MBEW
          
WHERE MATNR  GT_DATA-MATNR_SUB
            
AND BWKEY  GT_DATA-WERKS
            
AND ZPLD1 <= GT_DATA-UDATE
            
.
        IF LV_MBEW-ZPLP1 IS NOT INITIAL .
          GT_DATA-ZJHDJ LV_MBEW-VERPR.
        ENDIF.
      ENDIF.

      IF GT_DATA-MATNR_SUB IS NOT INITIAL.
*    目标成本=目标用量(不含废品率)*(1+损耗率基准)*单价
        GT_DATA-SOLLKOST  GT_DATA-BOMYL * + GT_DATA-AUSCH * GT_DATA-ZJHDJ .
*    目标成本(不含废品率)=目标用量(不含废品率)*单价
        GT_DATA-SOLLKOSTL GT_DATA-BOMYL * GT_DATA-ZJHDJ .
      ENDIF.

      SELECT SINGLE MTART INTO GT_DATA-MTART FROM MARA
        
WHERE MATNR GT_DATA-MATNR_SUB
        
.

*      'PWERK'      '工厂',
*      'AUFNR'      '工单号',
*      'VERID'      '生产版本',
*      'EXTWG'      '系列',
*      'VTEXT'      '系列描述',
*      'MATNR'      '成品项目号',
*      'MAKTX'      '项目号说明',
*      'FEVOR'      '生产管理员',
*      'TXT'        '生产管理员描述',
*      'RSNUM'      '预留号',
*      'RSPOS'      '预留项目',
*      'FMENG'      '固定数量',
*      'MATNR_SUB'  '子件项目号',
*      'MAKTX_SUB'  '子件项目号说明',
*      'WERKS'      '子件工厂',
*      'MEINS'      '单位',
*      'PSMNG'      '工单数量',
*      'WEMNG'      '交货数量',
*      'GSTRI'      '工单第一次报工日期',
*      'GLTRI'      '工单入库完成日期',
*      'UDATE'      '工单TECO日期',
*
**      'GMNGA'      '确认数量',
**      'STPRS'      '单价',
**      'PEINH'      '价格单位',
*      'ZCBFL_T'    '正常报废率-产值计',
*      'YCBFL_T'    '异常报废率-产值计',
*      'SZJBFT'     '实际子件报废率-数量计',
*      'SZJBS'      '实际子件报废数量',
*      'ZCBFS'      '正常报废数',
*      'YCBFS'      '异常报废数',
*      'BFJEJ'      '报废金额小计',
*      'ZCBFJ'      '正常报废金额',
*      'YCBFJ'      '异常报废金额',
*      'ZGDCZ'      '产值',
*      'AUSCHT'     '损耗率基准',
*      'BOMYL'      '目标用量(不含废品率)',
*      'BOMBZ'      '各子件用量(不含废品率)',
*      'BDMNG'      '计划数量',
*      'MENGE'      '超领数量(实际VS 计划)',
*      'MENGT'      '退料数量',
*      'ZSFSL'      '实发数量',
*      'ZFFCY'      '发放差异(实际VS 计划)',
*      'ZCYBLT'     '差异比例',
*      'STTXT'      '工单状态',
*      'ZTTXT'      '自定义用户状态',
*      'RGEKZ'      '反冲',
*      'AUART'      '工单类型',
*      'ZADD1'      '原因分析',
*      'ZADD2'      '改善措施',
*      'ZADD3'      'CAR编号',
*      'STAND'      '单号-管理部门成本中心',
*      'STEXT'      '管理部门',
*      'ZADD4'      '责任人',
*      'ZADD5'      '担当人',
*      'FLAG'       '抬头行'.



      MODIFY GT_DATA .
      CLEAR GT_DATA .
    ENDLOOP.

  ENDIF.

  DELETE GT_DATA[] WHERE STAND NOT IN S_STAND .

  IF CH_01 IS NOT INITIAL.
    DELETE GT_DATA[] WHERE MTART <> 'Z004' .
  ENDIF.

  IF CH_02 IS NOT INITIAL.
    DELETE GT_DATA[] WHERE MENGE <= .
  ENDIF.

  IF CH_03 IS NOT INITIAL.
    DELETE GT_DATA[] WHERE MENGE >= .
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FILL_STATUS_TABLE
*&---------------------------------------------------------------------*
FORM FILL_STATUS_TABLE TABLES   STATUS_TAB STRUCTURE STATUS_HDR_TAB
                       
USING    SYST1      LIKE TJ02T-TXT04
                                SYSH1      
LIKE JEST-STAT
                                EXCL1      
LIKE RCOSA-EXCL1
                                SYST2      
LIKE TJ02T-TXT04
                                SYSH2      
LIKE JEST-STAT
                                EXCL2      
LIKE RCOSA-EXCL1.
  DATA STATUS_TMP LIKE STATUS_HDR_TAB.

* Append status from selection screen to imported status table
  IF NOT SYSH1 IS INITIAL.
    STATUS_TMP-STAT SYSH1.
    STATUS_TMP-EXCL EXCL1.
    COLLECT STATUS_TMP INTO STATUS_TAB.
  ELSEIF NOT SYST1 IS INITIAL.
    CALL FUNCTION 'STATUS_TEXT_CONVERSION'
      EXPORTING
        LANGUAGE           SY-LANGU
        TXT04              
SYST1
      
IMPORTING
        STATUS_NUMBER      STATUS_TMP-STAT
      
EXCEPTIONS
        INSUFFICIENT_INPUT 1
        NOT_FOUND          2
        OBJECT_NOT_FOUND   3
        WRONG_MODE         4
        OTHERS             5.
    IF SY-SUBRC EQ 0.
      STATUS_TMP-EXCL EXCL1.
      COLLECT STATUS_TMP INTO STATUS_TAB.
    ENDIF.
  ENDIF.
  IF NOT SYSH2 IS INITIAL.
    STATUS_TMP-STAT SYSH2.
    STATUS_TMP-EXCL EXCL2.
    COLLECT STATUS_TMP INTO STATUS_TAB.
  ELSEIF NOT SYST2 IS INITIAL.
    CALL FUNCTION 'STATUS_TEXT_CONVERSION'
      EXPORTING
        LANGUAGE           SY-LANGU
        TXT04              
SYST2
      
IMPORTING
        STATUS_NUMBER      STATUS_TMP-STAT
      
EXCEPTIONS
        INSUFFICIENT_INPUT 1
        NOT_FOUND          2
        OBJECT_NOT_FOUND   3
        WRONG_MODE         4
        OTHERS             5.
    IF SY-SUBRC EQ 0.
      STATUS_TMP-EXCL EXCL2.
      COLLECT STATUS_TMP INTO STATUS_TAB.
    ENDIF.
  ENDIF.
ENDFORM.                               " FILL_STATUS_TABLE
*&---------------------------------------------------------------------*
*&      Form  REDUCE_AUFNR_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
FORM REDUCE_AUFNR_OBJNR_BY_STATUS
     
TABLES   STATUS_TAB STRUCTURE STATUS_HDR_TAB
     
USING    SELID      LIKE P_SELID
     
CHANGING CTS_OBJNR  TYPE TYP_TS_OBJNR.

* Statusobjekte
  DATA:
    OBJNR_TAB LIKE JSTO_PRE OCCURS WITH HEADER LINE.
  FIELD-SYMBOLS:
    <LS_OBJNR> TYPE TYP_S_OBJNR.

  CHECK NOT SELID        IS INITIAL
  OR    NOT STATUS_TAB[] IS INITIAL.
* preread
  LOOP AT CTS_OBJNR[] ASSIGNING <LS_OBJNR>.
    OBJNR_TAB-OBJNR <LS_OBJNR>-OBJNR.
    APPEND OBJNR_TAB.
  ENDLOOP.
  CALL FUNCTION 'STATUS_PRE_READ'
    TABLES
      JSTO_PRE_TAB OBJNR_TAB.

  DATA OBJECTS_DELETED.
  PERFORM REDUCE_OBJNR_BY_STATUS
          
TABLES   OBJNR_TAB
                   STATUS_TAB
          
USING    SELID
          
CHANGING OBJECTS_DELETED.

  IF OBJECTS_DELETED YX.
* Alle Aufträge entfernen, deren OBJNR nicht mehr in der Tabelle
* OBJNR_TAB enthalten ist.
    IF OBJNR_TAB[] IS INITIAL.
      REFRESH CTS_OBJNR[].
    ELSE.
      SORT OBJNR_TAB BY OBJNR.
      LOOP AT CTS_OBJNR[] ASSIGNING <LS_OBJNR>.
        READ TABLE OBJNR_TAB
             
WITH KEY OBJNR <LS_OBJNR>-OBJNR
             
BINARY SEARCH.
        IF SY-SUBRC <> 0.
          DELETE CTS_OBJNR[].
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFORM.                               " REDUCE_AUFNR_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
*&      Form  REDUCE_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
FORM REDUCE_OBJNR_BY_STATUS
     
TABLES   OBJNR_TAB  STRUCTURE OBJNR_TAB
              STATUS_TAB 
STRUCTURE STATUS_HDR_TAB
     
USING    SELID      LIKE P_SELID
     
CHANGING OBJECTS_DELETED.
  DATA OBJNR_CNT LIKE SY-DBCNT.

  CLEAR OBJECTS_DELETED.
  CHECK NOT OBJNR_TAB[]  IS INITIAL.
  DESCRIBE TABLE OBJNR_TAB LINES OBJNR_CNT.
* Statusprüfung gegen Status in Statustabelle
  LOOP AT STATUS_TAB.
    IF OBJNR_TAB[] IS INITIAL.
      EXIT.
    ELSE.
* Alle Objektnummern, bei denen der geforderte Status (nicht) sitzt,
* werden aus der Tabelle OBJNR_TAB gelöscht.
      CALL FUNCTION 'STATUS_CHECK_MULTI'
        EXPORTING
          STATUS      STATUS_TAB-STAT
          FLG_EXCLUDE 
STATUS_TAB-EXCL
        
TABLES
          OBJECTS     OBJNR_TAB.
    ENDIF.
  ENDLOOP.
* Statusprüfung gegen das Selektionsschema
  IF NOT SELID IS INITIAL.
    LOOP AT OBJNR_TAB.
      DATA FLG_STATUS_OK TYPE C.       "Statusprüfung OK
      CALL FUNCTION 'STATUS_CHECK_BY_SELSCHEM'
        EXPORTING
          OBJNR          OBJNR_TAB-OBJNR
          SELID          
SELID
        
IMPORTING
          FULLFILL       FLG_STATUS_OK
        
EXCEPTIONS
          NO_STAT_SCHEME 01
          NO_STAT_TAB    02.
      IF  SY-SUBRC      IS INITIAL
      AND FLG_STATUS_OK IS INITIAL.
        DELETE OBJNR_TAB.
      ENDIF.
    ENDLOOP.
  ENDIF.

  DESCRIBE TABLE OBJNR_TAB LINES SY-DBCNT.
  IF SY-DBCNT <> OBJNR_CNT.
    OBJECTS_DELETED YX.
  ENDIF.
ENDFORM.                               " REDUCE_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
*&      Form  val_req_status
*&---------------------------------------------------------------------*
*       F4-Help to select system status by text, providing also code
*----------------------------------------------------------------------*
*      -->I_DYNPF    Name of dynpro field
*      -->C_TXT04    Status short text
*      -->C_STAT     Status code
*----------------------------------------------------------------------*
FORM VAL_REQ_STATUS USING    I_DYNPF
                    
CHANGING C_TXT04 LIKE TJ02T-TXT04
                             C_STAT  
LIKE JEST-STAT.

  TYPESBEGIN OF TY_VALUE,
           ISTAT TYPE J_ISTAT,
           TXT04 TYPE J_TXT04,
           TXT30 TYPE J_TXT30,
         END OF TY_VALUE.

  DATAL_VALUE   TYPE DYNFIELDVALUE,
        L_REPID   TYPE SY-REPID,
        LS_DYNP   TYPE DYNPREAD,
        LS_TJ02   TYPE TJ02,
        LS_VALUE  TYPE TJ02T,
        LS_RETURN TYPE DDSHRETVAL,
        LT_DYNP   TYPE STANDARD TABLE OF DYNPREAD,
        LT_TJ02   TYPE STANDARD TABLE OF TJ02,
        LT_VALUE  TYPE STANDARD TABLE OF TJ02T,
        LT_RETURN TYPE STANDARD TABLE OF DDSHRETVAL.

* personal value key
  DATAL_PVALKEY TYPE DDSHPVKEY.

* Get current value from screen
  LS_DYNP-FIELDNAME I_DYNPF.
  APPEND LS_DYNP TO LT_DYNP.
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME     SY-REPID
      DYNUMB     
SY-DYNNR
    
TABLES
      DYNPFIELDS LT_DYNP
    
EXCEPTIONS
      OTHERS     0.
  READ TABLE LT_DYNP INTO LS_DYNP INDEX 1.

* Get all possible values
  SELECT FROM TJ02 INTO TABLE LT_TJ02
                     
WHERE NODIS SPACE.
  IF LT_TJ02 IS NOT INITIAL.
    SELECT FROM TJ02T INTO TABLE LT_VALUE
                      
FOR ALL ENTRIES IN LT_TJ02
                      
WHERE ISTAT LT_TJ02-ISTAT
                        
AND SPRAS SY-LANGU.
  ENDIF.
  IF LINESLT_TJ02 <> LINESLT_VALUE ).
*   Not all status available in current language, try in german
*   as in FORM value_state(saplcoss)
    LOOP AT LT_TJ02 INTO LS_TJ02.
      READ TABLE LT_VALUE INTO LS_VALUE WITH KEY ISTAT LS_TJ02-ISTAT.
      CHECK SY-SUBRC <> 0.
      SELECT SINGLE FROM TJ02T INTO LS_VALUE
                          
WHERE ISTAT LS_TJ02-ISTAT
                            
AND SPRAS 'D'.
      IF SY-SUBRC 0.
        APPEND LS_VALUE TO LT_VALUE.
      ENDIF.
    ENDLOOP.
  ENDIF.
  SORT LT_VALUE BY ISTAT.

* Call own F4-help, not showing internal status number
  L_VALUE LS_DYNP-FIELDVALUE.
  L_REPID 'PPIO_ENTRY'.
* fill key for personal value list
  L_PVALKEY SY-UNAME.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      DDIC_STRUCTURE   'TJ02T'
      RETFIELD         'TXT04'
      PVALKEY          L_PVALKEY
      
VALUE            L_VALUE
      VALUE_ORG        
'S'
      CALLBACK_PROGRAM L_REPID
      CALLBACK_FORM    
'VAL_REQ_STATUS_CALLBACK'
    TABLES
      VALUE_TAB        LT_VALUE
      RETURN_TAB       
LT_RETURN.

* Get selectect value and internal status number
  READ TABLE LT_RETURN INTO LS_RETURN WITH KEY FIELDNAME 'ISTAT'.
  IF SY-SUBRC 0.
    READ TABLE LT_VALUE WITH KEY ISTAT LS_RETURN-FIELDVAL
                        
INTO LS_VALUE.
    CHECK SY-SUBRC 0.
    C_TXT04 LS_VALUE-TXT04.
    C_STAT  LS_VALUE-ISTAT.
  ELSE.
    CLEARC_TXT04C_STAT.
  ENDIF.

ENDFORM.                    "val_req_status
*&---------------------------------------------------------------------*
*&      Form  SYSTEM_STATE_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_P_SYCP2  text
*----------------------------------------------------------------------*
FORM SYSTEM_STATE_CHECK
         
USING    I_DIALOG   TYPE FLAG
         
CHANGING C_STATE    LIKE TJ02T-TXT04
                  C_STATE_NR 
LIKE JEST-STAT.

  DATAL_STATE  LIKE C_STATE,
        LS_TJ02T TYPE TJ02T,
        LT_TJ02T TYPE STANDARD TABLE OF TJ02T.

  IF C_STATE IS INITIAL.
    CLEAR C_STATE_NR.
  ENDIF.
  CHECK NOT C_STATE IS INITIAL.

* Get all possible values
  SELECT FROM TJ02T INTO TABLE LT_TJ02T               "#EC CI_GENBUFF
                      WHERE TXT04 C_STATE
                        
AND SPRAS SY-LANGU.
  IF SY-SUBRC <> 0.
*   If not found, try in german
*   (see function module STATUS_TEXT_CONVERSION)
    SELECT FROM TJ02T INTO TABLE LT_TJ02T             "#EC CI_GENBUFF
                        WHERE TXT04 C_STATE
                          
AND SPRAS 'D'.
    IF SY-SUBRC <> 0.
*     If not found, try with uppercase letters
      L_STATE C_STATE.
      TRANSLATE L_STATE TO UPPER CASE.                   "#EC TRANSLANG
      SELECT FROM TJ02T INTO TABLE LT_TJ02T           "#EC CI_GENBUFF
                          WHERE TXT04 L_STATE
                            
AND SPRAS SY-LANGU.
      IF SY-SUBRC <> 0.
*       If not found, try in german
*       (see function module STATUS_TEXT_CONVERSION)
        SELECT FROM TJ02T INTO TABLE LT_TJ02T         "#EC CI_GENBUFF
                            WHERE TXT04 L_STATE
                              
AND SPRAS 'D'.
        IF SY-SUBRC <> 0.
*         If not found, give up with error message
          CLEAR C_STATE_NR.
          MESSAGE E249(BSWITH C_STATE SY-LANGU 'D'.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

* Check if value is unambiguous
  IF LINESLT_TJ02T ) = 1.
*   Take over found values
    READ TABLE LT_TJ02T INTO LS_TJ02T INDEX 1.
    C_STATE =    LS_TJ02T-TXT04.
    C_STATE_NR LS_TJ02T-ISTAT.
  ELSE.
*   Check if internal status number was already provided by F4-help
    IF C_STATE_NR IS NOT INITIAL.
      READ TABLE LT_TJ02T INTO LS_TJ02T WITH KEY ISTAT C_STATE_NR.
      IF SY-SUBRC 0.
*       Internal status number already there, exit
        EXIT.
      ENDIF.
    ENDIF.
*   Value is ambiguous, F4-help must be used
    CLEAR C_STATE_NR.
    IF NOT I_DIALOG IS INITIAL.
      MESSAGE E054(COISWITH C_STATE.
    ENDIF.
  ENDIF.

ENDFORM.                               " SYSTEM_STATE_CHECK
*&---------------------------------------------------------------------*
*& 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-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'
    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 P_1 IS NOT INITIAL.
  FILL_FIELD :
    'PWERK'      '工厂',
    'AUFNR'      '工单号',
    'VERID'      '生产版本',
    'EXTWG'      '系列',
    'VTEXT'      '系列描述',
    'MATNR'      '成品项目号',
    'MAKTX'      '项目号说明',
    'FEVOR'      '生产管理员',
    'TXT'        '生产管理员描述',
    'RSNUM'      '预留号',
    'RSPOS'      '预留项目',
    'FMENG'      '固定数量',
    'MTART'      '子件物料类型',
    'MATNR_SUB'  '子件项目号',
    'MAKTX_SUB'  '子件项目号说明',
    'WERKS'      '子件工厂',
    'MEINS'      '单位',
    'PSMNG'      '工单数量',
    'WEMNG'      '交货数量',
    'GSTRI'      '工单第一次报工日期',
    'GLTRI'      '工单入库完成日期',
    'UDATE'      '工单TECO日期',

*      'GMNGA'      '确认数量',
*      'STPRS'      '单价',
*      'PEINH'      '价格单位',
    'ZCBFL_T'    '正常报废率-产值计',
    'YCBFL_T'    '异常报废率-产值计',
    'SZJBFT'     '实际子件报废率-数量计',
    'SZJBS'      '实际子件报废数量',
    'ZCBFS'      '正常报废数',
    'YCBFS'      '异常报废数',
    'BFJEJ'      '报废金额小计',
    'ZCBFJ'      '正常报废金额',
    'YCBFJ'      '异常报废金额',
    'ZGDCZ'      '产值',
    'AUSCHT'     '损耗率基准',
    'BOMYL'      '目标用量(不含废品率)',
    'BOMBZ'      '各子件用量(不含废品率)',
    'BDMNG'      '计划数量',
    'MENGE'      '超领数量(实际VS 计划)',
    'MENGT'      '退料数量',
    'ZSFSL'      '实发数量',
    'ZFFCY'      '发放差异(实际VS 计划)',
    'ZCYBLT'     '差异比例',
    'STTXT'      '工单状态',
    'ZTTXT'      '自定义用户状态',
    'RGEKZ'      '反冲',
    'AUART'      '工单类型',
    'ZADD1'      '原因分析',
    'ZADD2'      '改善措施',
    'ZADD3'      'CAR编号',
    'STAND'      '单号-管理部门成本中心',
    'STEXT'      '管理部门',
    'ZADD4'      '责任人',
    'ZADD5'      '担当人',

    'SOLLKOST'   '目标成本',
    'SOLLKOSTL'  '目标成本(不含废品率)'.

*      'FLAG'       '抬头行'.
*  ELSE .
*    FILL_FIELD :
*      'ZITEM'      ' ',
*      'EXTWG'      '系列',
*      'VTEXT'      '系列描述',
*      'PSMNG'      '工单数量',
*      'WEMNG'      '交货数量',
**      'GMNGA'      '确认数量',
*      'ZCBFL_T'    '正常报废率-产值计',
*      'YCBFL_T'    '异常报废率-产值计',
*      'SZJBFT'     '实际子件报废率-数量计',
*      'SZJBS'      '实际子件报废数量',
*      'ZCBFS'      '正常报废数',
*      'YCBFS'      '异常报废数',
*      'BFJEJ'      '报废金额小计',
*      'ZCBFJ'      '正常报废金额',
*      'YCBFJ'      '异常报废金额',
*      'ZGDCZ'      '产值',
*      'BOMYL'      '订单BOM用量',
*      'BDMNG'      '计划数量',
*      'MENGE'      '超领数量(实际VS 计划)',
*      'MENGT'      '退料数量',
*      'ZSFSL'      '实发数量',
*      'GSTRI'      '工单第一次报工日期',
*      'GLTRI'      '工单入库完成日期',
*      'UDATE'      '工单TECO日期',
*      'STAND'      '单号-管理部门成本中心',
*      'STEXT'      '管理部门',
*      'ZFFCY'      '发放差异(实际VS 计划)',
*      'SOLLKOST'   '目标成本',
*      'SOLLKOSTL'  '目标成本(不含废品率)',
*      'ZCYBLT'     '差异比例'.
*
*
*  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.
  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'."表示双击
      IF IS_SELFIELD-FIELDNAME =  'AUFNR' .
        CHECK IS_SELFIELD-TABINDEX > 0.
        CLEAR GT_DATA .
        READ TABLE GT_DATA INDEX IS_SELFIELD-TABINDEX.
        SET PARAMETER ID 'ANR' FIELD GT_DATA-AUFNR.
        CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
      ELSE .
        MESSAGE '请选择有效字段!'TYPE 'S' DISPLAY LIKE 'W'.
      ENDIF .
    WHEN 'POST_T'.
  ENDCASE.

  CALL METHOD REF->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.
ENDFORM.

INITIALIZATION .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SYST1.
  PERFORM VAL_REQ_STATUS USING 'P_SYST1' CHANGING P_SYST1 P_SYSH1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SYST2.
  PERFORM VAL_REQ_STATUS USING 'P_SYST2' CHANGING P_SYST2 P_SYSH2.

AT SELECTION-SCREEN ON P_SYST1.
  PERFORM SYSTEM_STATE_CHECK USING    YX
                             
CHANGING P_SYST1
                                      P_SYSH1
.

AT SELECTION-SCREEN ON P_SYST2.
  PERFORM SYSTEM_STATE_CHECK USING    YX
                             
CHANGING P_SYST2
                                      P_SYSH2
.

AT SELECTION-SCREEN.
  PERFORM SCREEN_SETTING.

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值