ABAP开发笔记——2019.07.16

*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2019-06-26
*& Program Type        :  Report
*& Description         :  物料报废成本报表
*&---------------------------------------------------------------------*
REPORT ZMMR115 DEFINING DATABASE IOC.
*&---------------------------------------------------------------------*
*& 包含               YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:AFPO,MARA,EKET,AFKO.

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,                      "工单号
         MATNR     TYPE  AFPO-MATNR,                      "成品项目号
         MEINS     TYPE  AFPO-MEINS,                      "单位
         MEINS_SUB TYPE  RESB-MEINS,                      "子件单位
         PSMNG     TYPE  AFPO-PSMNG,                      "工单数量
         PRDHA     TYPE  MARA-PRDHA,                      "系列
         MAKTX     TYPE  MAKT-MAKTX,                      "项目号说明
         MATNR_SUB TYPE  RESB-MATNR,                      "子件项目号
         MAKTX_SUB TYPE  MAKT-MAKTX,                      "子件项目号说明
         GMNGA     TYPE  AFRU-GMNGA,                      "完工数量
         STPRS     TYPE  MBEW-STPRS,                      "取标准价格
         VERPR     TYPE  MBEW-VERPR,                      "取移动平均价格

         ZCBFL     TYPE  MBEW-STPRS,                      "正常报废率
         YCBFL     TYPE  MBEW-STPRS,                      "异常报废率
         SZJBF     TYPE  MSEG-MENGE,                      "实际子件报废率
         SZJBS     TYPE  MSEG-MENGE,                      "实际子件报废数量
         ZCBFS     TYPE  MSEG-MENGE,                      "正常报废数
         YCBFS     TYPE  MSEG-MENGE,                      "异常报废数
         BFJEJ     TYPE  MBEW-STPRS,                      "报废金额小计
         ZCBFJ     TYPE  MBEW-STPRS,                      "正常报废金额
         YCBFJ     TYPE  MBEW-STPRS,                      "异常报废金额

         PEINH     TYPE  MBEW-PEINH,                      "价格单位
         VPRSV     TYPE  MBEW-VPRSV,                      "价格控制指示符
         ZGDCZ     TYPE  MBEW-STPRS,                      "产值
         AUSCH     TYPE  RESB-AUSCH,                      "BOM中的损耗率
         BDMNG     TYPE  RESB-BDMNG,                      "需求量
         BOMYL     TYPE  RESB-BDMNG,                      "工单BOM用量
         BOMBZ     TYPE  RESB-BDMNG,                      "BOM的标准用量
         MENGE     TYPE  MSEG-MENGE,                      "计划外发料数量
         MENGT     TYPE  MSEG-MENGE,                      "退料数量
         ZSFSL     TYPE  MSEG-MENGE,                      "实发数量
         ZFFCY     TYPE  MSEG-MENGE,                      "发放差异
         ZCYBL     TYPE  MSEG-MENGE,                      "差异比例
         RGEKZ     TYPE  RESB-RGEKZ,                      "反冲
         AUART     TYPE  AUFK-AUART,                      "工单类型
         ZADD1     TYPE  CHAR10,                          "原因分析
         ZADD2     TYPE  CHAR10,                          "改善措施
         ZADD3     TYPE  CHAR10,                          "CAR编号
         ZADD4     TYPE  CHAR10,                          "责任人
         ZADD5     TYPE  CHAR10,                          "担当人

         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_AFRU      TYPE TABLE OF AFRU     WITH HEADER LINE.
DATAGT_MSEG      TYPE TABLE OF MSEG     WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS:     P_PWERK  TYPE  AFPO-PWERK     MODIF ID C1 OBLIGATORY.              "工厂
SELECT-OPTIONSS_AUFNR  FOR   AFPO-AUFNR     MODIF ID C1 .                        "工单号
SELECT-OPTIONSS_MATNR  FOR   AFPO-MATNR     MODIF ID C1 .                        "产品号码
SELECT-OPTIONSS_PRDHA  FOR   MARA-PRDHA     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_LTRMI  FOR   AFPO-LTRMI     MODIF ID C1 .                        "工单实际完成日期
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.
PARAMETERSP_1 RADIOBUTTON GROUP GP1,
            P_2 RADIOBUTTON GROUP GP1.
SELECTION-SCREEN END OF BLOCK B2.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  DATA:LTS_OBJNR TYPE TYP_TS_AUFNR_OBJNR.

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

  IF STATUS_HDR_TAB[] IS NOT INITIAL.
    CLEAR LTS_OBJNR[] .
    SELECT AUFNR OBJNR FROM AUFK
           
