代码存档


REPORT  ZCHECK NO STANDARD PAGE HEADING.


*----------------------------------------------------------------------*
* TABLE DECLARATION
*----------------------------------------------------------------------*
TYPE-POOLS:SLIS.
TYPE-POOLS VRM.
INCLUDE <ICON>.
TABLES :
  MKPF,
  MARA,
  ZSCKQH,
  AUFM,
  ZSCRAP,
  SSCRFIELDS.


*&---------------------------------------------------------------------*
* STRUCTURE DECLARATION
*&---------------------------------------------------------------------*
*输出结构
TYPES : BEGIN OF T_STUC,
          BTBHA TYPE ZTBBH,   "台班班号
          CPDDH TYPE AUFNR,   "产品订单号
          YLFT TYPE ZYLFT,    "投入原材料
          HGPZL TYPE ZHGPZL,  "合格品
          DJYPZL TYPE ZDJPZL, "待检品
          BHGPZL TYPE ZBHGPZL,"不合格品
          FGHGP TYPE ZFGP,    "返工合格品
          FGDJP TYPE ZFGP,    "返工待检品
          FGBHGP TYPE ZFGP,   "返工不合格品
          BXFX TYPE ZBXFX,    "波纤
          YUL TYPE ZBXFX,    "余料
          YLCCHJ TYPE ZYLCCHJ,"原料产品产出
          DBCCL TYPE ZCCL,    "成材率
          DBHSL TYPE ZHSL,     "回收率
          DBSHL TYPE ZSHL,     "当班损耗率  "New
          RATE(16) TYPE P DECIMALS 3,"投入产出比
          ICON   TYPE CHAR10,  "错误标示【0.95,1】
          CELLCOLORS TYPE LVC_T_SCOL,"投入产出比单元格错误颜色
          ROWCOLOR TYPE CHAR04, "合计行颜色
          MATNR TYPE MATNR,    "订单产品代码
          MAKTX TYPE MAKTX,    "订单产品名称
          HOURS TYPE RU_ISMNG, "班组出勤总工时
          TIMES TYPE RU_ISMNG, "设备运行时间
          UNITS TYPE CO_ISMNGEH,"时间单位
          AS TYPE ZYLCCHJ,      "小时产量
          PRDHA TYPE PRODH_D,   "产品层次
          VTEXT TYPE BEZEI40,   "层次描述
        END OF T_STUC.


*产品层次物料代码统计
TYPES : BEGIN OF T_PRDHA,
          PRDHA TYPE PRODH_D,  "产品层次
          MATNR TYPE MATNR,    "订单产品代码
          VTEXT TYPE BEZEI40,  "层次描述
          MAKTX TYPE MAKTX,    "订单产品名称
          BTBHA TYPE ZTBBH,   "台班班号
          CPDDH TYPE AUFNR,   "产品订单号
          YLFT TYPE ZYLFT,    "投入原材料
          HGPZL TYPE ZHGPZL,  "合格品
          DJYPZL TYPE ZDJPZL, "待检品
          BHGPZL TYPE ZBHGPZL,"不合格品
          FGHGP TYPE ZFGP,    "返工合格品
          FGDJP TYPE ZFGP,    "返工待检品
          FGBHGP TYPE ZFGP,   "返工不合格品
          BXFX TYPE ZBXFX,    "波纤
          YUL TYPE ZBXFX,    "余料
          YLCCHJ TYPE ZYLCCHJ,"原料产品产出
          DBCCL TYPE ZCCL,    "成材率
          DBHSL TYPE ZHSL,     "回收率
          DBSHL TYPE ZSHL,     "当班损耗率  "New
          RATE(16) TYPE P DECIMALS 3,"投入产出比
          ICON   TYPE CHAR10,  "错误标示【0.95,1】
          ROWCOLOR TYPE CHAR04, "合计行颜色
          HOURS TYPE RU_ISMNG, "班组出勤总工时
          TIMES TYPE RU_ISMNG, "设备运行时间
          UNITS TYPE CO_ISMNGEH,"时间单位
          AS TYPE ZYLCCHJ,      "小时产量
END OF T_PRDHA.


*台班订单统计
TYPES : BEGIN OF T_BTBHA,
          BTBHA TYPE ZTBBH,   "台班班号
          CPDDH TYPE AUFNR,   "产品订单号
          YLFT TYPE ZYLFT,    "投入原材料
          HGPZL TYPE ZHGPZL,  "合格品
          DJYPZL TYPE ZDJPZL, "待检品
          BHGPZL TYPE ZBHGPZL,"不合格品
          FGHGP TYPE ZFGP,    "返工合格品
          FGDJP TYPE ZFGP,    "返工待检品
          FGBHGP TYPE ZFGP,   "返工不合格品
          BXFX TYPE ZBXFX,    "波纤
          YUL TYPE ZBXFX,    "余料
          YLCCHJ TYPE ZYLCCHJ,"原料产品产出
          DBCCL TYPE ZCCL,    "成材率
          DBHSL TYPE ZHSL,     "回收率
          DBSHL TYPE ZSHL,     "当班损耗率  "New
          RATE(16) TYPE P DECIMALS 3,"投入产出比
          ICON   TYPE CHAR10,  "错误标示【0.95,1】
          ROWCOLOR TYPE CHAR04, "合计行颜色
          MATNR TYPE MATNR,    "订单产品代码
          MAKTX TYPE MAKTX,    "订单产品名称
          HOURS TYPE RU_ISMNG, "班组出勤总工时
          TIMES TYPE RU_ISMNG, "设备运行时间
          UNITS TYPE CO_ISMNGEH,"时间单位
          AS TYPE ZYLCCHJ,      "小时产量
  END OF T_BTBHA.


*订单台班统计
TYPES : BEGIN OF T_AUFNR,
          CPDDH TYPE AUFNR,   "产品订单号
          BTBHA TYPE ZTBBH,   "台班班号
          YLFT TYPE ZYLFT,    "投入原材料
          HGPZL TYPE ZHGPZL,  "合格品
          DJYPZL TYPE ZDJPZL, "待检品
          BHGPZL TYPE ZBHGPZL,"不合格品
          FGHGP TYPE ZFGP,    "返工合格品
          FGDJP TYPE ZFGP,    "返工待检品
          FGBHGP TYPE ZFGP,   "返工不合格品
          BXFX TYPE ZBXFX,    "波纤
          YUL TYPE ZBXFX,    "余料
          YLCCHJ TYPE ZYLCCHJ,"原料产品产出
          DBCCL TYPE ZCCL,    "成材率
          DBHSL TYPE ZHSL,     "回收率
          DBSHL TYPE ZSHL,     "当班损耗率  "New
          RATE(16) TYPE P DECIMALS 3,"投入产出比
          ICON   TYPE CHAR10,  "错误标示【0.95,1】
          ROWCOLOR TYPE CHAR04, "合计行颜色
          MATNR TYPE MATNR,    "订单产品代码
          MAKTX TYPE MAKTX,    "订单产品名称
          HOURS TYPE RU_ISMNG, "班组出勤总工时
          TIMES TYPE RU_ISMNG, "设备运行时间
          UNITS TYPE CO_ISMNGEH,"时间单位
          AS TYPE ZYLCCHJ,      "小时产量
END OF T_AUFNR.


*取数结构
TYPES : BEGIN OF T_TAB,
          BKTXT TYPE MKPF-BKTXT , "凭证抬头文本-台班班号
          AUFNR TYPE AUFM-AUFNR , "订单号
          MATNR TYPE AUFM-MATNR , "物料号
          CHARG TYPE AUFM-CHARG , "批号
          BWART TYPE AUFM-BWART , "移动类型(库存管理)
          SHKZG TYPE AUFM-SHKZG , "借方/贷方标识
          MENGE TYPE AUFM-MENGE , "数量
          MEINS TYPE AUFM-MEINS , "基本计量单位
          DMBTR TYPE AUFM-DMBTR , "按本位币计的金额
          WAERS TYPE AUFM-WAERS , "货币码
          MJAHR TYPE AUFM-MJAHR , "物料凭证年度
          MBLNR TYPE AUFM-MBLNR , "物料凭证编号
          ZEILE TYPE AUFM-ZEILE , "物料凭证中的项目
          BUDAT TYPE AUFM-BUDAT , "凭证中的过帐日期
          WERKS TYPE AUFM-WERKS , "工厂
          LGORT TYPE AUFM-LGORT , "库存地点
          SOBKZ TYPE AUFM-SOBKZ , "特殊库存标识
          KDAUF TYPE AUFM-KDAUF , "销售订单数
          KDPOS TYPE AUFM-KDPOS , "销售订单中的项目编号
          RSNUM TYPE AUFM-RSNUM , "预留/相关需求的编号
          RSPOS TYPE AUFM-RSPOS , "预留/相关需求的项目编号
          SAKTO TYPE AUFM-SAKTO , "总帐科目编号
          MAKTX TYPE MAKT-MAKTX , "物料描述(短文本)
          USNAM TYPE MKPF-USNAM , "用户名
          SPRAS TYPE MAKT-SPRAS , "语言代码
          MARK  TYPE CHAR01,      "标志
          REMARK TYPE CHAR10,     "合格标志
          GROUP TYPE CHAR10,      "班组
        END OF T_TAB.


*----------------
*投入原材料     A
*合格品        B
*待检品        C
*不合格品      D
*返工合格品    E
*返工待检品    F
*返工不合格品  G
*波纤         H
*余料         I
*----------------


*物料代码+名称
TYPES : BEGIN OF T_MATERIAL,
          AUFNR TYPE AUFNR,
          MATNR TYPE MATNR,
          MAKTX TYPE MAKTX,
          PRDHA TYPE PRODH_D,
          VTEXT TYPE BEZEI40,
        END OF T_MATERIAL.


*订单确认
TYPES:   BEGIN OF T_AFRU,
           AUFNR TYPE AFRU-AUFNR, "生产订单号
           LTXA1 TYPE AFRU-LTXA1, "台班班号
           BUDAT TYPE AFRU-BUDAT, "记账日期
           LOGRP TYPE AFRU-LOGRP, "班组
           ISM01 TYPE AFRU-ISM01, "机器分摊
           ISM02 TYPE AFRU-ISM02, "人工分摊 -- 即班组出勤工时
           ISM03 TYPE AFRU-ISM03, "用电分摊
         END OF T_AFRU.


*&---------------------------------------------------------------------*
* INTERNAL TABLE DECLARATION
*&---------------------------------------------------------------------*
DATA :
*ALV 字段
      ITAB_CATA_TK  TYPE LVC_T_FCAT,
      I_FCAT TYPE LVC_T_FCAT,
*输出
      I_BTBHA TYPE STANDARD TABLE OF T_STUC,
*查找+处理
      I_DATA TYPE STANDARD TABLE OF T_TAB,
*订单产品规格
      I_SPEC TYPE STANDARD TABLE OF T_MATERIAL,
*订单明细
      I_DETAIL TYPE STANDARD TABLE OF  T_TAB,
*订单确认-- 设备运行时间
      I_CONFIRM TYPE STANDARD TABLE OF T_AFRU.


*&---------------------------------------------------------------------*
* WORK AREA DECLARATION
*&---------------------------------------------------------------------*
DATA :
*输出
      WA_BTBHA TYPE T_STUC,
*单元格颜色设置
      WA_CELLCOLOR TYPE LVC_S_SCOL,
*取数处理
      WA_DATA TYPE T_TAB,
*订单产品规格
      WA_SPEC TYPE T_MATERIAL,
*订单确认
      WA_CONFIRM TYPE T_AFRU.


*&---------------------------------------------------------------------*
* VARIANT DECLARATION
*&---------------------------------------------------------------------*
DATA :
*功能代码
      OK_CODE TYPE SY-UCOMM,
      OK_CODE1 TYPE SY-UCOMM,
* 容器名称
      GV_CNAME TYPE SCRFNAME VALUE 'CONTAINER',
      GV_CNAME1 TYPE SCRFNAME VALUE 'CONTAINER1',
* 容器对象
      GV_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      GV_CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
* ALV对象
      GV_ALV TYPE REF TO CL_GUI_ALV_GRID,
      GV_DETAIL TYPE REF TO CL_GUI_ALV_GRID,
* ALV布局
      GV_LAYOUT TYPE LVC_S_LAYO,
      GV_LAYOUT1 TYPE LVC_S_LAYO,
*投入原材料
      GV_YLFT TYPE ZYLFT,
*合格品
      GV_HGPZL TYPE ZHGPZL,
*待检品
      GV_DJYPZL TYPE ZDJPZL,
*不合格品
      GV_BHGPZL TYPE ZBHGPZL,
*返工合格品
      GV_FGHGP TYPE ZFGP,
*返工待检品
      GV_FGDJP TYPE ZFGP,
*返工不合格品
      GV_FGBHGP TYPE ZFGP,
*波纤
      GV_BXFX TYPE ZBXFX,
*余料
      GV_YUL TYPE ZBXFX,
*开始日期
      GV_START TYPE D,
*结束日期
      GV_FINISH TYPE D.