INTO CORRESPONDING FIELDS OF TABLE LTS_OBJNR[]
             
WHERE WERKS  P_PWERK
               
AND AUFNR IN S_AUFNR
              
.

    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
~AUFNR
        AFPO
~MATNR
        AFPO
~MEINS
        AFPO
~PSMNG
        AUFK
~AUART
        MARA
~PRDHA
      
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  P_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~PRDHA IN S_PRDHA
          
.

      LOOP AT GT_DATA_HEAD.
        SELECT SINGLE MAKTX INTO GT_DATA_HEAD-MAKTX FROM MAKT
          
WHERE MATNR GT_DATA_HEAD-MATNR
          
.
        CLEAR GT_AFRU[] .
        SELECT GMNGA INTO CORRESPONDING FIELDS OF TABLE GT_AFRU[] FROM AFRU
          
WHERE AUFNR GT_DATA_HEAD-AUFNR
            
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.
        SELECT SINGLE STPRS VERPR VPRSV PEINH INTO GT_DATA_HEAD-STPRS GT_DATA_HEAD-VERPR GT_DATA_HEAD-VPRSV GT_DATA_HEAD-PEINH FROM MBEW
          
WHERE MATNR GT_DATA_HEAD-MATNR
           
.
        IF GT_DATA_HEAD-VPRSV 'V'.
          GT_DATA_HEAD-STPRS GT_DATA_HEAD-VERPR .
        ENDIF.

        GT_DATA_HEAD-ZGDCZ GT_DATA_HEAD-PSMNG * GT_DATA_HEAD-STPRS .

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

        MODIFY GT_DATA_HEAD .
        CLEAR GT_DATA_HEAD .
      ENDLOOP.
    ENDIF.

    CLEAR GT_DATA_ITEM[].
    SELECT
      AFPO~PWERK
      AFPO
~AUFNR
      AFPO
~MATNR
      AFPO
~PSMNG
      AUFK
~AUART
      MARA
~PRDHA
      RESB
~MATNR AS MATNR_SUB
      RESB
~MEINS
      RESB
~AUSCH
      RESB
~BDMNG
      RESB
~RGEKZ
    
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
      
WHERE AFPO~PWERK  P_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~PRDHA IN S_PRDHA
        
.

    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
        
.
      SELECT SINGLE STPRS VERPR VPRSV PEINH INTO GT_DATA_ITEM-STPRS GT_DATA_ITEM-VERPR GT_DATA_ITEM-VPRSV GT_DATA_ITEM-PEINH FROM MBEW
        
WHERE MATNR GT_DATA_ITEM-MATNR_SUB
        
.
      IF GT_DATA_ITEM-VPRSV 'V'.
        GT_DATA_ITEM-STPRS GT_DATA_ITEM-VERPR .
      ENDIF.

*不含损耗率的子件数量
      IF 100 + GT_DATA_ITEM-AUSCH <> 0.
        GT_DATA_ITEM-BOMYL GT_DATA_ITEM-BDMNG / 100 + GT_DATA_ITEM-AUSCH 100 .
      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.

*计划外发料数量
      CLEAR GT_MSEG[] .
      SELECT MENGE INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[] FROM MSEG
        
WHERE BWART '261'
          AND VGART_MKPF 'WA'
          AND WERKS GT_DATA_ITEM-PWERK
          
AND MATNR GT_DATA_ITEM-MATNR_SUB
          
AND AUFNR GT_DATA_ITEM-AUFNR
          
.
      LOOP AT GT_MSEG.
        GT_DATA_ITEM-MENGE GT_DATA_ITEM-MENGE + GT_MSEG-MENGE .
        CLEAR GT_MSEG .
      ENDLOOP.

*退料数量
      CLEAR GT_MSEG[] .
      SELECT MENGE INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[] FROM MSEG
        
WHERE BWART '262'
          AND WERKS GT_DATA_ITEM-PWERK
          
AND MATNR GT_DATA_ITEM-MATNR_SUB
          
AND AUFNR GT_DATA_ITEM-AUFNR
          
.
      LOOP AT GT_MSEG.
        GT_DATA_ITEM-MENGT GT_DATA_ITEM-MENGT + GT_MSEG-MENGE .
        CLEAR GT_MSEG .
      ENDLOOP.

*实发数量
      GT_DATA_ITEM-ZSFSL GT_DATA_ITEM-BDMNG + GT_DATA_ITEM-MENGE .

*发放差异
      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 / GT_DATA_ITEM-BDMNG .
      ENDIF.