*&---------------------------------------------------------------------*
* Constant DECLARATION
*&---------------------------------------------------------------------*
CONSTANTS :
          C_RATE(16) TYPE P DECIMALS 3 VALUE '0.95',
          C_SIGN TYPE CHAR02 VALUE '%',
          C_SUS TYPE CHAR03 VALUE 'SUS',
          C_YUL TYPE CHAR04 VALUE '余料',
          C_WEIL TYPE CHAR04 VALUE '尾料',
          C_LASI TYPE CHAR04 VALUE 'φ6.5'.


*----------------------------------------------------------------------*
*       CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_HANDLER DEFINITION .
  PUBLIC SECTION .
    METHODS:
*双击事件
      HANDLE_DOUBLE_CLICK
      FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
      IMPORTING E_ROW E_COLUMN.


*热点事件
    METHODS:
      HANDLE_HOTSPOT_CLICK
      FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
      IMPORTING ES_ROW_NO E_COLUMN_ID .
ENDCLASS.                    "lcl_event_handler DEFINITION


*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_HANDLER IMPLEMENTATION .
*  Handle Double Click
  METHOD HANDLE_DOUBLE_CLICK .
    PERFORM HANDLE_DOUBLE_CLICK USING E_ROW E_COLUMN.
  ENDMETHOD .                    "handle_double_click


* Handle Hotspot Click
  METHOD HANDLE_HOTSPOT_CLICK.
    PERFORM HANDLE_HOTSPOT_CLICK USING  ES_ROW_NO E_COLUMN_ID.
  ENDMETHOD.                    "HANDLE_HOTSPOT_CLICK
ENDCLASS .                    "lcl_event_handler IMPLEMENTATION
DATA : GR_EVENT_HANDLER TYPE REF TO LCL_EVENT_HANDLER.


*&---------------------------------------------------------------------*
* SELECTION SCREEN DECLARATION
*&---------------------------------------------------------------------*
*选择屏幕的定义
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS :
             P_R1 RADIOBUTTON GROUP G1 USER-COMMAND UC,
             P_R2 RADIOBUTTON GROUP G1,
             P_R3 RADIOBUTTON GROUP G1 DEFAULT 'X' ,
             P_R4 RADIOBUTTON GROUP G1,
             P_R5 RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF BLOCK B1.


SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
SELECT-OPTIONS:
                S_WERKS FOR AUFM-WERKS DEFAULT '1201',
                S_MONTH FOR AUFM-BUDAT+0(6) NO-EXTENSION,
*                S_MJAHR FOR AUFM-MJAHR,
                S_BUDAT FOR AUFM-BUDAT.
SELECTION-SCREEN SKIP 1.


SELECT-OPTIONS: S_BTBHA FOR ZSCRAP-REMARK"MKPF-BKTXT
                MATCHCODE OBJECT ZBTBHA MODIF ID M1,
                S_AUFNR FOR AUFM-AUFNR MODIF ID M2.


SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: S_PRDHA FOR MARA-PRDHA MODIF ID M3,
                S_MATNR FOR MARA-MATNR MODIF ID M3.
SELECTION-SCREEN END OF BLOCK B2.


*查询注释
SELECTION-SCREEN COMMENT 1(82) TEXT-003.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN COMMENT 3(82) TEXT-004.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN COMMENT 5(82) TEXT-007.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN COMMENT 3(82) TEXT-005.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN COMMENT 3(82) TEXT-006.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN COMMENT 3(82) TEXT-008.


*&---------------------------------------------------------------------*
* INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.


  DATA :
        LV_LASTDAY TYPE VTBBEWE-DVALUT.
*初始化
  SSCRFIELDS-FUNCTXT_01 = TEXT-009.
  SSCRFIELDS-FUNCTXT_02 = TEXT-010.


*求上月的最后一天
  CALL FUNCTION 'FIMA_DATE_CREATE'
    EXPORTING
      I_DATE                        = SY-DATUM
*     I_FLG_END_OF_MONTH            = ' '
*     I_YEARS                       = 0
     I_MONTHS                      = '-1'
*     I_DAYS                        = 0
*     I_CALENDAR_DAYS               = 0
     I_SET_LAST_DAY_OF_MONTH       = 'X'
   IMPORTING
     E_DATE                        = LV_LASTDAY
*     E_FLG_END_OF_MONTH            =
*     E_DAYS_OF_I_DATE              =
            .


*设置年月的初始值为当年的上个月
  S_MONTH-SIGN = 'I'.
  S_MONTH-OPTION = 'EQ'.
  S_MONTH-LOW = LV_LASTDAY+0(6).
  APPEND S_MONTH.




  CLEAR :       GV_YLFT ,     "投入原材料
                GV_HGPZL ,    "合格品
                GV_DJYPZL ,   "待检品
                GV_BHGPZL ,   "不合格品
                GV_FGHGP ,    "返工合格品
                GV_FGDJP ,    "返工待检品
                GV_FGBHGP ,   "返工不合格品
                GV_BXFX ,     "波纤
                GV_YUL .      "余料


*&---------------------------------------------------------------------*
* AT SELECTION-SCREEN OUTPUT
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*设置产品类别下拉框
  PERFORM FRM_SET_PRODUCT.


*设置是否可输
  PERFORM FRM_SET_INPUT.


*&---------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*警告信息
*  IF P_R1 = 'X' OR P_R2 = 'X'.
*    IF S_MONTH IS INITIAL AND S_BUDAT IS INITIAL
*      AND S_BTBHA IS INITIAL AND S_AUFNR IS INITIAL.
*      MESSAGE '此操作将查询所有记录,若要继续,请按回车键!' TYPE 'W'.
*    ENDIF.
*  ENDIF.


*设置必输条件
*  IF P_R3 = 'X'.
*    IF S_BTBHA IS INITIAL.
*      SET CURSOR FIELD 'S_BTBHA-LOW'.
*      MESSAGE '请输出需要查询的台班班号!' TYPE 'S' DISPLAY LIKE 'E'.
*      STOP.
*    ENDIF.
*  ELSEIF P_R4 = 'X'.
*    IF S_AUFNR IS INITIAL.
*      SET CURSOR FIELD 'S_AUFNR-LOW'.
*      MESSAGE '请输入需要查询的生产订单号!' TYPE 'S' DISPLAY LIKE 'E'.
*      STOP.
*    ENDIF.
*  ENDIF.


  IF SSCRFIELDS-UCOMM = 'FC01'.
    SUBMIT ZPACKAGE_COL AND RETURN VIA SELECTION-SCREEN.
  ELSEIF SSCRFIELDS-UCOMM = 'FC02'.
    CALL TRANSACTION 'ZPP110' ."AND SKIP FIRST SCREEN.
  ENDIF.


  IF S_MONTH IS INITIAL AND S_BUDAT IS INITIAL.
    SET CURSOR FIELD 'S_MONTH-LOW'.
    MESSAGE '请输入查询条件:年月或者过账日期!' TYPE 'E'.
  ENDIF.


*&---------------------------------------------------------------------*
* 建立年月的搜索帮助
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MONTH-LOW.
*年月的搜索帮助
  DATA:L_DATE TYPE SY-DATUM.


  CALL FUNCTION 'F4_DATE'
    EXPORTING
      DATE_FOR_FIRST_MONTH         = SY-DATUM
    IMPORTING
      SELECT_DATE                  = L_DATE
    EXCEPTIONS
      CALENDAR_BUFFER_NOT_LOADABLE = 1
      DATE_AFTER_RANGE             = 2
      DATE_BEFORE_RANGE            = 3
      DATE_INVALID                 = 4
      FACTORY_CALENDAR_NOT_FOUND   = 5
      HOLIDAY_CALENDAR_NOT_FOUND   = 6
      PARAMETER_CONFLICT           = 7
      OTHERS                       = 8.


  IF SY-SUBRC = 0.
    S_MONTH-LOW = L_DATE+0(6).
  ENDIF.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MONTH-HIGH.
*年月的搜索帮助
  DATA:L_DATE TYPE SY-DATUM.


  CALL FUNCTION 'F4_DATE'
    EXPORTING
      DATE_FOR_FIRST_MONTH         = SY-DATUM
    IMPORTING
      SELECT_DATE                  = L_DATE
    EXCEPTIONS
      CALENDAR_BUFFER_NOT_LOADABLE = 1
      DATE_AFTER_RANGE             = 2
      DATE_BEFORE_RANGE            = 3
      DATE_INVALID                 = 4
      FACTORY_CALENDAR_NOT_FOUND   = 5
      HOLIDAY_CALENDAR_NOT_FOUND   = 6
      PARAMETER_CONFLICT           = 7
      OTHERS                       = 8.


  IF SY-SUBRC = 0.
    S_MONTH-HIGH = L_DATE+0(6).
  ENDIF.


*&---------------------------------------------------------------------*
* START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.


* - show the current activity and the progress
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT = '正在处理,请稍等......'.
  CALL FUNCTION 'ZF_AUTHORITY_WERKS'
    TABLES
      S_WERKS = S_WERKS.


*取数
  PERFORM FRM_GET_DATA.


*处理
  PERFORM FRM_PROCESS_DATA.


*显示
  IF I_BTBHA IS NOT INITIAL.
    CALL SCREEN 9000.
  ELSE.
    MESSAGE '抱歉,没有找到任何符合条件的记录!' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.


*&---------------------------------------------------------------------*
* END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.


*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PRODUCT
*&---------------------------------------------------------------------*
*       产品类别下拉框
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_PRODUCT .
  DATA:
        I_LIST   TYPE VRM_VALUES,
        WA_LIST  LIKE LINE OF I_LIST,
        LV_I_DOMTAB      TYPE STANDARD TABLE OF DD07V,
        LV_WA_DOMTAB     TYPE DD07V.


  CALL FUNCTION 'DD_DOMVALUES_GET'
    EXPORTING
      DOMNAME        = 'ZPRODUCT'
      TEXT           = 'X'
      LANGU          = SY-LANGU
    TABLES
      DD07V_TAB      = LV_I_DOMTAB
    EXCEPTIONS                                              "#EC FB_RC
      WRONG_TEXTFLAG = 1
      OTHERS         = 2.


  LOOP AT LV_I_DOMTAB INTO LV_WA_DOMTAB.
    READ TABLE LV_I_DOMTAB INTO LV_WA_DOMTAB INDEX SY-TABIX.
    IF SY-SUBRC = 0.
      CLEAR : WA_LIST.
      WA_LIST-KEY = LV_WA_DOMTAB-DOMVALUE_L.
      WA_LIST-TEXT = LV_WA_DOMTAB-DDTEXT.
      APPEND WA_LIST TO I_LIST.
    ENDIF.
  ENDLOOP.


  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID              = 'P_PRO'
      VALUES          = I_LIST
    EXCEPTIONS
      ID_ILLEGAL_NAME = 1
      OTHERS          = 2.
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                    " FRM_SET_PRODUCT
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_INPUT
*&---------------------------------------------------------------------*
*       设置当某个单选按钮按下时不可输入
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_INPUT .
*控制屏幕的输入
  LOOP AT SCREEN.
    IF P_R1 = 'X' OR P_R2 = 'X'.
      CLEAR : S_MATNR.
      REFRESH : S_MATNR.
      CLEAR : S_PRDHA.
      REFRESH : S_PRDHA.
      IF SCREEN-GROUP1 = 'M3'.
        SCREEN-INPUT = '0'.
      ELSE.
        SCREEN-INPUT = '1'.
      ENDIF.
      MODIFY SCREEN.
    ELSEIF P_R3 = 'X'.
      CLEAR : S_AUFNR.
      REFRESH : S_AUFNR.
      CLEAR : S_MATNR.
      REFRESH : S_MATNR.
      CLEAR : S_PRDHA.
      REFRESH : S_PRDHA.
      IF SCREEN-GROUP1 = 'M2' OR SCREEN-GROUP1 = 'M3'.
        SCREEN-INPUT = '0'.
      ELSE.
        SCREEN-INPUT = '1'.
      ENDIF.
      MODIFY SCREEN.
    ELSEIF P_R4 = 'X'.
      CLEAR : S_BTBHA.
      REFRESH : S_BTBHA.
      CLEAR : S_MATNR.
      REFRESH : S_MATNR.
      CLEAR : S_PRDHA.
      REFRESH : S_PRDHA.
      IF SCREEN-GROUP1 = 'M1' OR SCREEN-GROUP1 = 'M3'.
        SCREEN-INPUT = '0'.
      ELSE.
        SCREEN-INPUT = '1'.
      ENDIF.
      MODIFY SCREEN.
    ELSEIF P_R5 = 'X'.
      CLEAR : S_BTBHA.
      REFRESH : S_BTBHA.
      CLEAR : S_AUFNR.
      REFRESH : S_AUFNR.
      IF SCREEN-GROUP1 = 'M1' OR SCREEN-GROUP1 = 'M2'.
        SCREEN-INPUT = '0'.
      ELSE.
        SCREEN-INPUT = '1'.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " FRM_SET_INPUT


*&---------------------------------------------------------------------*
*&      Module  INITIAL_CONTAINER  OUTPUT
*&---------------------------------------------------------------------*
*       初始化容器对象
*----------------------------------------------------------------------*
MODULE INITIAL_CONTAINER OUTPUT.
  IF GV_CONTAINER IS INITIAL.
    PERFORM CREATE_ALV_CONTAINER.
  ENDIF.
  PERFORM FRM_SET_ALV.
ENDMODULE.                 " INITIAL_CONTAINER  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  CREATE_ALV_CONTAINER
*&---------------------------------------------------------------------*
*       创建容器
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM CREATE_ALV_CONTAINER .
  IF NOT GV_CONTAINER IS INITIAL.
    CALL METHOD GV_CONTAINER->FREE
      EXCEPTIONS
        CNTL_SYSTEM_ERROR = 1
        CNTL_ERROR        = 2.
*    IF SY-SUBRC <> 0.
*    ENDIF.
    CLEAR GV_CONTAINER.
    CLEAR GV_ALV.
  ENDIF.
  CREATE OBJECT GV_CONTAINER
    EXPORTING
      CONTAINER_NAME              = GV_CNAME
    EXCEPTIONS
      CNTL_ERROR                  = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      LIFETIME_ERROR              = 4
      LIFETIME_DYNPRO_DYNPRO_LINK = 5.
ENDFORM.                    " CREATE_ALV_CONTAINER
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_ALV
*&---------------------------------------------------------------------*
*       ALV显示
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_ALV .
  IF GV_ALV IS INITIAL.
*创建ALV容器
    CREATE OBJECT GV_ALV
      EXPORTING
        I_PARENT          = GV_CONTAINER
      EXCEPTIONS
        ERROR_CNTL_CREATE = 1
        ERROR_CNTL_INIT   = 2
        ERROR_CNTL_LINK   = 3
        ERROR_DP_CREATE   = 4.


*ALV的设置
    PERFORM FRM_ALV_LIST.


*add by maojian at 20121026
    DELETE I_BTBHA WHERE YLFT = 0 AND
                        HGPZL = 0 AND
                        DJYPZL = 0 AND
                        BHGPZL = 0 AND
                        FGHGP = 0 AND
                        FGDJP = 0 AND
                        FGBHGP = 0 AND
                        BXFX = 0 AND
                        YUL = 0.


*AVL的显示
    CALL METHOD GV_ALV->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        IS_LAYOUT                     = GV_LAYOUT
        I_SAVE                        = 'A'
      CHANGING
        IT_OUTTAB                     = I_BTBHA
        IT_FIELDCATALOG               = ITAB_CATA_TK
      EXCEPTIONS
        INVALID_PARAMETER_COMBINATION = 1
        PROGRAM_ERROR                 = 2
        TOO_MANY_LINES                = 3
        OTHERS                        = 4.
*    --Creating an instance for the event handler
    CREATE OBJECT GR_EVENT_HANDLER .
*    --Registering handler methods to handle ALV Grid events
    SET HANDLER GR_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR GV_ALV.
    SET HANDLER GR_EVENT_HANDLER->HANDLE_HOTSPOT_CLICK FOR GV_ALV .
  ENDIF.
ENDFORM.                    " FRM_SET_ALV
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_LIST
*&---------------------------------------------------------------------*
*       ALV设置
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ALV_LIST .
* set fieldcatalog
  PERFORM FRM_SET_FIELDCAT.
* set layout
  PERFORM FRM_SET_LAYOUT.
ENDFORM.                    " FRM_ALV_LIST
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*       设置ALV字段
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
  DATA:
        LV_WA_FCAT TYPE LVC_S_FCAT.


  IF P_R2 = 'X'.
    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'CPDDH'.
    LV_WA_FCAT-COLTEXT = '产品订单号'.
    LV_WA_FCAT-OUTPUTLEN = '12'.
    LV_WA_FCAT-FIX_COLUMN = 'X'.
    LV_WA_FCAT-KEY = 'X'.
    LV_WA_FCAT-HOTSPOT = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.


    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'BTBHA'.
    LV_WA_FCAT-COLTEXT = '台班编号'.
    LV_WA_FCAT-OUTPUTLEN = '10'.
    LV_WA_FCAT-FIX_COLUMN = 'X'.
    LV_WA_FCAT-KEY = 'X'.
    LV_WA_FCAT-HOTSPOT = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.
  ELSEIF P_R5 = 'X'.
    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'VTEXT'.
    LV_WA_FCAT-COLTEXT = '产品层次'.
    LV_WA_FCAT-OUTPUTLEN = '18'.
    LV_WA_FCAT-KEY = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.


    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'MAKTX'.
    LV_WA_FCAT-COLTEXT = '订单产品名称'.
    LV_WA_FCAT-OUTPUTLEN = '25'.
    LV_WA_FCAT-KEY = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.


    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'MATNR'.
    LV_WA_FCAT-COLTEXT = '订单产品代码'.
    LV_WA_FCAT-OUTPUTLEN = '10'.
    LV_WA_FCAT-HOTSPOT = 'X'.
    LV_WA_FCAT-KEY = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.
  ELSE.
    IF P_R4 <> 'X'.
      CLEAR LV_WA_FCAT.
      LV_WA_FCAT-FIELDNAME = 'BTBHA'.
      LV_WA_FCAT-COLTEXT = '台班编号'.
      LV_WA_FCAT-OUTPUTLEN = '10'.
      LV_WA_FCAT-FIX_COLUMN = 'X'.
      LV_WA_FCAT-KEY = 'X'.
      LV_WA_FCAT-HOTSPOT = 'X'.
      APPEND LV_WA_FCAT TO ITAB_CATA_TK.
    ENDIF.


    IF P_R3 <> 'X'.
      CLEAR LV_WA_FCAT.
      LV_WA_FCAT-FIELDNAME = 'CPDDH'.
      LV_WA_FCAT-COLTEXT = '产品订单号'.
      LV_WA_FCAT-OUTPUTLEN = '12'.
      LV_WA_FCAT-FIX_COLUMN = 'X'.
      LV_WA_FCAT-KEY = 'X'.
      LV_WA_FCAT-HOTSPOT = 'X'.
      APPEND LV_WA_FCAT TO ITAB_CATA_TK.
    ENDIF.
  ENDIF.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'YLFT'.
  LV_WA_FCAT-COLTEXT = '投入原材料'.
  LV_WA_FCAT-OUTPUTLEN = '12'.
  LV_WA_FCAT-EMPHASIZE = 'C500'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'HGPZL'.
  LV_WA_FCAT-COLTEXT = '合格品'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C710'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'DJYPZL'.
  LV_WA_FCAT-COLTEXT = '待检品'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C710'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'BHGPZL'.
  LV_WA_FCAT-COLTEXT = '不合格品'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C710'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'FGHGP'.
  LV_WA_FCAT-COLTEXT = '返工合格品'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C510'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'FGDJP'.
  LV_WA_FCAT-COLTEXT = '返工待检品'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C510'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'FGBHGP'.
  LV_WA_FCAT-COLTEXT = '返工不合格品'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C510'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'BXFX'.
  LV_WA_FCAT-COLTEXT = '波纤'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C600'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'YUL'.
  LV_WA_FCAT-COLTEXT = '余料'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-EMPHASIZE = 'C600'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'YLCCHJ'.
  LV_WA_FCAT-COLTEXT = '原料产品产出'.
  LV_WA_FCAT-OUTPUTLEN = '12'.
*  LV_WA_FCAT-EMPHASIZE = 'C711'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'DBCCL'.
  LV_WA_FCAT-COLTEXT = '成材率'.
  LV_WA_FCAT-OUTPUTLEN = '8'.
  LV_WA_FCAT-JUST = 'R'.
  LV_WA_FCAT-HOTSPOT = 'X'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'DBHSL'.
  LV_WA_FCAT-COLTEXT = '回收率'.
  LV_WA_FCAT-OUTPUTLEN = '8'.
  LV_WA_FCAT-JUST = 'R'.
  LV_WA_FCAT-HOTSPOT = 'X'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'DBSHL'.
  LV_WA_FCAT-COLTEXT = '损耗率'.
  LV_WA_FCAT-OUTPUTLEN = '8'.
  LV_WA_FCAT-JUST = 'R'.
  LV_WA_FCAT-HOTSPOT = 'X'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'RATE'.
  LV_WA_FCAT-COLTEXT = '投入产出比'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  LV_WA_FCAT-HOTSPOT = 'X'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'ICON'.
  LV_WA_FCAT-COLTEXT = '错误标示'.
  LV_WA_FCAT-ICON = 'X'.
  LV_WA_FCAT-HOTSPOT = 'X'.
  LV_WA_FCAT-OUTPUTLEN = '8'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  IF P_R3 <> 'X' AND P_R5 <> 'X'.
    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'MAKTX'.
    LV_WA_FCAT-COLTEXT = '订单产品名称'.
    LV_WA_FCAT-OUTPUTLEN = '25'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.


    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'MATNR'.
    LV_WA_FCAT-COLTEXT = '订单产品代码'.
    LV_WA_FCAT-OUTPUTLEN = '10'.
    LV_WA_FCAT-HOTSPOT = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.
  ENDIF.


  IF P_R5 = 'X'.
    CLEAR LV_WA_FCAT.
    LV_WA_FCAT-FIELDNAME = 'PRDHA'.
    LV_WA_FCAT-COLTEXT = '层次代码'.
    LV_WA_FCAT-OUTPUTLEN = '6'.
    LV_WA_FCAT-NO_OUT = 'X'.
    APPEND LV_WA_FCAT TO ITAB_CATA_TK.
  ENDIF.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'HOURS'.
  LV_WA_FCAT-COLTEXT = '班组出勤总工时'.
  LV_WA_FCAT-OUTPUTLEN = '14'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'TIMES'.
  LV_WA_FCAT-COLTEXT = '设备运行时间'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'UNITS'.
  LV_WA_FCAT-COLTEXT = '单位'.
  LV_WA_FCAT-OUTPUTLEN = '4'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'AS'.
  LV_WA_FCAT-COLTEXT = '小时产量'.
  LV_WA_FCAT-OUTPUTLEN = '10'.
  APPEND LV_WA_FCAT TO ITAB_CATA_TK.


ENDFORM.                    " FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*       设置ALV格式
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
  GV_LAYOUT-SEL_MODE = 'D'.
*  GV_LAYOUT-ZEBRA = 'X' .
  GV_LAYOUT-CTAB_FNAME = 'CELLCOLORS'.
  GV_LAYOUT-INFO_FNAME = 'ROWCOLOR'.
  IF P_R1 = 'X'.
    GV_LAYOUT-GRID_TITLE = '生产投入产出平衡检查及指标分析 - 按台班订单   单位 :KG' .
  ELSEIF P_R2 = 'X'.
    GV_LAYOUT-GRID_TITLE = '生产投入产出平衡检查及指标分析 - 按订单台班   单位 :KG' .
  ELSEIF P_R3 = 'X'.
    GV_LAYOUT-GRID_TITLE = '生产投入产出平衡检查及指标分析 - 按台班  单位 :KG' .
  ELSEIF P_R4 = 'X'.
    GV_LAYOUT-GRID_TITLE = '生产投入产出平衡检查及指标分析 - 按订单  单位 :KG' .
  ELSEIF P_R5 = 'X'.
    GV_LAYOUT-GRID_TITLE = '生产投入产出平衡检查及指标分析 - 按产品层次跟物料代码  单位 :KG' .
  ENDIF.
  GV_LAYOUT-SMALLTITLE = 'X' .
ENDFORM.                    " FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       取数规则
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
*  DATA :
**开始年月
*        LV_START TYPE D,
**结束年月
*        LV_FINISH TYPE D.


*取’年月‘选择条件
  PERFORM FRM_GET_DATE CHANGING GV_START GV_FINISH.
*取数
  SELECT  AUFM~WERKS
          AUFM~AUFNR
          AUFM~MATNR
          AUFM~SHKZG
          AUFM~BWART
          AUFM~MEINS
          AUFM~WAERS
          AUFM~MJAHR
          AUFM~MBLNR
          AUFM~ZEILE
          AUFM~BUDAT
          AUFM~LGORT
          AUFM~CHARG
          AUFM~SOBKZ
          AUFM~KDAUF
          AUFM~KDPOS
          AUFM~RSNUM
          AUFM~RSPOS
          AUFM~SAKTO
          AUFM~MENGE
          AUFM~DMBTR
          MKPF~BKTXT
          MKPF~USNAM
          MAKT~MAKTX
          MAKT~SPRAS
*          MARA~PRDHA
    INTO CORRESPONDING FIELDS OF TABLE I_DATA
    FROM AUFM
         INNER JOIN MKPF
               ON MKPF~MBLNR = AUFM~MBLNR
              AND MKPF~MJAHR = AUFM~MJAHR
         INNER JOIN MAKT
              ON MAKT~MATNR = AUFM~MATNR
         INNER JOIN AFPO
              ON AFPO~AUFNR = AUFM~AUFNR
         INNER JOIN ZZTPP_ZSTZ_HEAD
              ON ZZTPP_ZSTZ_HEAD~BTBHA = MKPF~BKTXT
*         INNER JOIN MARA
*              ON MARA~MATNR = AUFM~MATNR
         WHERE AUFM~AUFNR IN S_AUFNR