*产值
      GT_DATA_ITEM-ZGDCZ GT_DATA_ITEM-PSMNG * GT_DATA_ITEM-STPRS .

*正常报废数
      GT_DATA_ITEM-ZCBFS GT_DATA_ITEM-AUSCH * GT_DATA_ITEM-BOMYL .

*异常报废数
      GT_DATA_ITEM-YCBFS GT_DATA_ITEM-ZSFSL GT_DATA_ITEM-BDMNG .

*正常报废金额
      GT_DATA_ITEM-ZCBFJ GT_DATA_ITEM-ZCBFS * GT_DATA_ITEM-STPRS .

*异常报废金额
      GT_DATA_ITEM-YCBFJ GT_DATA_ITEM-YCBFS * GT_DATA_ITEM-STPRS .

*报废金额小计
      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.

*实际子件报废数量
      GT_DATA_ITEM-SZJBS GT_DATA_ITEM-ZSFSL GT_DATA_ITEM-BOMYL .

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

      MODIFY GT_DATA_ITEM .
      CLEAR GT_DATA_ITEM .
    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[] BY PRDHA .
      APPEND LINES OF GT_DATA_ITEM[] TO GT_DATA[] .
      DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING PRDHA.

      LOOP AT GT_DATA.
        CLEAR GT_DATA-GMNGA .
        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-YCBFL .
        CLEAR GT_DATA-SZJBF .
        CLEAR GT_DATA-ZCYBL .
        LOOP AT GT_DATA_ITEM WHERE PRDHA GT_DATA-PRDHA.

          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.

        GT_DATA-ZITEM '   .

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

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

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

*差异比例
        IF GT_DATA-BDMNG <> 0.
          GT_DATA-ZCYBL GT_DATA-ZFFCY / GT_DATA-BDMNG .
        ENDIF.

        MODIFY GT_DATA .
        CLEAR GT_DATA .
      ENDLOOP.

    ENDIF.

  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'      '工单号',
      'PRDHA'      '系列',
      'MATNR'      '成品项目号',
      'MAKTX'      '项目号说明',
      'MATNR_SUB'  '子件项目号',
      'MAKTX_SUB'  '子件项目号说明',
      'MEINS'      '单位',
      'PSMNG'      '工单数量',
      'GMNGA'      '完工数量',
      'STPRS'      '单价',
      'PEINH'      '价格单位',
      'ZCBFL'      '正常报废率-产值计',
      'YCBFL'      '异常报废率-产值计',
      'SZJBF'      '实际子件报废率-数量计',
      'SZJBS'      '实际子件报废数量',
      'ZCBFS'      '正常报废数',
      'YCBFS'      '异常报废数',
      'BFJEJ'      '报废金额小计',
      'ZCBFJ'      '正常报废金额',
      'YCBFJ'      '异常报废金额',
      'ZGDCZ'      '产值',
      'AUSCH'      '损耗率基准',
      'BOMYL'      '工单BOM用量',
      'BOMBZ'      '各子件用量',
      'BDMNG'      '计划数量',
      'MENGE'      '超领数量',
      'MENGT'      '退料数量',
      'ZSFSL'      '实发数量',
      'ZFFCY'      '发放差异',
      'ZCYBL'      '差异比例',
      'RGEKZ'      '反冲',
      'AUART'      '工单类型',
      'ZADD1'      '原因分析',
      'ZADD2'      '改善措施',
      'ZADD3'      'CAR编号',
      'ZADD4'      '责任人',
      'ZADD5'      '担当人',
      'FLAG'       '抬头行'.
  ELSE .
    FILL_FIELD :
      'ZITEM'      ' ',
      'PRDHA'      '系列',
      'PSMNG'      '工单数量',
      'ZCBFL'      '正常报废率-产值计',
      'YCBFL'      '异常报废率-产值计',
      'SZJBF'      '实际子件报废率-数量计',
      'SZJBS'      '实际子件报废数量',
      'ZCBFS'      '正常报废数',
      'YCBFS'      '异常报废数',
      'BFJEJ'      '报废金额小计',
      'ZCBFJ'      '正常报废金额',
      'YCBFJ'      '异常报废金额',
      'ZGDCZ'      '产值',
      'BOMYL'      '订单BOM用量',
      'BDMNG'      '计划数量',
      'MENGE'      '超领数量',
      'MENGT'      '退料数量',
      'ZSFSL'      '实发数量',
      'ZFFCY'      '发放差异',
      'ZCYBL'      '差异比例'.

  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'."表示双击
    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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值