*           AND AUFM~MJAHR IN S_MJAHR
*           AND AUFM~BUDAT BETWEEN GV_START AND GV_FINISH  "凭证中的过帐日期
           AND AFPO~LTRMI BETWEEN GV_START AND GV_FINISH "实际交货日期/结束日期
           AND AFPO~POSNR = '1'
           AND AUFM~BUDAT IN S_BUDAT
           AND MKPF~BKTXT IN S_BTBHA
           AND MKPF~BKTXT <> ''
           AND MAKT~SPRAS = '1'
           AND ZZTPP_ZSTZ_HEAD~GZ = 'Y'
*           AND ZZTPP_ZSTZ_HEAD~BUDAT IN S_BTBHA
*           AND ZZTPP_ZSTZ_HEAD~BUDAT BETWEEN GV_START AND GV_FINISH
           AND AUFM~WERKS IN S_WERKS.
  IF I_DATA IS INITIAL.
    EXIT.
  ENDIF.


  IF P_R1 = 'X'.
*台班订单产出
    PERFORM FRM_TB_ORDER.
  ELSEIF P_R2 = 'X'.
*订单台班产出
    PERFORM FRM_ORDER_TB.
  ELSEIF P_R3 = 'X'.
*按台班
    PERFORM FRM_BY_TB.
  ELSEIF P_R4 = 'X'.
*按订单
    PERFORM FRM_BY_ORDER.
*产品层次跟物料代码
  ELSEIF P_R5 = 'X'.
    PERFORM FRM_BY_PRODUCT_LEVEL.
  ENDIF.


ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATE
*&---------------------------------------------------------------------*
*       选择屏幕上的年月条件
*----------------------------------------------------------------------*
*      <--P_LV_START  text
*      <--P_LV_FINISH  text
*----------------------------------------------------------------------*
FORM FRM_GET_DATE  CHANGING P_START TYPE D
                            P_FINISH TYPE D.


  IF S_MONTH-LOW IS NOT INITIAL AND S_MONTH-HIGH IS INITIAL.
    CONCATENATE S_MONTH-LOW '01' INTO P_START.
    CALL FUNCTION 'FIMA_DATE_CREATE'
      EXPORTING
        I_DATE                        = P_START
*   I_FLG_END_OF_MONTH            = ' '
*   I_YEARS                       = 0
       I_MONTHS                      = 0
*   I_DAYS                        = 0
*   I_CALENDAR_DAYS               = 0
       I_SET_LAST_DAY_OF_MONTH       = 'X'
     IMPORTING
   E_DATE                        = P_FINISH
*   E_FLG_END_OF_MONTH            =
*   E_DAYS_OF_I_DATE              =
              .
  ELSEIF S_MONTH-LOW IS NOT INITIAL AND S_MONTH-HIGH IS NOT INITIAL.
    CONCATENATE S_MONTH-LOW '01' INTO P_START.
    CONCATENATE S_MONTH-HIGH '01' INTO P_FINISH.
    CALL FUNCTION 'FIMA_DATE_CREATE'
          EXPORTING
            I_DATE                        = P_FINISH
*   I_FLG_END_OF_MONTH            = ' '
*   I_YEARS                       = 0
           I_MONTHS                      = 0
*   I_DAYS                        = 0
*   I_CALENDAR_DAYS               = 0
           I_SET_LAST_DAY_OF_MONTH       = 'X'
         IMPORTING
       E_DATE                        = P_FINISH
*   E_FLG_END_OF_MONTH            =
*   E_DAYS_OF_I_DATE              =
                  .
  ELSEIF S_MONTH IS INITIAL.
    P_START = '19000101'.
    P_FINISH = '99991231'.
  ENDIF.
ENDFORM.                    " FRM_GET_DATE
*&---------------------------------------------------------------------*
*&      Form  FRM_TB_ORDER
*&---------------------------------------------------------------------*
*       台班订单产出
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_TB_ORDER .
  DATA :
* 存放比较的台班编号
        LV_BKTXT TYPE BKTXT,
* 存放比较的生产订单号
        LV_AUFNR TYPE AUFNR,
* 临时I_BTBHA内表
        LV_I_BTBHA TYPE STANDARD TABLE OF T_BTBHA,
        LV_WA_BTBHA TYPE T_BTBHA,
        LV_I_TEMP TYPE STANDARD TABLE OF T_BTBHA,
        LV_WA_TEMP TYPE T_BTBHA,
*过账日期
        LV_DAT TYPE D,
*产品类别
        LV_BTBHA TYPE BKTXT.


*按台班-订单排序
  SORT I_DATA BY BKTXT AUFNR.


*取订单产品规格信息
  PERFORM FRM_GET_ORDERSPEC.


*处理查询结果到输出内表:I_BTBHA
  READ TABLE I_DATA INTO WA_DATA INDEX 1.
  LV_BKTXT = WA_DATA-BKTXT.
  LV_AUFNR = WA_DATA-AUFNR.
  CLEAR : WA_DATA.
  REFRESH : I_BTBHA.


  LOOP AT I_DATA INTO WA_DATA.
    IF LV_BKTXT = WA_DATA-BKTXT AND LV_AUFNR = WA_DATA-AUFNR.
*同一台班下的同一订单 - 累加
      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ELSEIF LV_BKTXT = WA_DATA-BKTXT AND LV_AUFNR <> WA_DATA-AUFNR.
*同一台班下的不同订单 - 添加
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = LV_BKTXT.       "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      APPEND WA_BTBHA TO I_BTBHA.


      LV_AUFNR = WA_DATA-AUFNR.
      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ELSEIF LV_BKTXT <> WA_DATA-BKTXT .
*不同台班
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = LV_BKTXT.       "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      APPEND WA_BTBHA TO I_BTBHA.


      LV_BKTXT = WA_DATA-BKTXT.
      LV_AUFNR = WA_DATA-AUFNR.
      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ENDIF.


    MODIFY I_DATA FROM WA_DATA.


    AT LAST.
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = LV_BKTXT.       "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      APPEND WA_BTBHA TO I_BTBHA.


      CLEAR : LV_AUFNR,
              LV_BKTXT,
              GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料
    ENDAT.
  ENDLOOP.


*台班合计行
  REFRESH LV_I_BTBHA.
  LOOP AT I_BTBHA INTO WA_BTBHA.
    MOVE-CORRESPONDING WA_BTBHA TO LV_WA_BTBHA.


*   台班-订单  设备运行时间
    CLEAR : LV_DAT , LV_BTBHA.
    IF STRLEN( LV_WA_BTBHA-BTBHA ) = 8.
      CONCATENATE '20' LV_WA_BTBHA-BTBHA+2(6) INTO LV_DAT.
      LV_BTBHA = LV_WA_BTBHA-BTBHA+0(2).
    ELSEIF STRLEN( LV_WA_BTBHA-BTBHA ) = 10.
      CONCATENATE '20' LV_WA_BTBHA-BTBHA+4(6) INTO LV_DAT.
      LV_BTBHA = LV_WA_BTBHA-BTBHA+0(4).
    ENDIF.


    REFRESH I_CONFIRM.
    SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = LV_WA_BTBHA-CPDDH
         AND LTXA1 = LV_WA_BTBHA-BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.
    IF SY-SUBRC = 0.


      SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         APPENDING CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = LV_WA_BTBHA-CPDDH
         AND BUDAT = LV_DAT
         AND LTXA1 = ''
         AND LOGRP = LV_BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.


      LOOP AT I_CONFIRM INTO WA_CONFIRM.
        LV_WA_BTBHA-TIMES = LV_WA_BTBHA-TIMES + WA_CONFIRM-ISM01.
*工时
        LV_WA_BTBHA-HOURS = LV_WA_BTBHA-HOURS + WA_CONFIRM-ISM02.
      ENDLOOP.


    ELSE.


      SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = LV_WA_BTBHA-CPDDH
         AND BUDAT = LV_DAT
         AND LTXA1 = ''
         AND LOGRP = LV_BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.
      IF SY-SUBRC = 0.
        LOOP AT I_CONFIRM INTO WA_CONFIRM.
          LV_WA_BTBHA-TIMES = LV_WA_BTBHA-TIMES + WA_CONFIRM-ISM01.
*工时
          LV_WA_BTBHA-HOURS = LV_WA_BTBHA-HOURS + WA_CONFIRM-ISM02.
        ENDLOOP.
      ENDIF.
    ENDIF.
    LV_WA_BTBHA-UNITS = 'H'.
    APPEND LV_WA_BTBHA TO LV_I_BTBHA.
  ENDLOOP.


  REFRESH : LV_I_TEMP.
  LOOP AT LV_I_BTBHA INTO LV_WA_BTBHA.
    APPEND LV_WA_BTBHA TO LV_I_TEMP.
    MOVE-CORRESPONDING LV_WA_BTBHA TO LV_WA_TEMP .
    AT END OF BTBHA.
      SUM.
      LV_WA_BTBHA-BTBHA = LV_WA_TEMP-BTBHA.
      LV_WA_BTBHA-CPDDH = '合计'.
      LV_WA_BTBHA-DBCCL = ''.
      LV_WA_BTBHA-DBHSL = ''.
      LV_WA_BTBHA-ICON = ''.
      LV_WA_BTBHA-MATNR = ''.
      LV_WA_BTBHA-MAKTX = ''.
      LV_WA_BTBHA-UNITS = 'H'.
      LV_WA_BTBHA-ROWCOLOR = 'C100'.
      APPEND LV_WA_BTBHA TO LV_I_TEMP.
    ENDAT.
  ENDLOOP.


  REFRESH : I_BTBHA , LV_I_BTBHA.
  LOOP AT LV_I_TEMP INTO LV_WA_BTBHA.
    MOVE-CORRESPONDING LV_WA_BTBHA TO WA_BTBHA.
    APPEND WA_BTBHA TO I_BTBHA.
  ENDLOOP.
  REFRESH LV_I_TEMP.


ENDFORM.                    " FRM_TB_ORDER
*&---------------------------------------------------------------------*
*&      Form  FRM_ORDER_TB
*&---------------------------------------------------------------------*
*       订单台班产出
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ORDER_TB .
  DATA :
* 存放比较的台班编号
          LV_BKTXT TYPE BKTXT,
* 存放比较的生产订单号
          LV_AUFNR TYPE AUFNR,
* 临时存放的内表信息
          LV_I_AUFNR TYPE STANDARD TABLE OF T_AUFNR,
          LV_WA_AUFNR TYPE T_AUFNR,
          LV_I_TEMP TYPE STANDARD TABLE OF T_AUFNR,
          LV_WA_TEMP TYPE T_AUFNR,
*过账日期
          LV_DAT TYPE D,
*产品类别
          LV_BTBHA TYPE BKTXT.


*按订单-台班排序
  SORT I_DATA BY AUFNR BKTXT.


*取订单产品规格信息
  PERFORM FRM_GET_ORDERSPEC.


*处理查询结果到输出内表:I_BTBHA
  READ TABLE I_DATA INTO WA_DATA INDEX 1.
  LV_AUFNR = WA_DATA-AUFNR.
  LV_BKTXT = WA_DATA-BKTXT.
  CLEAR : WA_DATA.
  REFRESH : I_BTBHA.


  LOOP AT I_DATA INTO WA_DATA.
    IF  LV_AUFNR = WA_DATA-AUFNR AND  LV_BKTXT = WA_DATA-BKTXT.
*同一生产订单同一台班 - 累加
      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ELSEIF LV_AUFNR = WA_DATA-AUFNR AND  LV_BKTXT <> WA_DATA-BKTXT.
*同一生产订单不同台班 - 添加
      CLEAR : LV_WA_AUFNR.
      LV_WA_AUFNR-CPDDH = LV_AUFNR.       "产品订单号
      LV_WA_AUFNR-BTBHA = LV_BKTXT.       "台班班号
      LV_WA_AUFNR-YLFT = GV_YLFT.         "投入原材料
      LV_WA_AUFNR-HGPZL = GV_HGPZL.       "合格品
      LV_WA_AUFNR-DJYPZL = GV_DJYPZL.     "待检品
      LV_WA_AUFNR-BHGPZL = GV_BHGPZL.     "不合格品
      LV_WA_AUFNR-FGHGP = GV_FGHGP.       "返工合格品
      LV_WA_AUFNR-FGDJP = GV_FGDJP.       "返工待检品
      LV_WA_AUFNR-FGBHGP = GV_FGBHGP.     "返工不合格品
      LV_WA_AUFNR-BXFX  = GV_BXFX.        "波纤
      LV_WA_AUFNR-YUL = GV_YUL.           "余料
      APPEND LV_WA_AUFNR TO LV_I_AUFNR.


      LV_BKTXT = WA_DATA-BKTXT.


      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ELSEIF LV_AUFNR <> WA_DATA-AUFNR.
*不同生产订单
      CLEAR : LV_WA_AUFNR.
      LV_WA_AUFNR-CPDDH = LV_AUFNR.       "产品订单号
      LV_WA_AUFNR-BTBHA = LV_BKTXT.       "台班班号
      LV_WA_AUFNR-YLFT = GV_YLFT.         "投入原材料
      LV_WA_AUFNR-HGPZL = GV_HGPZL.       "合格品
      LV_WA_AUFNR-DJYPZL = GV_DJYPZL.     "待检品
      LV_WA_AUFNR-BHGPZL = GV_BHGPZL.     "不合格品
      LV_WA_AUFNR-FGHGP = GV_FGHGP.       "返工合格品
      LV_WA_AUFNR-FGDJP = GV_FGDJP.       "返工待检品
      LV_WA_AUFNR-FGBHGP = GV_FGBHGP.     "返工不合格品
      LV_WA_AUFNR-BXFX  = GV_BXFX.        "波纤
      LV_WA_AUFNR-YUL = GV_YUL.           "余料
      APPEND LV_WA_AUFNR TO LV_I_AUFNR.


      LV_AUFNR = WA_DATA-AUFNR.
      LV_BKTXT = WA_DATA-BKTXT.


      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ENDIF.


    MODIFY I_DATA FROM WA_DATA.


    AT LAST.
      CLEAR : LV_WA_AUFNR.
      LV_WA_AUFNR-CPDDH = LV_AUFNR.       "产品订单号
      LV_WA_AUFNR-BTBHA = LV_BKTXT.       "台班班号
      LV_WA_AUFNR-YLFT = GV_YLFT.         "投入原材料
      LV_WA_AUFNR-HGPZL = GV_HGPZL.       "合格品
      LV_WA_AUFNR-DJYPZL = GV_DJYPZL.     "待检品
      LV_WA_AUFNR-BHGPZL = GV_BHGPZL.     "不合格品
      LV_WA_AUFNR-FGHGP = GV_FGHGP.       "返工合格品
      LV_WA_AUFNR-FGDJP = GV_FGDJP.       "返工待检品
      LV_WA_AUFNR-FGBHGP = GV_FGBHGP.     "返工不合格品
      LV_WA_AUFNR-BXFX  = GV_BXFX.        "波纤
      LV_WA_AUFNR-YUL = GV_YUL.           "余料
      APPEND LV_WA_AUFNR TO LV_I_AUFNR.


      CLEAR : LV_AUFNR,
              LV_BKTXT,
              GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料
    ENDAT.
  ENDLOOP.


  LOOP AT LV_I_AUFNR INTO LV_WA_AUFNR.
*   订单 - 台班  设备运行时间


    CLEAR : LV_DAT , LV_BTBHA.
    IF STRLEN( LV_WA_AUFNR-BTBHA ) = 8.
      CONCATENATE '20' LV_WA_AUFNR-BTBHA+2(6) INTO LV_DAT.
      LV_BTBHA = LV_WA_AUFNR-BTBHA+0(2).
    ELSEIF STRLEN( LV_WA_AUFNR-BTBHA ) = 10.
      CONCATENATE '20' LV_WA_AUFNR-BTBHA+4(6) INTO LV_DAT.
      LV_BTBHA = LV_WA_AUFNR-BTBHA+0(4).
    ENDIF.


    REFRESH I_CONFIRM.
    SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = LV_WA_AUFNR-CPDDH
         AND LTXA1 = LV_WA_AUFNR-BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.
    IF SY-SUBRC = 0.


      SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         APPENDING CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = LV_WA_AUFNR-CPDDH
         AND BUDAT = LV_DAT
         AND LTXA1 = ''
         AND LOGRP = LV_BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.


      LOOP AT I_CONFIRM INTO WA_CONFIRM.
        LV_WA_AUFNR-TIMES = LV_WA_AUFNR-TIMES + WA_CONFIRM-ISM01.
*工时
        LV_WA_AUFNR-HOURS = LV_WA_AUFNR-HOURS + WA_CONFIRM-ISM02.
      ENDLOOP.


    ELSE.


      SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = LV_WA_AUFNR-CPDDH
         AND BUDAT = LV_DAT
         AND LTXA1 = ''
         AND LOGRP = LV_BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.
      IF SY-SUBRC = 0.
        LOOP AT I_CONFIRM INTO WA_CONFIRM.
          LV_WA_AUFNR-TIMES = LV_WA_AUFNR-TIMES + WA_CONFIRM-ISM01.
*工时
          LV_WA_AUFNR-HOURS = LV_WA_AUFNR-HOURS + WA_CONFIRM-ISM02.
        ENDLOOP.
      ENDIF.
    ENDIF.
    LV_WA_AUFNR-UNITS = 'H'.
    MODIFY LV_I_AUFNR FROM LV_WA_AUFNR.
  ENDLOOP.
*合计行
  REFRESH LV_I_TEMP.
  LOOP AT LV_I_AUFNR INTO LV_WA_AUFNR.
    APPEND LV_WA_AUFNR TO LV_I_TEMP.
    MOVE-CORRESPONDING LV_WA_AUFNR TO LV_WA_TEMP.
    AT END OF CPDDH.
      SUM.
      LV_WA_AUFNR-CPDDH = LV_WA_TEMP-CPDDH.
      LV_WA_AUFNR-BTBHA = '合计'.
      LV_WA_AUFNR-DBCCL = ''.
      LV_WA_AUFNR-DBHSL = ''.
      LV_WA_AUFNR-ICON = ''.
      LV_WA_AUFNR-UNITS = 'H'.
      LV_WA_AUFNR-ROWCOLOR = 'C100'.
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_WA_TEMP-CPDDH.
      LV_WA_AUFNR-MATNR = WA_SPEC-MATNR.
      LV_WA_AUFNR-MAKTX = WA_SPEC-MAKTX.
      APPEND LV_WA_AUFNR TO LV_I_TEMP.
    ENDAT.
  ENDLOOP.


  REFRESH LV_I_AUFNR.
  CLEAR WA_BTBHA.
  LOOP AT LV_I_TEMP INTO LV_WA_AUFNR.
    MOVE-CORRESPONDING LV_WA_AUFNR TO WA_BTBHA.
    APPEND WA_BTBHA TO I_BTBHA.
  ENDLOOP.
  REFRESH LV_I_TEMP.


ENDFORM.                    " FRM_ORDER_TB
*&---------------------------------------------------------------------*
*&      Form  FRM_BY_TB
*&---------------------------------------------------------------------*
*       按台班--直接统计某个台班的所有信息,不必区分订单
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_BY_TB .
  DATA :
* 存放比较的台班编号
        LV_BKTXT TYPE BKTXT,
*过账日期
        LV_DAT  TYPE D,
*产品类别
        LV_BTBHA TYPE BKTXT.


*按台班排序
  SORT I_DATA BY BKTXT MATNR.


*处理查询结果到输出内表:I_BTBHA
  READ TABLE I_DATA INTO WA_DATA INDEX 1.
  LV_BKTXT = WA_DATA-BKTXT.
  CLEAR : WA_DATA.
  REFRESH : I_BTBHA.


  LOOP AT I_DATA INTO WA_DATA.
    IF LV_BKTXT = WA_DATA-BKTXT.
*同一台班编号
*分类合计
      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.
    ELSE.
*不同的台班编号
*插入到输出内表中
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = LV_BKTXT.       "台班班号
      WA_BTBHA-CPDDH = WA_DATA-AUFNR.  "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      APPEND WA_BTBHA TO I_BTBHA.


      LV_BKTXT = WA_DATA-BKTXT.
      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ENDIF.


    MODIFY I_DATA FROM WA_DATA.


    AT LAST.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = LV_BKTXT.       "台班班号
      WA_BTBHA-CPDDH = WA_DATA-AUFNR.  "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      APPEND WA_BTBHA TO I_BTBHA.
      CLEAR : LV_BKTXT,
              GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料
    ENDAT.
  ENDLOOP.


*小时产量的计算 -- 台班
  LOOP AT I_BTBHA INTO WA_BTBHA.


    CLEAR : LV_DAT , LV_BTBHA.
    IF STRLEN( WA_BTBHA-BTBHA ) = 8.
      CONCATENATE '20' WA_BTBHA-BTBHA+2(6) INTO LV_DAT.
      LV_BTBHA = WA_BTBHA-BTBHA+0(2).
    ELSEIF STRLEN( WA_BTBHA-BTBHA ) = 10.
      CONCATENATE '20' WA_BTBHA-BTBHA+4(6) INTO LV_DAT.
      LV_BTBHA = WA_BTBHA-BTBHA+0(4).
    ENDIF.


    REFRESH I_CONFIRM.
    SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE LTXA1 = WA_BTBHA-BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.
    IF SY-SUBRC = 0.


      SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         APPENDING CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE BUDAT = LV_DAT
         AND LTXA1 = ''
         AND LOGRP = LV_BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.


      LOOP AT I_CONFIRM INTO WA_CONFIRM.
*机器运行时间
        WA_BTBHA-TIMES = WA_BTBHA-TIMES + WA_CONFIRM-ISM01.
*工时
        WA_BTBHA-HOURS = WA_BTBHA-HOURS + WA_CONFIRM-ISM02.
      ENDLOOP.


    ELSE.


      SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE BUDAT = LV_DAT
         AND LTXA1 = ''
         AND LOGRP = LV_BTBHA
         AND STOKZ <> 'X'
         AND STZHL = ''.
      IF SY-SUBRC = 0.
        LOOP AT I_CONFIRM INTO WA_CONFIRM.
*机器运行时间
          WA_BTBHA-TIMES = WA_BTBHA-TIMES + WA_CONFIRM-ISM01.
*工时
          WA_BTBHA-HOURS = WA_BTBHA-HOURS + WA_CONFIRM-ISM02.
        ENDLOOP.
      ENDIF.
    ENDIF.
    WA_BTBHA-UNITS = 'H'.
    MODIFY I_BTBHA FROM WA_BTBHA.
  ENDLOOP.
ENDFORM.                    " FRM_BY_TB
*&---------------------------------------------------------------------*
*&      Form  FRM_BY_ORDER
*&---------------------------------------------------------------------*
*       按订单
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_BY_ORDER .
  DATA :
*存放比较的订单号
       LV_AUFNR TYPE AUFNR.


*按订单排序
  SORT I_DATA BY AUFNR .


*取订单产品规格信息
  PERFORM FRM_GET_ORDERSPEC.


*处理查询结果到输出内表:I_BTBHA
  READ TABLE I_DATA INTO WA_DATA INDEX 1.
  LV_AUFNR = WA_DATA-AUFNR.
  CLEAR : WA_DATA.
  REFRESH : I_BTBHA.


  LOOP AT I_DATA INTO WA_DATA.
    IF LV_AUFNR = WA_DATA-AUFNR.
*同一个订单
      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.
    ELSE.
*不同订单
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = WA_DATA-BKTXT.  "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      APPEND WA_BTBHA TO I_BTBHA.


      LV_AUFNR = WA_DATA-AUFNR.
      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.


    ENDIF.


    MODIFY I_DATA FROM WA_DATA.


    AT LAST.
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = WA_DATA-BKTXT.  "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      APPEND WA_BTBHA TO I_BTBHA.


      CLEAR : LV_AUFNR,
              GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料
    ENDAT.
  ENDLOOP.


*小时产量的计算 -- 订单
  LOOP AT I_BTBHA INTO WA_BTBHA.
    REFRESH I_CONFIRM.
    SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = WA_BTBHA-CPDDH
         AND BUDAT BETWEEN GV_START AND GV_FINISH
         AND BUDAT IN S_BUDAT
         AND STOKZ <> 'X'
         AND STZHL = ''.
    IF SY-SUBRC = 0.
      LOOP AT I_CONFIRM INTO WA_CONFIRM.
*机器运行时间
        WA_BTBHA-TIMES = WA_BTBHA-TIMES + WA_CONFIRM-ISM01.
*工时
        WA_BTBHA-HOURS = WA_BTBHA-HOURS + WA_CONFIRM-ISM02.
      ENDLOOP.
    ENDIF.
    WA_BTBHA-UNITS = 'H'.
    MODIFY I_BTBHA FROM WA_BTBHA.
  ENDLOOP.
ENDFORM.                    " FRM_BY_ORDER
*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*       输出屏幕的PBO
*----------------------------------------------------------------------*
MODULE STATUS_9000 OUTPUT.
  SET PF-STATUS '9000'.
  IF P_R1 = 'X'.
    SET TITLEBAR 'TITLE' WITH '生产投入产出平衡检查及指标分析 - 按台班订单'.
  ELSEIF P_R2 = 'X'.
    SET TITLEBAR 'TITLE' WITH '生产投入产出平衡检查及指标分析 - 按订单台班'.
  ELSEIF P_R3 = 'X'.
    SET TITLEBAR 'TITLE' WITH '生产投入产出平衡检查及指标分析 - 按台班'.
  ELSEIF P_R4 = 'X'.
    SET TITLEBAR 'TITLE' WITH '生产投入产出平衡检查及指标分析 - 按订单'.
  ELSEIF P_R5 = 'X'.
    SET TITLEBAR 'TITLE' WITH '生产投入产出平衡检查及指标分析 - 按产品层次跟物料代码'.
  ENDIF.


ENDMODULE.                 " STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       输出屏幕的PAI
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9000 INPUT.
  CASE OK_CODE.
    WHEN 'BACK' OR 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.
    WHEN OTHERS .
  ENDCASE.
  CLEAR : OK_CODE.
ENDMODULE.                 " USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*       处理输出值
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
  DATA :
*投入原料+余料
       LV_MATERIAL(16) TYPE P DECIMALS 2,
*成材率
       LV_DBCCL TYPE ZZLMS,
*回收率
       LV_DBHSL TYPE ZZLMS,
*损耗率
       LV_DBSHL TYPE ZZLMS.


  LOOP AT I_DATA INTO WA_DATA WHERE MARK <> ''.
    IF WA_DATA-MARK = 'A'.
      WA_DATA-REMARK = '投入原材料'.
    ELSEIF WA_DATA-MARK = 'B'.
      WA_DATA-REMARK = '合格品'.
    ELSEIF WA_DATA-MARK = 'C'.
      WA_DATA-REMARK = '待检品'.
    ELSEIF WA_DATA-MARK = 'D'.
      WA_DATA-REMARK = '不合格品'.
    ELSEIF WA_DATA-MARK = 'E'.
      WA_DATA-REMARK = '返工合格品'.
    ELSEIF WA_DATA-MARK = 'F'.
      WA_DATA-REMARK = '返工待检品'.
    ELSEIF WA_DATA-MARK = 'G'.
      WA_DATA-REMARK = '返工不合格品'.
    ELSEIF WA_DATA-MARK = 'H'.
      WA_DATA-REMARK = '波纤'.
    ELSEIF WA_DATA-MARK = 'I'.
      WA_DATA-REMARK = '余料'.
    ENDIF.


    IF WA_DATA-SHKZG = 'H'.
*数量 ( + / -)
      WA_DATA-MENGE = 0 - WA_DATA-MENGE.
*本位币金额  ( + / -)
      WA_DATA-DMBTR = 0 - WA_DATA-DMBTR.
    ENDIF.
*班组
    WA_DATA-GROUP = WA_DATA-BKTXT+0(2) .


    MODIFY I_DATA FROM WA_DATA.


  ENDLOOP.


  IF I_BTBHA IS NOT INITIAL.
*处理输出列表
    LOOP AT I_BTBHA INTO WA_BTBHA.
      CLEAR :
            LV_MATERIAL,
            LV_DBCCL,
            LV_DBHSL.


*原料产品产出
      WA_BTBHA-YLCCHJ = WA_BTBHA-HGPZL + WA_BTBHA-DJYPZL +
        WA_BTBHA-BHGPZL + WA_BTBHA-FGHGP +
        WA_BTBHA-FGDJP + WA_BTBHA-FGBHGP.


*成材率
      IF WA_BTBHA-YLFT <> 0.
        LV_DBCCL = ( TRUNC( ( WA_BTBHA-YLCCHJ /
          WA_BTBHA-YLFT ) * 10000 ) ) / 100.
      ELSE.
        LV_DBCCL = 0.
      ENDIF.




      WA_BTBHA-DBCCL = ABS( LV_DBCCL ).
      CONDENSE WA_BTBHA-DBCCL NO-GAPS.
      CONCATENATE WA_BTBHA-DBCCL C_SIGN INTO WA_BTBHA-DBCCL.


*回收率
      IF WA_BTBHA-YLFT <> 0.
        LV_DBHSL = ( TRUNC( ( ( WA_BTBHA-BXFX + WA_BTBHA-YUL )
          / WA_BTBHA-YLFT ) * 10000 ) ) / 100.
      ELSE.
        LV_DBHSL = 0.
      ENDIF.


      WA_BTBHA-DBHSL = ABS( LV_DBHSL ).
      CONDENSE WA_BTBHA-DBHSL NO-GAPS.
      CONCATENATE WA_BTBHA-DBHSL C_SIGN INTO WA_BTBHA-DBHSL.


*损耗率 = (投入原料-产出成品-余料/联产品)/投入原料
      IF WA_BTBHA-YLFT <> 0.
        LV_DBSHL = ( TRUNC( ( ( WA_BTBHA-YLFT + WA_BTBHA-YLCCHJ
           + WA_BTBHA-BXFX + WA_BTBHA-YUL )
          / WA_BTBHA-YLFT ) * 10000 ) ) / 100.
      ELSE.
        LV_DBSHL = 0.
      ENDIF.


      WA_BTBHA-DBSHL = ABS( LV_DBSHL ).
      CONDENSE WA_BTBHA-DBSHL NO-GAPS.
      CONCATENATE WA_BTBHA-DBSHL C_SIGN INTO WA_BTBHA-DBSHL.


*投入产出比
      LV_MATERIAL = WA_BTBHA-YLFT + WA_BTBHA-YUL.
      IF LV_MATERIAL  <> 0.
        WA_BTBHA-RATE = ( WA_BTBHA-YLCCHJ + WA_BTBHA-BXFX ) /
          ( WA_BTBHA-YLFT + WA_BTBHA-YUL ).
      ELSE.
        WA_BTBHA-RATE = 0.
      ENDIF.


      WA_BTBHA-RATE = ABS( WA_BTBHA-RATE ).


*错误标示
      IF WA_BTBHA-RATE > 1 OR WA_BTBHA-RATE < C_RATE.
        WA_BTBHA-ICON = ICON_LED_RED.
        WA_CELLCOLOR-FNAME = 'RATE' .
        WA_CELLCOLOR-COLOR-COL = '6' .
        WA_CELLCOLOR-COLOR-INT = '1' .
        APPEND WA_CELLCOLOR TO WA_BTBHA-CELLCOLORS .
      ELSE.
        WA_BTBHA-ICON = ICON_LED_GREEN.
        WA_CELLCOLOR-FNAME = 'RATE' .
        WA_CELLCOLOR-COLOR-COL = '1' .
        WA_CELLCOLOR-COLOR-INT = '1' .
        APPEND WA_CELLCOLOR TO WA_BTBHA-CELLCOLORS .
      ENDIF.


*小时产量
      IF WA_BTBHA-TIMES <> 0.
        WA_BTBHA-AS = WA_BTBHA-YLCCHJ / WA_BTBHA-TIMES.
      ENDIF.
*      IF WA_BTBHA-TIMES = 0 OR WA_BTBHA-TIMES > 20 .
      IF WA_BTBHA-TIMES <= 0 .
        WA_CELLCOLOR-FNAME = 'TIMES' .
        WA_CELLCOLOR-COLOR-COL = '6' .
        WA_CELLCOLOR-COLOR-INT = '1' .
        APPEND WA_CELLCOLOR TO WA_BTBHA-CELLCOLORS .
      ENDIF.


*订单产品代码
      IF WA_BTBHA-MATNR IS NOT INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            INPUT  = WA_BTBHA-MATNR
          IMPORTING
            OUTPUT = WA_BTBHA-MATNR.
      ENDIF.


*订单号
      IF WA_BTBHA-CPDDH IS NOT INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
          EXPORTING
            INPUT  = WA_BTBHA-CPDDH
          IMPORTING
            OUTPUT = WA_BTBHA-CPDDH.
      ENDIF.


      MODIFY I_BTBHA FROM WA_BTBHA.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SUBTOTAL
*&---------------------------------------------------------------------*
*       分类合并处理
*----------------------------------------------------------------------*
*      -->P_WA_DATA  text
*----------------------------------------------------------------------*
FORM FRM_SUBTOTAL  CHANGING P_WA_DATA TYPE T_TAB.
  DATA :
*物料描述
        LV_MAKTX TYPE MAKTX.


*包装物
  IF P_WA_DATA-MATNR+8(1) = '5'.
    EXIT.
  ENDIF.


  IF P_WA_DATA-BWART = '321'."质检库存到非限制库存
    EXIT.
  ENDIF.


  SELECT SINGLE MAKTX
    INTO LV_MAKTX
    FROM MAKT
   WHERE MATNR = P_WA_DATA-MATNR
     AND SPRAS = SY-LANGU.
*----------------
*投入原材料     A
*合格品        B
*待检品        C
*不合格品      D
*返工合格品    E
*返工待检品    F
*返工不合格品  G
*波纤         H
*余料         I
*----------------


*波纤 531 & 101
  SEARCH LV_MAKTX FOR C_SUS.
  IF SY-SUBRC = 0.
    IF P_WA_DATA-SHKZG = 'S'.
      GV_BXFX = GV_BXFX + P_WA_DATA-MENGE.
    ELSEIF P_WA_DATA-SHKZG = 'H'.
      GV_BXFX = GV_BXFX - P_WA_DATA-MENGE.
    ENDIF.
    P_WA_DATA-MARK = 'H'.
    EXIT.
  ENDIF.


*余料
  SEARCH LV_MAKTX FOR C_YUL.
  IF SY-SUBRC = 0.
    IF P_WA_DATA-SHKZG = 'S'.
      GV_YUL = GV_YUL + P_WA_DATA-MENGE.
    ELSEIF P_WA_DATA-SHKZG = 'H'.
      GV_YUL = GV_YUL - P_WA_DATA-MENGE.
    ENDIF.
    P_WA_DATA-MARK = 'I'.
    EXIT.
  ENDIF.
  SEARCH LV_MAKTX FOR C_WEIL.
  IF SY-SUBRC = 0.
    IF P_WA_DATA-SHKZG = 'S'.
      GV_YUL = GV_YUL + P_WA_DATA-MENGE.
    ELSEIF P_WA_DATA-SHKZG = 'H'.
      GV_YUL = GV_YUL - P_WA_DATA-MENGE.
    ENDIF.
    P_WA_DATA-MARK = 'I'.
    EXIT.
  ENDIF.


*-------------------------------------L 拉丝
  IF P_WA_DATA-BKTXT+0(1) = 'L'.
    SEARCH LV_MAKTX FOR C_LASI.
    IF SY-SUBRC = 0.
*原材料
      IF P_WA_DATA-SHKZG = 'S'.
        GV_YLFT = GV_YLFT + P_WA_DATA-MENGE.
      ELSEIF P_WA_DATA-SHKZG = 'H'.
        GV_YLFT = GV_YLFT - P_WA_DATA-MENGE.
      ENDIF.
      P_WA_DATA-MARK = 'A'.
      EXIT.
    ELSE.
*合格品
      IF P_WA_DATA-SHKZG = 'S'.
        GV_HGPZL = GV_HGPZL + P_WA_DATA-MENGE.
      ELSEIF P_WA_DATA-SHKZG = 'H'.
        GV_HGPZL = GV_HGPZL - P_WA_DATA-MENGE.
      ENDIF.
      P_WA_DATA-MARK = 'B'.
      EXIT.
    ENDIF.


  ELSE.


*原材料
    IF P_WA_DATA-BKTXT+0(2) <> 'GI'.
      IF P_WA_DATA-MATNR+8(1) = '1'  "钢丝φ3.0 铜丝 青铜棒 紫铜棒
*------------------------------------T 退火棉
      OR ( P_WA_DATA-MATNR+8(1) = '4' AND P_WA_DATA-BWART = '261' )
      OR ( P_WA_DATA-MATNR+8(1) = '4' AND P_WA_DATA-BWART = '262' ).
        IF P_WA_DATA-SHKZG = 'S'.
          GV_YLFT = GV_YLFT + P_WA_DATA-MENGE.
        ELSEIF P_WA_DATA-SHKZG = 'H'.
          GV_YLFT = GV_YLFT - P_WA_DATA-MENGE.
        ENDIF.
        P_WA_DATA-MARK = 'A'.
        EXIT.
      ENDIF.
    ELSE.
*-------------------------------------GI 棉块班
      IF P_WA_DATA-MATNR+8(1) = '1' OR         "---------GI 原料应该只是棉卷的
      ( P_WA_DATA-MATNR+8(1) = '3' AND P_WA_DATA-BWART = '261' ) OR
      ( P_WA_DATA-MATNR+8(1) = '3' AND P_WA_DATA-BWART = '262' ).
        IF P_WA_DATA-CHARG+0(1) = '#'.
*返工待检品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_FGDJP = GV_FGDJP + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_FGDJP = GV_FGDJP - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'F'.
          EXIT.
        ELSEIF P_WA_DATA-CHARG+0(1) = '^'.
*返工不合格品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_FGBHGP = GV_FGBHGP + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_FGBHGP = GV_FGBHGP - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'G'.
          EXIT.
        ELSE.
*原材料
          IF P_WA_DATA-SHKZG = 'S'.
            GV_YLFT = GV_YLFT + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_YLFT = GV_YLFT - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'A'.
          EXIT.
        ENDIF.
      ENDIF.
    ENDIF.


*成品 & 返工品
    IF P_WA_DATA-MATNR+8(1) = '3'
      OR P_WA_DATA-MATNR+8(1) = '4' ."退火棉(半成品)
*成品
      IF P_WA_DATA-BWART = '101'    "按订单收货
        OR P_WA_DATA-BWART = '102'   "冲销直接收货
        OR P_WA_DATA-BWART = '122'   "向供应商退货
        OR P_WA_DATA-BWART = '123'   "退货供应商冲销
        .
        IF P_WA_DATA-CHARG+0(1) = '#'.
*待检品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_DJYPZL = GV_DJYPZL + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_DJYPZL = GV_DJYPZL - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'C'.
          EXIT.
        ELSEIF P_WA_DATA-CHARG+0(1) = '^'.
*不合格品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_BHGPZL = GV_BHGPZL + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_BHGPZL = GV_BHGPZL - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'D'.
          EXIT.
        ELSE.
*合格品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_HGPZL = GV_HGPZL + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_HGPZL = GV_HGPZL - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'B'.
          EXIT.
        ENDIF.


*返工品
      ELSEIF P_WA_DATA-BWART = '261'  "工单领料
          OR P_WA_DATA-BWART = '262'  "工单退料
*          OR P_WA_DATA-BWART = '122'   "向供应商退货
*          OR P_WA_DATA-BWART = '123'  "退货供应商冲销
        .
        IF P_WA_DATA-CHARG+0(1) = '#'.
*返工待检品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_FGDJP = GV_FGDJP + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_FGDJP = GV_FGDJP - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'F'.
          EXIT.
        ELSEIF P_WA_DATA-CHARG+0(1) = '^'.
*返工不合格品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_FGBHGP = GV_FGBHGP + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_FGBHGP = GV_FGBHGP - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'G'.
          EXIT.
        ELSE.
*返工合格品
          IF P_WA_DATA-SHKZG = 'S'.
            GV_FGHGP = GV_FGHGP + P_WA_DATA-MENGE.
          ELSEIF P_WA_DATA-SHKZG = 'H'.
            GV_FGHGP = GV_FGHGP - P_WA_DATA-MENGE.
          ENDIF.
          P_WA_DATA-MARK = 'E'.
          EXIT.
        ENDIF.
      ENDIF.
    ENDIF.


  ENDIF.
ENDFORM.                    " FRM_SUBTOTAL
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_ORDERSPEC
*&---------------------------------------------------------------------*
*        取订单产品代码&描述
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_ORDERSPEC .
  DATA :
        LV_I_DATA TYPE STANDARD TABLE OF T_TAB.


  MOVE I_DATA TO LV_I_DATA.
  DELETE ADJACENT DUPLICATES FROM LV_I_DATA COMPARING AUFNR.
  CLEAR : WA_DATA,WA_SPEC.
  REFRESH I_SPEC.


  LOOP AT LV_I_DATA INTO WA_DATA.


    CLEAR : WA_SPEC.
*订单号
    WA_SPEC-AUFNR =  WA_DATA-AUFNR.


*取订单产品代码
    SELECT SINGLE PLNBEZ
      FROM AFKO
      INTO WA_SPEC-MATNR
      WHERE AUFNR = WA_SPEC-AUFNR.


*取订单产品描述
    SELECT SINGLE MAKTX
      FROM MAKT
      INTO WA_SPEC-MAKTX
      WHERE MATNR = WA_SPEC-MATNR
        AND SPRAS = SY-LANGU.
    IF SY-SUBRC <> 0.
      SELECT SINGLE MAKTX
       FROM MAKT
       INTO WA_SPEC-MAKTX
       WHERE MATNR = WA_SPEC-MATNR
         AND SPRAS = 'EN'.
    ENDIF.


*取产品层次
    SELECT SINGLE PRDHA
      FROM MARA
      INTO WA_SPEC-PRDHA
      WHERE MATNR = WA_SPEC-MATNR.
    IF WA_SPEC-PRDHA IS NOT INITIAL.
      SELECT SINGLE VTEXT
             FROM T179T
             INTO WA_SPEC-VTEXT
             WHERE PRODH = WA_SPEC-PRDHA
               AND SPRAS = SY-LANGU.
    ELSE.
      IF WA_SPEC-MATNR+8 = '1011003001'.
        WA_SPEC-VTEXT = WA_SPEC-MAKTX.
        WA_SPEC-PRDHA = '222'.
      ELSEIF WA_SPEC-MATNR+8 = '1521015603'
        OR WA_SPEC-MATNR+8 = '1521015604'.
        WA_SPEC-VTEXT = TEXT-012.
        WA_SPEC-PRDHA = '444'.
      ELSEIF WA_SPEC-MATNR+8(1) = '4'.
        WA_SPEC-VTEXT = TEXT-011.
        WA_SPEC-PRDHA = '333'.
      ENDIF.
    ENDIF.


    APPEND WA_SPEC TO I_SPEC.
  ENDLOOP.


ENDFORM.                    " FRM_GET_ORDERSPEC
*&---------------------------------------------------------------------*
*&      Form  HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*       热点事件方法
*----------------------------------------------------------------------*
*      -->P_E_ROW  text
*      -->P_E_COLUMN  text
*      -->P_ES_ROW_NO  text
*----------------------------------------------------------------------*
FORM HANDLE_HOTSPOT_CLICK  USING  P_ROW_NO TYPE LVC_S_ROID
                                  E_COLUMN_ID TYPE LVC_S_COL.


  CLEAR : WA_BTBHA.
  READ TABLE I_BTBHA INTO WA_BTBHA INDEX P_ROW_NO-ROW_ID.


  IF E_COLUMN_ID-FIELDNAME = 'ICON'.
    IF WA_BTBHA-ICON = ICON_LED_RED.
      MESSAGE '生产投入产出不平衡!' TYPE 'I'.
    ELSE.
      MESSAGE '生产投入产出平衡!' TYPE 'I'.
    ENDIF.
  ELSEIF E_COLUMN_ID-FIELDNAME = 'CPDDH'.
    SET PARAMETER ID 'ANR' FIELD WA_BTBHA-CPDDH.
    CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
  ELSEIF E_COLUMN_ID-FIELDNAME = 'BTBHA'.


  ELSEIF E_COLUMN_ID-FIELDNAME = 'MATNR'.
    SET PARAMETER ID 'MAT' FIELD WA_BTBHA-MATNR.
    CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.


*  ELSEIF E_COLUMN_ID-FIELDNAME = 'RATE'.
*    MESSAGE '投入产出比 = (原料产品产出 + 波纤)/(投入原材料 + 余料)' TYPE 'I'.
  ENDIF.


ENDFORM.                    " HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*&      Form  HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*       双击事件方法
*----------------------------------------------------------------------*
*      -->P_E_ROW  text
*      -->P_E_COLUMN  text
*----------------------------------------------------------------------*
FORM HANDLE_DOUBLE_CLICK  USING    P_ROW TYPE LVC_S_ROW
                                   P_COLUMN TYPE LVC_S_COL.
  IF P_R5 <> 'X'.
    CLEAR : WA_BTBHA.
    READ TABLE I_BTBHA INTO WA_BTBHA INDEX P_ROW-INDEX.
    IF SY-SUBRC = 0.
      IF P_COLUMN-FIELDNAME = 'YLFT'. "A
*投入原材料
        PERFORM FRM_GET_DETAIL USING 'A' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'HGPZL'."B
*合格品
        PERFORM FRM_GET_DETAIL USING 'B' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'DJYPZL'. "C
*待检品
        PERFORM FRM_GET_DETAIL USING 'C' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'BHGPZL'. "D
*不合格品
        PERFORM FRM_GET_DETAIL USING 'D' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'FGHGP'. "E
*返工合格品
        PERFORM FRM_GET_DETAIL USING 'E' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'FGDJP'. "F
*返工待检品
        PERFORM FRM_GET_DETAIL USING 'F' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'FGBHGP'. "G
*返工不合格品
        PERFORM FRM_GET_DETAIL USING 'G' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'BXFX'. "H
*波纤
        PERFORM FRM_GET_DETAIL USING 'H' WA_BTBHA.


      ELSEIF P_COLUMN-FIELDNAME = 'YUL'. "I
*余料
        PERFORM FRM_GET_DETAIL USING 'I' WA_BTBHA.


      ELSE.
        EXIT.
      ENDIF.
      IF I_DETAIL IS INITIAL.
        MESSAGE '没有任何明细条目!' TYPE 'S' DISPLAY LIKE 'E'.
        EXIT.
      ENDIF.
*明细画面
      CALL SCREEN 9001.
    ENDIF.
  ENDIF.
ENDFORM.                    " HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DETAIL
*&---------------------------------------------------------------------*
*       取明细信息
*----------------------------------------------------------------------*
*      -->P_3783   text
*----------------------------------------------------------------------*
FORM FRM_GET_DETAIL  USING  P_MARK TYPE CHAR01
                             P_WA_BTBHA TYPE T_STUC.
  DATA :
        LV_WA_DETAIL TYPE T_TAB.


  REFRESH I_DETAIL.
  CLEAR : LV_WA_DETAIL , WA_DATA.
  IF P_R1 = 'X'.
    IF P_WA_BTBHA-CPDDH <> '合计'.
      LOOP AT I_DATA INTO WA_DATA WHERE MARK = P_MARK
                                    AND BKTXT = P_WA_BTBHA-BTBHA
                                    AND AUFNR = P_WA_BTBHA-CPDDH.
        MOVE-CORRESPONDING WA_DATA TO LV_WA_DETAIL.
        APPEND LV_WA_DETAIL TO I_DETAIL.
      ENDLOOP.
    ELSE.
      LOOP AT I_DATA INTO WA_DATA WHERE MARK = P_MARK
                                    AND BKTXT = P_WA_BTBHA-BTBHA.
        MOVE-CORRESPONDING WA_DATA TO LV_WA_DETAIL.
        APPEND LV_WA_DETAIL TO I_DETAIL.
      ENDLOOP.
    ENDIF.
  ELSEIF P_R2 = 'X'.
    IF P_WA_BTBHA-BTBHA <> '合计'.
      LOOP AT I_DATA INTO WA_DATA WHERE MARK = P_MARK
                                    AND AUFNR = P_WA_BTBHA-CPDDH
                                    AND BKTXT = P_WA_BTBHA-BTBHA.
        MOVE-CORRESPONDING WA_DATA TO LV_WA_DETAIL.
        APPEND LV_WA_DETAIL TO I_DETAIL.
      ENDLOOP.
    ELSE.
      LOOP AT I_DATA INTO WA_DATA WHERE MARK = P_MARK
                                    AND AUFNR = P_WA_BTBHA-CPDDH.
        MOVE-CORRESPONDING WA_DATA TO LV_WA_DETAIL.
        APPEND LV_WA_DETAIL TO I_DETAIL.
      ENDLOOP.
    ENDIF.
  ELSEIF P_R3 = 'X'.
    LOOP AT I_DATA INTO WA_DATA WHERE MARK = P_MARK
                                  AND BKTXT = P_WA_BTBHA-BTBHA.
      MOVE-CORRESPONDING WA_DATA TO LV_WA_DETAIL.
      APPEND LV_WA_DETAIL TO I_DETAIL.
    ENDLOOP.
  ELSEIF P_R4 = 'X'.
    LOOP AT I_DATA INTO WA_DATA WHERE MARK = P_MARK
                                  AND AUFNR = P_WA_BTBHA-CPDDH.
      MOVE-CORRESPONDING WA_DATA TO LV_WA_DETAIL.
      APPEND LV_WA_DETAIL TO I_DETAIL.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " FRM_GET_DETAIL
*&---------------------------------------------------------------------*
*&      Module  STATUS_9001  OUTPUT
*&---------------------------------------------------------------------*
*       9001 PBO
*----------------------------------------------------------------------*
MODULE STATUS_9001 OUTPUT.
  SET PF-STATUS '9000'.
  SET TITLEBAR 'TITLE' WITH '生产投入产出平衡检查及指标分析 - 明细'.
  PERFORM FRM_INITIAL_CONTAINER.
ENDMODULE.                 " STATUS_9001  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       9001 PAI
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9001 INPUT.
  CASE OK_CODE1.
    WHEN 'BACK' OR 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.
    WHEN OTHERS .
  ENDCASE.
  CLEAR : OK_CODE1.
ENDMODULE.                 " USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_INITIAL_CONTAINER
*&---------------------------------------------------------------------*
*       初始化容器对象
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INITIAL_CONTAINER .
  IF GV_CONTAINER1 IS INITIAL.
    CREATE OBJECT GV_CONTAINER1
      EXPORTING
        CONTAINER_NAME              = GV_CNAME1
      EXCEPTIONS
        CNTL_ERROR                  = 1
        CNTL_SYSTEM_ERROR           = 2
        CREATE_ERROR                = 3
        LIFETIME_ERROR              = 4
        LIFETIME_DYNPRO_DYNPRO_LINK = 5.
  ENDIF.


  IF GV_DETAIL IS INITIAL.
*创建ALV容器
    CREATE OBJECT GV_DETAIL
      EXPORTING
        I_PARENT          = GV_CONTAINER1
      EXCEPTIONS
        ERROR_CNTL_CREATE = 1
        ERROR_CNTL_INIT   = 2
        ERROR_CNTL_LINK   = 3
        ERROR_DP_CREATE   = 4.


*ALV的设置
    PERFORM FRM_ALV_LIST_DETAIL.
  ENDIF.


*AVL的显示
  CALL METHOD GV_DETAIL->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_LAYOUT                     = GV_LAYOUT1
*        I_SAVE                        = 'A'
    CHANGING
      IT_OUTTAB                     = I_DETAIL
      IT_FIELDCATALOG               = I_FCAT
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        = 4.


ENDFORM.                    " FRM_INITIAL_CONTAINER
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_LIST_DETAIL
*&---------------------------------------------------------------------*
*       明细ALV设置
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ALV_LIST_DETAIL .
*-------------------Layout
  GV_LAYOUT1-SEL_MODE = 'D'.
  GV_LAYOUT1-CWIDTH_OPT = 'X'.
  GV_LAYOUT1-ZEBRA = 'X' .
  GV_LAYOUT1-GRID_TITLE = '明细' .
  GV_LAYOUT1-SMALLTITLE = 'X' .


*------------------Fieldcat
  DATA:
          LV_WA_FCAT TYPE LVC_S_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'GROUP'.
  LV_WA_FCAT-COLTEXT = '班组'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'REMARK'.
  LV_WA_FCAT-COLTEXT = '标志'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'CHARG'.
  LV_WA_FCAT-COLTEXT = '批次'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'AUFNR'.
  LV_WA_FCAT-COLTEXT = '生产订单号'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'BKTXT'.
  LV_WA_FCAT-COLTEXT = '凭证抬头文本'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'MATNR'.
  LV_WA_FCAT-COLTEXT = '物料'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'MAKTX'.
  LV_WA_FCAT-COLTEXT = '物料描述'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'SHKZG'.
  LV_WA_FCAT-COLTEXT = 'D/C'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'BWART'.
  LV_WA_FCAT-COLTEXT = 'MvT'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'MENGE'.
  LV_WA_FCAT-COLTEXT = '数量(+/-)'.
  LV_WA_FCAT-QFIELDNAME = 'MEINS'.
  LV_WA_FCAT-DO_SUM = 'X'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'MEINS'.
  LV_WA_FCAT-COLTEXT = 'BUn'.
  LV_WA_FCAT-REF_FIELD = 'MEINS'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'DMBTR'.
  LV_WA_FCAT-COLTEXT = '本位币金额(+/-)'.
  LV_WA_FCAT-QFIELDNAME = 'WAERS'.
  LV_WA_FCAT-DO_SUM = 'X'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'WAERS'.
  LV_WA_FCAT-COLTEXT = '货币'.
  LV_WA_FCAT-REF_FIELD = 'WAERS'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'MJAHR'.
  LV_WA_FCAT-COLTEXT = 'MatYr'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'MBLNR'.
  LV_WA_FCAT-COLTEXT = '物料凭证'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'ZEILE'.
  LV_WA_FCAT-COLTEXT = '项目'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'BUDAT'.
  LV_WA_FCAT-COLTEXT = '过账日期'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'LGORT'.
  LV_WA_FCAT-COLTEXT = '库位'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'SOBKZ'.
  LV_WA_FCAT-COLTEXT = 'S'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'KDAUF'.
  LV_WA_FCAT-COLTEXT = '销售订单号'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'KDPOS'.
  LV_WA_FCAT-COLTEXT = 'SO项目'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'RSNUM'.
  LV_WA_FCAT-COLTEXT = '预留编号'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'RSPOS'.
  LV_WA_FCAT-COLTEXT = '项'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'USNAM'.
  LV_WA_FCAT-COLTEXT = '用户名称'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'SAKTO'.
  LV_WA_FCAT-COLTEXT = '总账科目'.
  APPEND LV_WA_FCAT TO I_FCAT.


  CLEAR LV_WA_FCAT.
  LV_WA_FCAT-FIELDNAME = 'WERKS'.
  LV_WA_FCAT-COLTEXT = '工厂'.
  APPEND LV_WA_FCAT TO I_FCAT.


ENDFORM.                    " FRM_ALV_LIST_DETAIL
*&---------------------------------------------------------------------*
*&      Form  FRM_BY_PRODUCT_LEVEL
*&---------------------------------------------------------------------*
*       按产品层次物料代码
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_BY_PRODUCT_LEVEL .
  DATA  :
*临时存放的内表
        LV_I_PRDHA TYPE STANDARD TABLE OF T_PRDHA,
        LV_WA_PRDHA TYPE T_PRDHA,
        LV_I_TEMP TYPE STANDARD TABLE OF T_PRDHA,
        LV_WA_TEMP TYPE T_PRDHA.
  DATA :
*存放比较的订单号
         LV_AUFNR TYPE AUFNR.


*按订单排序
  SORT I_DATA BY AUFNR .


*取订单产品规格信息
  PERFORM FRM_GET_ORDERSPEC.


*处理查询结果到输出内表:I_BTBHA
  READ TABLE I_DATA INTO WA_DATA INDEX 1.
  LV_AUFNR = WA_DATA-AUFNR.
  CLEAR : WA_DATA.
  REFRESH : I_BTBHA.


  LOOP AT I_DATA INTO WA_DATA.
    IF LV_AUFNR = WA_DATA-AUFNR.
*同一个订单
      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.
    ELSE.
*不同订单
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = WA_DATA-BKTXT.  "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      WA_BTBHA-PRDHA = WA_SPEC-PRDHA.  "产品层次
      WA_BTBHA-VTEXT = WA_SPEC-VTEXT.  "层次描述
      APPEND WA_BTBHA TO I_BTBHA.


      LV_AUFNR = WA_DATA-AUFNR.
      CLEAR : GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料


      PERFORM FRM_SUBTOTAL CHANGING WA_DATA.
    ENDIF.


    MODIFY I_DATA FROM WA_DATA.


    AT LAST.
      CLEAR : WA_SPEC.
      READ TABLE I_SPEC INTO WA_SPEC WITH KEY AUFNR = LV_AUFNR.
      CLEAR : WA_BTBHA.
      WA_BTBHA-BTBHA = WA_DATA-BKTXT.  "台班班号
      WA_BTBHA-CPDDH = LV_AUFNR.       "产品订单号
      WA_BTBHA-YLFT = GV_YLFT.         "投入原材料
      WA_BTBHA-HGPZL = GV_HGPZL.       "合格品
      WA_BTBHA-DJYPZL = GV_DJYPZL.     "待检品
      WA_BTBHA-BHGPZL = GV_BHGPZL.     "不合格品
      WA_BTBHA-FGHGP = GV_FGHGP.       "返工合格品
      WA_BTBHA-FGDJP = GV_FGDJP.       "返工待检品
      WA_BTBHA-FGBHGP = GV_FGBHGP.     "返工不合格品
      WA_BTBHA-BXFX  = GV_BXFX.        "波纤
      WA_BTBHA-YUL = GV_YUL.           "余料
      WA_BTBHA-MAKTX = WA_SPEC-MAKTX.  "订单产品名称
      WA_BTBHA-MATNR = WA_SPEC-MATNR.  "订单产品代码
      WA_BTBHA-PRDHA = WA_SPEC-PRDHA.  "产品层次
      WA_BTBHA-VTEXT = WA_SPEC-VTEXT.  "层次描述
      APPEND WA_BTBHA TO I_BTBHA.


      CLEAR : LV_AUFNR,
              GV_YLFT ,     "投入原材料
              GV_HGPZL ,    "合格品
              GV_DJYPZL ,   "待检品
              GV_BHGPZL ,   "不合格品
              GV_FGHGP ,    "返工合格品
              GV_FGDJP ,    "返工待检品
              GV_FGBHGP ,   "返工不合格品
              GV_BXFX ,     "波纤
              GV_YUL .      "余料
    ENDAT.
  ENDLOOP.


*小时产量的计算 -- 订单
  LOOP AT I_BTBHA INTO WA_BTBHA.
    REFRESH I_CONFIRM.
    SELECT AUFNR LTXA1 BUDAT LOGRP ISM01 ISM02 ISM03
         INTO CORRESPONDING FIELDS OF TABLE I_CONFIRM
        FROM AFRU
       WHERE AUFNR = WA_BTBHA-CPDDH
         AND BUDAT BETWEEN GV_START AND GV_FINISH
         AND BUDAT IN S_BUDAT
         AND STOKZ <> 'X'
         AND STZHL = ''.
    IF SY-SUBRC = 0.
      LOOP AT I_CONFIRM INTO WA_CONFIRM.
*机器运行时间
        WA_BTBHA-TIMES = WA_BTBHA-TIMES + WA_CONFIRM-ISM01.
*工时
        WA_BTBHA-HOURS = WA_BTBHA-HOURS + WA_CONFIRM-ISM02.
      ENDLOOP.
    ENDIF.
    WA_BTBHA-UNITS = 'H'.
    MODIFY I_BTBHA FROM WA_BTBHA.
  ENDLOOP.


*选择屏幕输入条件筛选
  IF S_PRDHA IS NOT INITIAL.
    DELETE I_BTBHA WHERE PRDHA NOT IN S_PRDHA.
  ENDIF.


  IF S_MATNR IS NOT INITIAL.
    DELETE I_BTBHA WHERE MATNR NOT IN S_MATNR.
  ENDIF.


  REFRESH LV_I_PRDHA.
  LOOP AT I_BTBHA INTO WA_BTBHA.
    MOVE-CORRESPONDING WA_BTBHA TO LV_WA_PRDHA.
    APPEND  LV_WA_PRDHA TO LV_I_PRDHA.
  ENDLOOP.


  SORT LV_I_PRDHA BY PRDHA MATNR.
  REFRESH LV_I_TEMP.
  DATA : LV_CHAR TYPE CHAR200.
  LOOP AT LV_I_PRDHA INTO LV_WA_PRDHA.
    MOVE-CORRESPONDING LV_WA_PRDHA TO LV_WA_TEMP.
    AT END OF MATNR.
      SUM.
      LV_WA_PRDHA-PRDHA = LV_WA_TEMP-PRDHA.
      LV_WA_PRDHA-VTEXT = LV_WA_TEMP-VTEXT.
      LV_WA_PRDHA-MATNR = LV_WA_TEMP-MATNR.
      LV_WA_PRDHA-MAKTX = LV_WA_TEMP-MAKTX.
      LV_WA_PRDHA-BTBHA = ''.
      LV_WA_PRDHA-CPDDH = ''.
      LV_WA_PRDHA-DBCCL = ''.
      LV_WA_PRDHA-DBHSL = ''.
      LV_WA_PRDHA-RATE = ''.
      LV_WA_PRDHA-ICON = ''.
      LV_WA_PRDHA-ROWCOLOR = ''.
      LV_WA_PRDHA-UNITS = 'H'.


      APPEND LV_WA_PRDHA TO LV_I_TEMP.
    ENDAT.


    AT END OF PRDHA.
      SUM.
      CLEAR LV_CHAR.
      CONCATENATE LV_WA_TEMP-PRDHA '合计' INTO LV_CHAR.
      LV_WA_PRDHA-PRDHA = LV_WA_TEMP-PRDHA.
      LV_WA_PRDHA-VTEXT = LV_WA_TEMP-VTEXT.
      LV_WA_PRDHA-MATNR = ''.
      LV_WA_PRDHA-MAKTX = LV_CHAR.
      LV_WA_PRDHA-BTBHA = ''.
      LV_WA_PRDHA-CPDDH = ''.
      LV_WA_PRDHA-DBCCL = ''.
      LV_WA_PRDHA-DBHSL = ''.
      LV_WA_PRDHA-RATE = ''.
      LV_WA_PRDHA-ICON = ''.
      LV_WA_PRDHA-ROWCOLOR = 'C311'.
      LV_WA_PRDHA-UNITS = 'H'.


      APPEND LV_WA_PRDHA TO LV_I_TEMP.
    ENDAT.
  ENDLOOP.


  REFRESH I_BTBHA.
  REFRESH LV_I_PRDHA.
  LOOP AT LV_I_TEMP INTO LV_WA_TEMP.
    MOVE-CORRESPONDING LV_WA_TEMP TO WA_BTBHA.
    APPEND WA_BTBHA TO I_BTBHA.
  ENDLOOP.






ENDFORM.                    " FRM_BY_PRODUCT_LEVEL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 C 语言存档登录注册界面代码: ```c #include <stdio.h> #include <string.h> struct User { char username[50]; char password[50]; }; void registerUser(struct User users[], int *numUsers) { struct User newUser; printf("Enter username: "); scanf("%s", newUser.username); for (int i = 0; i < *numUsers; i++) { if (strcmp(users[i].username, newUser.username) == 0) { printf("Username already exists. Please choose a different username.\n"); return; } } printf("Enter password: "); scanf("%s", newUser.password); users[*numUsers] = newUser; (*numUsers)++; printf("Registration successful!\n"); } void loginUser(struct User users[], int numUsers) { char username[50], password[50]; printf("Enter username: "); scanf("%s", username); printf("Enter password: "); scanf("%s", password); for (int i = 0; i < numUsers; i++) { if (strcmp(users[i].username, username) == 0 && strcmp(users[i].password, password) == 0) { printf("Login successful!\n"); return; } } printf("Invalid username or password.\n"); } int main() { struct User users[100]; int numUsers = 0; int choice; do { printf("1. Register\n"); printf("2. Login\n"); printf("3. Exit\n"); printf("Enter choice: "); scanf("%d", &choice); switch (choice) { case 1: registerUser(users, &numUsers); break; case 2: loginUser(users, numUsers); break; case 3: printf("Exiting program.\n"); break; default: printf("Invalid choice.\n"); break; } } while (choice != 3); return 0; } ``` 该程序使用一个结构体数组来存储用户信息。用户可以选择注册或登录。如果用户选择注册,则会提示用户输入用户名和密码,并将该用户添加到结构体数组中。如果用户选择登录,则会提示用户输入用户名和密码,并在结构体数组中查找是否存在匹配的用户。如果存在,则登录成功,否则显示错误消息。程序使用一个循环来重复显示用户菜单,直到用户选择退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP剑客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值