• INCLUDE OOALV

    • MAIN
    *****************************************************************
    *  System      :
    *  Module      :  PM
    *  Program ID  :  ZPMR005
    *  Program     :  维修订单打印
    *  Author      :  刘华
    *  Date        :   20211115
    *  Description :  维修订单打印
    *****************************************************************
    *  Modified Recorder :
    *  Date         C#NO        Author                Content
    *  -----------  -------    ------------------     ---------------
    *  修改日期     C票或变更文档ID   修改者              修改内容
    
    *****************************************************************
    REPORT ZPMR005.
    
    *----------------------------------------------------------------------*
    * <1.1-声明 包含程序> INCLUDE PROGRAMS                                  *
    *----------------------------------------------------------------------*
    ***********《所有全局变量、类都写在  TOP INCLUDE 程序中》**************
    INCLUDE ZPMR005TOP.
    ***********《选择屏幕     SEL INCLUDE 程序中》*****************
    INCLUDE ZPMR005SEL.
    ************《PBO PAI 模块》*****************
    INCLUDE ZPMR005O01.
    INCLUDE ZPMR005I01.
    ************《所有逻辑代码都写在     F0* INCLUDE 程序中》*****************
    INCLUDE ZPMR005F01.
    
    *&---------------------------------------------------------------------*
    * INITIALIZATION 初始化
    INITIALIZATION.
      S_ERDAT-SIGN   = 'I'.
      S_ERDAT-OPTION = 'EQ'.
      S_ERDAT-LOW    = SY-DATUM.
      S_ERDAT-HIGH   = SY-DATUM.
      APPEND S_ERDAT TO S_ERDAT.
      CLEAR S_ERDAT.
    AT SELECTION-SCREEN OUTPUT.
    
    *&---------------------------------------------------------------------*
    * AT SELECTION-SCREEN
    *&---------------------------------------------------------------------*
    AT SELECTION-SCREEN.
    
    *&---------------------------------------------------------------------*
    * START-OF-SELECTION
    *&---------------------------------------------------------------------*
    START-OF-SELECTION.
    
    *  "必填校验
    *  PERFORM frm_field_obligatory.
      "逻辑处理
      PERFORM FRM_GET_DATA.
      "调用屏幕
      CALL SCREEN 9000.
    
    *ENDIF.
    
    END-OF-SELECTION.
    
    
    • TOP
    *&---------------------------------------------------------------------*
    *& 包含               ZPMR003TOP
    *&---------------------------------------------------------------------*
    
    TABLES:AFIH,AUFK,VBRK,VBAP,VBRP,LIPS,LIKP,PA0001.
    INCLUDE <ICON>.
    TYPE-POOLS: SLIS.
    DATA: GV_CONTAINER     TYPE REF TO CL_GUI_DOCKING_CONTAINER,
          GV_ALV           TYPE REF TO CL_GUI_ALV_GRID ,             "ALV网格
          GV_ROW_ALV       TYPE REF TO CL_GUI_ALV_GRID_BASE,
          GT_EXCLUDE       TYPE UI_FUNCTIONS,                        "用于去掉不要的菜单栏
          GV_INDEX_COLUMNS TYPE LVC_T_COL,                            "选择列
          GT_FIELDCAT      TYPE LVC_T_FCAT,                          "FCAT
          GS_FIELDCAT      TYPE LINE OF LVC_T_FCAT,                  "FCAT
          GT_F4            TYPE LVC_T_F4 WITH HEADER LINE,           "搜索帮助
          GS_LAYOUT        TYPE LVC_S_LAYO ,                         "布局结构
          GS_VARIANT       TYPE DISVARIANT,                          "字段格式保存
          GT_SORT          TYPE LVC_T_SORT,                          "用于排序
          GT_INDEX         TYPE LVC_T_COL,                           "选择列
          GT_FILT          TYPE LVC_T_FILT.                          "用于过滤
    
    DATA: GT_NU3_ROWS TYPE  LVC_T_ROW,
          GT_NU3_NO   TYPE  LVC_T_ROID,
          GS_NU3_NO   TYPE  LVC_S_ROID.
    
    DATA:GV_LINES     TYPE I.
    DATA:GS_STABLE    TYPE LVC_S_STBL.                              "刷新稳定
    DATA:G_FLAG TYPE C.
    *&---------------------------------------------------------------------*
    * DEFINE VARIABLE 变量
    *&---------------------------------------------------------------------*
    DATA:GV_OK_CODE LIKE SY-UCOMM.
    
    *&---------------------------------------------------------------------*
    * DEFIEN INNER TABLE 内表
    *&---------------------------------------------------------------------*
    DATA:BEGIN OF GS_DATA,
    *       CHECK     TYPE C,
           AUFNR   TYPE AUFK-AUFNR      ,                " 订单编码
           KTEXT   TYPE AUFK-KTEXT      ,                " 订单描述
           ERDAT   TYPE AUFK-ERDAT      ,                " 创建日期
           VAPLZ   TYPE AUFK-VAPLZ      ,                " 工作中心
           INGPR   TYPE AFIH-INGPR      ,                " 计划员组
           IWERK   TYPE AFIH-IWERK      ,                " 工厂
           BEBER   TYPE ILOA-BEBER      ,                " 厂区
           TPLNR   TYPE ILOA-TPLNR    ,                  " 功能位置
           PLTXT   TYPE IFLOTX-PLTXT  ,                  " 功能位置描述
           EQUNR   TYPE AFIH-EQUNR    ,                  " 设备编码
           EQKTX   TYPE EQKT-EQKTX    ,                  " 设备描述
           ANLNR   TYPE ILOA-ANLNR    ,                  " 资产编码
           TXT04   TYPE TJ30T-TXT04   ,                  " 订单状态
           ILOAN   TYPE AFIH-ILOAN   ,                  "
           OBJNR   TYPE AUFK-OBJNR   ,                  "
           RSNUM   TYPE AFKO-RSNUM   ,                  "
           BUKRS   TYPE AUFK-BUKRS   ,                  "
           ERFZEIT TYPE AUFK-ERFZEIT   ,                  "
           AUART TYPE AUFK-AUART   ,                  "
           QMNUM TYPE AFIH-QMNUM   ,                  "
           GEWRK TYPE EQUZ-GEWRK   ,                  "
         END OF GS_DATA.
    
    DATA:GT_DATA LIKE TABLE OF GS_DATA.
    
    *----------------------------------------------------------------------*
    * DEFINE THE MACROS/宏
    *----------------------------------------------------------------------*
    DEFINE DF_SET_FIELDCAT.
      CLEAR GS_FIELDCAT .
    
      GS_FIELDCAT-FIELDNAME = &1."内表的字段
    
      GS_FIELDCAT-OUTPUTLEN = &2."输出长度
      GS_FIELDCAT-COLTEXT   = &3."列标题
      GS_FIELDCAT-NO_ZERO   = &4."关键字列
      GS_FIELDCAT-CHECKBOX  = &5 ."作为复选框
      GS_FIELDCAT-REF_TABLE = &6."参照表
      GS_FIELDCAT-REF_FIELD = &7."参照字段
      GS_FIELDCAT-CONVEXIT      = &8."可编辑
      GS_FIELDCAT-DD_OUTLEN      = &9."可编辑
    *  GS_FIELDCAT-DECIMALS_O = ."小数位长度
    *  GS_FIELDCAT-EMPHASIZE = ."列颜色
    *  GS_FIELDCAT-EDIT_MASK = ."转换例程
    *  GS_FIELDCAT-DO_SUM   = .  "汇总
    *  GS_FIELDCAT-NO_ZERO  = .  "不输出0
    *  GS_FIELDCAT-STYLE    = .  "样式
    *  GS_FIELDCAT-FIX_COLUMN = ."固定列
      APPEND GS_FIELDCAT TO GT_FIELDCAT[] .
    END-OF-DEFINITION.
    
    *---------------------------------------------------------------------*
    * 定义 类
    *---------------------------------------------------------------------*
    CLASS LCL_EVENT_HANDLER DEFINITION.
      PUBLIC SECTION.
        METHODS:
          HANDLE_TOOLBAR           "自定义工具栏
            FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
            IMPORTING E_OBJECT E_INTERACTIVE,
          HANDLE_USER_COMMAND       "自定义按钮
            FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
            IMPORTING E_UCOMM,
    *--基于单元格的效验
          HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
            IMPORTING ER_DATA_CHANGED  E_ONF4 E_ONF4_BEFORE E_ONF4_AFTER E_UCOMM,
    *--在数据修改完成之后
          HANDLE_DATA_CHANGED_FINISHED FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
            IMPORTING E_MODIFIED ET_GOOD_CELLS ,
    *--搜索帮助
          HANDLE_ONF4 FOR EVENT ONF4 OF CL_GUI_ALV_GRID IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
        METHODS HANDLE_DOUBLE_CLICK
          FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
          IMPORTING E_ROW E_COLUMN ES_ROW_NO.
    ENDCLASS.
    
    • SELECT
    *&---------------------------------------------------------------------*
    *& 包含               ZPMR003SEL
    *&---------------------------------------------------------------------*
    
    * DEFINE SCREEN  选择屏幕
    *&---------------------------------------------------------------------*
    SELECTION-SCREEN BEGIN OF BLOCK SCST WITH FRAME TITLE TEXT-001.
    
    SELECT-OPTIONS:S_WERK FOR AFIH-IWERK OBLIGATORY MEMORY ID IWK,
                   S_AUFNR FOR AUFK-AUFNR MEMORY ID ANR,
                   S_ERDAT FOR AUFK-ERDAT OBLIGATORY,
                   S_INGPR FOR AFIH-INGPR .
    SELECTION-SCREEN END OF BLOCK SCST.
    
    • PBO
    *&---------------------------------------------------------------------*
    *& 包含               ZPMR003O01
    *&---------------------------------------------------------------------*
    MODULE STATUS_9000 OUTPUT.
     SET PF-STATUS 'S001'.
     SET TITLEBAR 'T001'.
    ENDMODULE.
    *&---------------------------------------------------------------------*
    *& Module DISPLAY_ALV OUTPUT
    *&---------------------------------------------------------------------*
    *&
    *&---------------------------------------------------------------------*
    MODULE DISPLAY_ALV OUTPUT.
    PERFORM FRM_DISPLAY_ALV.
    ENDMODULE.
    
    • PAI
    *&---------------------------------------------------------------------*
    *& 包含               ZPMR003I01
    *&---------------------------------------------------------------------*
    MODULE user_command_9000 INPUT.
      gv_ok_code = sy-ucomm.
    
      DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
      DATA: lv_index TYPE i.
      CASE gv_ok_code.
        WHEN '&F03' OR '&F15' OR '&F12'.
          LEAVE TO SCREEN 0.
        WHEN OTHERS.
      ENDCASE.
    
      CLEAR:gv_ok_code.
    
    ENDMODULE.
    
    • FI
    *&---------------------------------------------------------------------*
    *& 包含               ZPMR003F01
    *&---------------------------------------------------------------------*
    *&---------------------------------------------------------------------*
    *& Form FRM_GET_DATA
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM FRM_GET_DATA .
      SELECT  AUFK~AUFNR,
              AUFK~KTEXT,
              AUFK~ERDAT,
              AUFK~VAPLZ,
              AUFK~OBJNR,
              AUFK~ERFZEIT,
              AUFK~BUKRS,
              AFIH~INGPR,
              AFIH~IWERK,
              AFIH~EQUNR,
              AFIH~ILOAN,
              AFIH~QMNUM,
    *          AFIH~GEWRK,
              AUFK~AUART,
              EQKT~EQKTX
      INTO CORRESPONDING FIELDS OF TABLE @GT_DATA
      FROM AUFK
      INNER JOIN AFIH ON AUFK~AUFNR = AFIH~AUFNR
      LEFT JOIN EQKT ON EQKT~EQUNR = AFIH~EQUNR
      WHERE AFIH~IWERK IN @S_WERK
      AND   AUFK~AUFNR IN @S_AUFNR
      AND   AUFK~ERDAT IN @S_ERDAT
      AND   AFIH~INGPR IN @S_INGPR
     AND   AUFK~AUART IN ('GD01','GD02','GD03','GD04' ).
    
      SELECT GT_DATA~EQUNR,
             GT_DATA~AUFNR,
             ILOA~ILOAN,
             ILOA~BEBER
      FROM ILOA
      INNER JOIN EQUZ ON ILOA~ILOAN = EQUZ~ILOAN
      INNER JOIN @GT_DATA AS GT_DATA ON GT_DATA~EQUNR = EQUZ~EQUNR AND EQUZ~DATBI = '99991231'
      INTO TABLE @DATA(LT_ILOA).
    
      SELECT GT_DATA~EQUNR,
             GT_DATA~AUFNR,
             ILOA~ILOAN,
             ILOA~TPLNR,
             IFLOTX~PLTXT,
             ILOA~ANLNR
     FROM ILOA
     INNER JOIN @GT_DATA AS GT_DATA ON GT_DATA~ILOAN = ILOA~ILOAN
     LEFT  JOIN IFLOTX ON ILOA~TPLNR = IFLOTX~TPLNR
     INTO TABLE @DATA(LT_ILOA1).
    
      SELECT GT_DATA~AUFNR,
             GT_DATA~OBJNR,
             TJ30T~STSMA,
             TJ30T~TXT04
     FROM JEST
     INNER JOIN @GT_DATA AS GT_DATA ON GT_DATA~OBJNR = JEST~OBJNR
     INNER  JOIN JSTO ON  JSTO~OBJNR = GT_DATA~OBJNR
     INNER JOIN TJ30T ON TJ30T~ESTAT = JEST~STAT AND TJ30T~STSMA = JSTO~STSMA
     WHERE JEST~INACT IS INITIAL
     INTO TABLE @DATA(LT_TJ30T).
    
      IF GT_DATA IS NOT INITIAL.
        SELECT RSNUM,
               AUFNR
         INTO TABLE @DATA(LT_AFKO)
         FROM AFKO
         FOR ALL ENTRIES IN @GT_DATA
         WHERE AUFNR = @GT_DATA-AUFNR.
      ENDIF.
      SORT LT_ILOA BY AUFNR EQUNR.
      SORT LT_ILOA BY AUFNR ILOAN.
      SORT LT_TJ30T BY AUFNR OBJNR.
      SORT LT_AFKO BY AUFNR.
      LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<FS_DATA>).
    
        AUTHORITY-CHECK OBJECT 'ZPM001'
        ID 'ZIWERK' FIELD <FS_DATA>-IWERK
        ID 'ZINGRP' FIELD <FS_DATA>-INGPR.
        IF SY-SUBRC <> 0.
          DELETE GT_DATA INDEX LV_INDEX.
          CONTINUE.
    *     Implement a suitable exception handling here
        ENDIF.
        READ TABLE LT_ILOA INTO DATA(LS_ILOA) WITH KEY AUFNR = <FS_DATA>-AUFNR EQUNR = <FS_DATA>-EQUNR BINARY SEARCH.
        IF SY-SUBRC = 0.
          <FS_DATA>-BEBER = LS_ILOA-BEBER.
        ENDIF.
    
        READ TABLE LT_ILOA1 INTO DATA(LS_ILOA1) WITH KEY AUFNR = <FS_DATA>-AUFNR ILOAN = <FS_DATA>-ILOAN BINARY SEARCH.
        IF SY-SUBRC = 0.
          <FS_DATA>-TPLNR = LS_ILOA1-TPLNR.
          CALL FUNCTION 'CONVERSION_EXIT_TPLNR_OUTPUT'
            EXPORTING
              INPUT  = <FS_DATA>-TPLNR
            IMPORTING
              OUTPUT = <FS_DATA>-TPLNR.
          <FS_DATA>-ANLNR = LS_ILOA1-ANLNR.
          <FS_DATA>-PLTXT = LS_ILOA1-PLTXT.
        ENDIF.
    
        READ TABLE LT_TJ30T INTO DATA(LS_TJ30T) WITH KEY AUFNR = <FS_DATA>-AUFNR OBJNR = <FS_DATA>-OBJNR BINARY SEARCH.
        IF SY-SUBRC = 0.
          <FS_DATA>-TXT04 = LS_TJ30T-TXT04.
        ENDIF.
    
        READ TABLE LT_AFKO INTO DATA(LS_AFKO) WITH KEY AUFNR = <FS_DATA>-AUFNR BINARY SEARCH.
        IF SY-SUBRC = 0.
          <FS_DATA>-RSNUM = LS_AFKO-RSNUM.
        ENDIF.
        SELECT SINGLE GEWRK INTO @DATA(LV_GEWRK) FROM EQUZ WHERE EQUNR = @<FS_DATA>-EQUNR.
        IF SY-SUBRC = 0.
          <FS_DATA>-GEWRK = LV_GEWRK.
        ENDIF.
      ENDLOOP.
      SORT GT_DATA DESCENDING  BY ERDAT ERFZEIT.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& Form FRM_DISPLAY_ALV
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM FRM_DISPLAY_ALV .
      IF  GV_ALV IS INITIAL .                                                         "ALV对象如果为空,则生成对象,把ALV放入容器中
        CREATE OBJECT GV_CONTAINER
          EXPORTING
            REPID     = SY-REPID
            DYNNR     = '9000'
            EXTENSION = 2050
            SIDE      = CL_GUI_DOCKING_CONTAINER=>PROPERTY_FLOATING.
    
        CREATE OBJECT GV_ALV
          EXPORTING
            I_PARENT = GV_CONTAINER.
    
        PERFORM FRM_BUILD_FIELDCAT.
        PERFORM FRM_EXCLUDE_TB_FUNCTIONS CHANGING GT_EXCLUDE.        "去掉不用的菜单按钮
        PERFORM FRM_PREPARE_LAYOUT       CHANGING GS_LAYOUT .        "获取样式
        PERFORM FRM_EVENTLOAD.                                        "读取事件(总)
    *    PERFORM FRM_ADJUST_EDITTABLES .                              "调整可更改的单元格
    *    PERFORM FRM_INIT_STYLE_TAB .
    *-----显示ALV-------------------------------------------
        CLEAR GS_VARIANT.
        GS_VARIANT = SY-REPID.
    
        CALL METHOD GV_ALV->SET_TABLE_FOR_FIRST_DISPLAY
          EXPORTING
            IS_LAYOUT                     = GS_LAYOUT
            IT_TOOLBAR_EXCLUDING          = GT_EXCLUDE
            IS_VARIANT                    = GS_VARIANT
            I_SAVE                        = 'A'
          CHANGING
            IT_OUTTAB                     = GT_DATA[]
            IT_FIELDCATALOG               = GT_FIELDCAT
          EXCEPTIONS
            INVALID_PARAMETER_COMBINATION = 1
            PROGRAM_ERROR                 = 2
            TOO_MANY_LINES                = 3
            OTHERS                        = 4.
        IF SY-SUBRC <> 0.
    *    Implement suitable error handling here
        ENDIF.
        CALL METHOD GV_ALV->REGISTER_EDIT_EVENT
          EXPORTING
            I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
    
      ELSE .
    *----------------------------刷新ALV----------------------
    
        PERFORM FRM_REFURBISH_ALV.                          "刷新ALV
      ENDIF .
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *& FORM FRM_REFURBISH_ALV
    *&---------------------------------------------------------------------*
    *& TEXT
    *&---------------------------------------------------------------------*
    *& -->  P1        TEXT
    *& <--  P2        TEXT
    *&---------------------------------------------------------------------*
    FORM FRM_REFURBISH_ALV.
    *  PERFORM FRM_ADJUST_EDITTABLES .                              " 调整可更改的单元格
    *----------------------------刷新ALV----------------------
      GS_STABLE-ROW = 'X'.
      GS_STABLE-COL = 'X'.
      CALL METHOD GV_ALV->REFRESH_TABLE_DISPLAY
        EXPORTING
          IS_STABLE = GS_STABLE
        EXCEPTIONS
          FINISHED  = 1
          OTHERS    = 2.
      IF SY-SUBRC <> 0.
    *  Implement suitable error handling here
      ENDIF.
    ENDFORM.
    
    FORM FRM_BUILD_FIELDCAT .
    
      DATA:LV_FIELDNAME  TYPE CHAR20,
           LV_FIELDVALUE TYPE CHAR20,
           LV_COLINDEX   TYPE CHAR2.
    
      REFRESH: GT_FIELDCAT .
    
      DF_SET_FIELDCAT 'AUART'     '' '订单类型'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'AUFNR'     '' '订单编码'                   '' '' '' '' 'ALPHA' ''.
      DF_SET_FIELDCAT 'KTEXT'     '' '订单描述'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'ERDAT'     '' '创建日期'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'ERFZEIT'     '' '创建时间'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'VAPLZ'     '' '工作中心'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'INGPR'     '' '计划员组'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'IWERK'     '' '工厂'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'BEBER'     '' '厂区'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'TPLNR'     '' '功能位置'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'PLTXT'     '' '功能位置描述'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'EQUNR'     '' '设备编码'                   '' '' '' '' 'ALPHA' ''.
      DF_SET_FIELDCAT 'EQKTX'     '' '设备描述'                   '' '' '' '' '' ''.
      DF_SET_FIELDCAT 'ANLNR'     '' '资产编码'                   '' '' '' '' 'ALPHA' ''.
      DF_SET_FIELDCAT 'TXT04'     '' '订单状态'                   '' '' '' '' '' ''.
    
    ENDFORM.                    "BUILD_FIELDCAT
    
    *&---------------------------------------------------------------------*
    *& Form FRM_EXCLUDE_TB_FUNCTIONS
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *&      <-- GT_EXCLUDE
    *&---------------------------------------------------------------------*
    FORM FRM_EXCLUDE_TB_FUNCTIONS  CHANGING P_GT_EXCLUDE TYPE UI_FUNCTIONS.
      DATA LS_EXCLUDE TYPE UI_FUNC.
    
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_PRINT .
      APPEND LS_EXCLUDE TO GT_EXCLUDE.
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      FORM  PREPARE_LAYOUT_9001
    *&---------------------------------------------------------------------*
    *       获取显示状态
    *----------------------------------------------------------------------*
    *      -->P_GDS_LAYOUT  TEXT
    *----------------------------------------------------------------------*
    FORM FRM_PREPARE_LAYOUT  CHANGING P_GDS_LAYOUT TYPE LVC_S_LAYO.
    
      P_GDS_LAYOUT-CWIDTH_OPT = 'X'.      "最优化宽度
    *  P_GDS_LAYOUT-SEL_MODE = 'D'.        "选择方式
      P_GDS_LAYOUT-ZEBRA = 'X'.           "间隔颜色
      P_GDS_LAYOUT-SEL_MODE = 'A'.           "
    *  P_GDS_LAYOUT-NO_ROWMARK = 'X'.           "间隔颜色
    *  P_GDS_LAYOUT-BOX_FNAME = 'CHECK'.
    *  P_GDS_LAYOUT-STYLEFNAME = 'CELLTAB'.     "自动可编辑
    ENDFORM.                    " PREPARE_LAYOUT
    *&---------------------------------------------------------------------*
    *    CLASS实例化
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS LCL_EVENT_HANDLER IMPLEMENTATION.
    
    *--HANDLE DATA CHANGED FINISHED
      METHOD HANDLE_DATA_CHANGED_FINISHED.
    *    PERFORM FRM_DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS .
      ENDMETHOD.                    "HANDLE_DATA_CHANGED_FINISHED
    
      METHOD HANDLE_DATA_CHANGED.                                   "单元格事件触发相关
    *    PERFORM FRM_HANDLE_DATA_CHANGED USING ER_DATA_CHANGED.
      ENDMETHOD.                    "HANDLE_DATA_CHANGED
      METHOD HANDLE_TOOLBAR.
    
        DATA: LS_TOOLBAR  TYPE STB_BUTTON.
        MOVE 'PRINT' TO LS_TOOLBAR-FUNCTION.
        MOVE 1 TO LS_TOOLBAR-BUTN_TYPE.
        MOVE ICON_SYSTEM_PRINT  TO LS_TOOLBAR-ICON.
        MOVE '打印' TO LS_TOOLBAR-QUICKINFO.
        APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
        CLEAR LS_TOOLBAR.
    
    *    DATA: LS_TOOLBAR  TYPE STB_BUTTON.
        MOVE 'REFRESH' TO LS_TOOLBAR-FUNCTION.
        MOVE 1 TO LS_TOOLBAR-BUTN_TYPE.
        MOVE ICON_REFRESH  TO LS_TOOLBAR-ICON.
        MOVE '刷新' TO LS_TOOLBAR-QUICKINFO.
        APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
        CLEAR LS_TOOLBAR.
      ENDMETHOD.
    
      METHOD HANDLE_USER_COMMAND.
        PERFORM FRM_HANDLE_USER_COMMAND USING E_UCOMM.
      ENDMETHOD.
    
      METHOD HANDLE_DOUBLE_CLICK.
        PERFORM HANDLE_DOUBLE_CLICK USING E_ROW E_COLUMN ES_ROW_NO.
      ENDMETHOD.
    *--搜索帮助
      METHOD HANDLE_ONF4.
    *    PERFORM FRM_HANDLE_ONF4 USING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
      ENDMETHOD .
    ENDCLASS.                    "LCL_EVENT_HANDLER IMPLEMENTATION
    *&---------------------------------------------------------------------*
    *& Form FRM_EVENTLOAD
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM FRM_EVENTLOAD .
    *  DATA LV_EVENT_HANDLER TYPE REF TO LCL_EVENT_HANDLER .  "事件响应
    *  CREATE OBJECT LV_EVENT_HANDLER .
    *  IF GV_ALV IS NOT INITIAL.
    *    CALL METHOD GV_ALV->REGISTER_EDIT_EVENT
    *      EXPORTING
    *        I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
    **    SET HANDLER LV_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR GV_ALV.
    *    SET HANDLER LV_EVENT_HANDLER->HANDLE_DATA_CHANGED_FINISHED FOR GV_ALV.
    *    SET HANDLER LV_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR GV_ALV.
    **    SET HANDLER LV_EVENT_HANDLER->HANDLE_BEFORE_USER_COMMAND FOR GV_ALV.
    **    SET HANDLER LV_EVENT_HANDLER->HANDLE_ONF4 FOR GV_ALV.
    *
    *    DATA LV_EVENT_HANDLER1 TYPE REF TO LCL_EVENT_HANDLER .  "事件响应
    *    CREATE OBJECT LV_EVENT_HANDLER1 .
    *
    *  ENDIF.
    
      DATA LV_EVENT_HANDLER TYPE REF TO LCL_EVENT_HANDLER .  "事件响应
      CREATE OBJECT LV_EVENT_HANDLER .
    *    SET HANDLER GR_EVENT_HANDLER->HANDLE_TOOLBAR FOR GV_ALV .
    
      IF GV_ALV IS NOT INITIAL.
        CALL METHOD GV_ALV->REGISTER_EDIT_EVENT
          EXPORTING
            I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
        SET HANDLER LV_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR GV_ALV.
        SET HANDLER LV_EVENT_HANDLER->HANDLE_DATA_CHANGED_FINISHED FOR GV_ALV.
        SET HANDLER LV_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR GV_ALV.
    *    SET HANDLER LV_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR GV_ALV.
    *    SET HANDLER lv_event_handler->handle_before_user_command FOR gv_alv.
    *    SET HANDLER lv_event_handler->handle_onf4 FOR gv_alv.
        SET HANDLER LV_EVENT_HANDLER->HANDLE_TOOLBAR FOR GV_ALV.       "注册工具栏
    *    SET HANDLER EVENT_RECEIVER->HANDLE_MENU_BUTTON FOR GV_ALV.   "注册工具栏菜单
        SET HANDLER LV_EVENT_HANDLER->HANDLE_USER_COMMAND FOR GV_ALV.  "注册用户自定义命令
        SET HANDLER LV_EVENT_HANDLER->HANDLE_ONF4 FOR GV_ALV.
        DATA LV_EVENT_HANDLER1 TYPE REF TO LCL_EVENT_HANDLER .  "事件响应
        CREATE OBJECT LV_EVENT_HANDLER1 .
    *    DATA: LT_F4 TYPE LVC_T_F4 WITH HEADER LINE.
    *
    *    CLEAR LT_F4.
    *    LT_F4-FIELDNAME = 'PLNUM'.
    *    LT_F4-REGISTER = 'X'.
    *    LT_F4-CHNGEAFTER = 'X'.
    **  LT_F4-GETBEFORE = 'X'.
    **  LT_F4-INTERNAL   = 'X'.
    *    APPEND LT_F4.
    *
    *    CALL METHOD GV_ALV->REGISTER_F4_FOR_FIELDS
    *      EXPORTING
    *        IT_F4 = LT_F4[].
      ENDIF.
    
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& Form FRM_HANDLE_USER_COMMAND
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *&      --> E_UCOMM
    *&---------------------------------------------------------------------*
    FORM FRM_HANDLE_USER_COMMAND  USING    P_E_UCOMM.
      CASE P_E_UCOMM.
        WHEN 'PRINT'.
          PERFORM FRM_PRINT.
        WHEN 'REFRESH'.
          PERFORM FRM_GET_DATA.
        WHEN OTHERS.
      ENDCASE.
      PERFORM FRM_REFURBISH_ALV.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& Form FRM_PRINT
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM FRM_PRINT .
      DATA: SSF_NAME          TYPE TDSFNAME VALUE 'ZPMSMF_005',
            L_FM_NAME         TYPE RS38L_FNAM,
            LS_CONTROL_PARAM  TYPE SSFCTRLOP,
            LS_COMPOSER_PARAM TYPE SSFCOMPOP,
            LS_OUTPUT_OPTIONS TYPE SSFCRESOP,
            I_JOB_OUTPUT_INFO TYPE SSFCRESCL,
            LS_EXCUTE         TYPE I.
    
      DATA:L_LINES TYPE I,
           L_MOD   TYPE I,
           L_DEV   TYPE I.
      DATA:L_INDEX TYPE I.
      DATA:LS_PRINT TYPE C.
    
      DATA:LT_HEAD TYPE TABLE OF ZSPM001,
           LS_HEAD TYPE ZSPM001.
    
      DATA:LT_ITEM1 TYPE TABLE OF ZSPM_SMF_005ITEM1,
           LS_ITEM1 TYPE ZSPM_SMF_005ITEM1.
      DATA:LT_ITEM2 TYPE TABLE OF ZSPM_SMF_005ITEM2,
           LS_ITEM2 TYPE ZSPM_SMF_005ITEM2.
    
      DATA:LT_ITEM3 TYPE TABLE OF ZSPM_SMF_005ITEM3,
           LS_ITEM3 TYPE ZSPM_SMF_005ITEM3.
    *  DATA:LT_ITEM LIKE TABLE OF GS_DATA,
    *       LS_ITEM LIKE GS_DATA.
      DATA:LV_P TYPE P DECIMALS 2.
      DATA:LV_S TYPE P DECIMALS 2.
      DATA:LV_C TYPE CHAR16.
    
    *  DATA:LDT_ITEM TYPE TABLE OF TY_DATA WITH HEADER LINE.
    
      LS_CONTROL_PARAM-LANGU = '1'.
      LS_CONTROL_PARAM-NO_OPEN = 'X'.
      LS_CONTROL_PARAM-NO_CLOSE = 'X'.
    
      CLEAR:LT_HEAD,LS_HEAD,LT_ITEM1,LS_ITEM1,LT_ITEM2,LS_ITEM2,LT_ITEM3,LS_ITEM3.
      CALL METHOD GV_ALV->CHECK_CHANGED_DATA.
    
      CALL METHOD GV_ALV->GET_SELECTED_ROWS            "获取行号
        IMPORTING
          ET_INDEX_ROWS = GT_NU3_ROWS
          ET_ROW_NO     = GT_NU3_NO.
      IF GT_NU3_NO IS INITIAL.
        MESSAGE E001(00) WITH '请选择一条数据。'.
      ENDIF.
    
      LOOP AT GT_NU3_NO INTO GS_NU3_NO.
        READ TABLE GT_DATA INTO GS_DATA INDEX GS_NU3_NO-ROW_ID.
        IF SY-SUBRC = 0.
    
          MOVE-CORRESPONDING GS_DATA TO LS_HEAD.
          LS_HEAD-GEWRK = GS_DATA-VAPLZ.
          IF GS_DATA-BUKRS = '2010'.
            LS_HEAD-BUKRS = '泰州中来光电科技有限公司'.
          ELSEIF GS_DATA-BUKRS = '3010'.
            LS_HEAD-BUKRS = '泰州中来光电科技有限公司姜堰分公司'.
          ENDIF.
          APPEND LS_HEAD TO LT_HEAD.
          CLEAR:LS_HEAD.
        ENDIF.
      ENDLOOP.
    
      SORT LT_HEAD BY AUFNR.
      DELETE ADJACENT DUPLICATES FROM LT_HEAD COMPARING AUFNR.
    
      IF LT_HEAD IS NOT INITIAL.
        SELECT AUSVN,
               AUZTV,
               AUSBS,
               AUZTB,
               MSAUS,
               AUSZT,
               MAUEH,
               QMNUM
        INTO TABLE @DATA(LT_QMIH)
        FROM QMIH
        FOR ALL ENTRIES IN @LT_HEAD
        WHERE QMNUM = @LT_HEAD-QMNUM.
    
      ENDIF.
    
      "维修备件
      SELECT RESB~RSNUM,
             RESB~RSPOS,
             RESB~MATNR,
             RESB~BDMNG,
             RESB~ENMNG,
             RESB~MEINS,
             RESB~AUFNR,
             MAKT~MAKTX
      FROM RESB
      INNER JOIN @LT_HEAD AS LT_HEAD ON LT_HEAD~RSNUM = RESB~RSNUM AND LT_HEAD~AUFNR = RESB~AUFNR
      LEFT JOIN MAKT ON MAKT~MATNR = RESB~MATNR
      INTO TABLE @DATA(LT_RESB).
    
      "维修工序
      SELECT AFVC~VORNR,
             AFVC~STEUS,
             AFVC~LTXA1,
             LT_HEAD~AUFNR
      FROM AFVC
      INNER JOIN AFKO ON AFKO~AUFPL = AFVC~AUFPL
      INNER JOIN @LT_HEAD AS LT_HEAD ON LT_HEAD~AUFNR = AFKO~AUFNR
      INTO TABLE @DATA(LT_AFVC).
      SORT LT_AFVC BY VORNR ASCENDING.
      "委外服务
      SELECT LT_HEAD~AUFNR,
             EKPO~EBELN,
             EKPO~EBELP,
             EKPO~TXZ01,
             EKPO~MENGE,
             EKPO~MEINS
      FROM EKPO
      INNER JOIN EKKN ON EKPO~EBELN = EKKN~EBELN AND EKPO~EBELP = EKKN~EBELP
      INNER JOIN @LT_HEAD AS LT_HEAD ON LT_HEAD~AUFNR = EKKN~AUFNR
      INTO TABLE @DATA(LT_EKPO).
    
      SORT LT_QMIH BY QMNUM.
    
      CHECK LT_HEAD IS NOT INITIAL.
      CALL FUNCTION 'SSF_OPEN'
        EXPORTING
          USER_SETTINGS      = 'X'
          CONTROL_PARAMETERS = LS_CONTROL_PARAM
          OUTPUT_OPTIONS     = LS_COMPOSER_PARAM
        IMPORTING
          JOB_OUTPUT_OPTIONS = LS_OUTPUT_OPTIONS
        EXCEPTIONS
          FORMATTING_ERROR   = 1
          INTERNAL_ERROR     = 2
          SEND_ERROR         = 3
          USER_CANCELED      = 4
          OTHERS             = 5.
      IF SY-SUBRC <> 0.
        MESSAGE '用户取消打印' TYPE 'S'.
      ELSE.
    
        CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
          EXPORTING
            FORMNAME           = SSF_NAME
            VARIANT            = ' '
            DIRECT_CALL        = ' '
          IMPORTING
            FM_NAME            = L_FM_NAME
          EXCEPTIONS
            NO_FORM            = 1
            NO_FUNCTION_MODULE = 2
            OTHERS             = 3.
        IF SY-SUBRC <> 0.
          MESSAGE 'CALL SSF_FUNCTION_MODULE_NAME ERROR' TYPE 'E'.
        ELSE.
          LOOP AT LT_HEAD INTO LS_HEAD.
            READ TABLE LT_QMIH INTO DATA(LS_QMIH) WITH KEY QMNUM = LS_HEAD-QMNUM BINARY SEARCH.
            IF SY-SUBRC = 0.
              LS_HEAD-AUSVN  = LS_QMIH-AUSVN.
              LS_HEAD-AUZTV  = LS_QMIH-AUZTV.
              LS_HEAD-AUSBS  = LS_QMIH-AUSBS.
              LS_HEAD-AUZTB  = LS_QMIH-AUZTB.
    
              CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
                EXPORTING
                  I_NUMBER_OF_DIGITS = 2
                  I_FLTP_VALUE       = LS_QMIH-AUSZT
                IMPORTING
                  E_CHAR_FIELD       = LV_C.
              CONDENSE LV_C NO-GAPS.
              LV_S = LV_C.
              CALL FUNCTION 'UNIT_CONVERSION_SIMPLE'
                EXPORTING
                  INPUT                = LV_S
                  NO_TYPE_CHECK        = 'X'
    *             ROUND_SIGN           = ' '
                  UNIT_IN              = 'S'
                  UNIT_OUT             = 'H'
                IMPORTING
    *             ADD_CONST            =
    *             DECIMALS             =
    *             DENOMINATOR          =
    *             NUMERATOR            =
                  OUTPUT               = LV_P
                EXCEPTIONS
                  CONVERSION_NOT_FOUND = 1
                  DIVISION_BY_ZERO     = 2
                  INPUT_INVALID        = 3
                  OUTPUT_INVALID       = 4
                  OVERFLOW             = 5
                  TYPE_INVALID         = 6
                  UNITS_MISSING        = 7
                  UNIT_IN_NOT_FOUND    = 8
                  UNIT_OUT_NOT_FOUND   = 9
                  OTHERS               = 10.
              IF SY-SUBRC = 0.
    * Implement suitable error handling here
                LS_HEAD-AUSZT = LV_P.
                CONDENSE LS_HEAD-AUSZT.
              ENDIF.
              CLEAR:LV_P,
                    LV_S,
                    LV_C.
              LS_HEAD-MAUEH  = LS_QMIH-MAUEH.
            ENDIF.
    
            SELECT SINGLE TXT INTO LS_HEAD-KTEXT2 FROM T003P WHERE AUART = LS_HEAD-AUART AND SPRAS = 1.
            LOOP AT LT_AFVC INTO DATA(LS_AFVC) WHERE AUFNR = LS_HEAD-AUFNR.
              MOVE-CORRESPONDING LS_AFVC TO LS_ITEM1.
              APPEND LS_ITEM1 TO LT_ITEM1.
              CLEAR LS_ITEM1.
            ENDLOOP.
            DATA(LV_MOD) = LINES( LT_ITEM1 ).
            IF LT_ITEM1 IS INITIAL.
              APPEND INITIAL LINE TO LT_ITEM1.
            ENDIF.
    
            LOOP AT LT_RESB INTO DATA(LS_RESB) WHERE AUFNR = LS_HEAD-AUFNR AND RSNUM = LS_HEAD-RSNUM.
              MOVE-CORRESPONDING LS_RESB TO LS_ITEM2.
              APPEND LS_ITEM2 TO LT_ITEM2.
              CLEAR LS_ITEM2.
            ENDLOOP.
            IF LT_ITEM2 IS INITIAL.
              APPEND INITIAL LINE TO LT_ITEM2.
            ENDIF.
            LOOP AT LT_EKPO INTO DATA(LS_EKPO) WHERE AUFNR = LS_HEAD-AUFNR.
              MOVE-CORRESPONDING LS_EKPO TO LS_ITEM3.
              APPEND LS_ITEM3 TO LT_ITEM3.
              CLEAR LS_ITEM3.
            ENDLOOP.
            IF LT_ITEM3 IS INITIAL.
              APPEND INITIAL LINE TO LT_ITEM3.
            ENDIF.
            CALL FUNCTION L_FM_NAME
              EXPORTING
    *           ARCHIVE_INDEX      =
    *           ARCHIVE_INDEX_TAB  =
    *           ARCHIVE_PARAMETERS =
    *           CONTROL_PARAMETERS =
    *           MAIL_APPL_OBJ      =
    *           MAIL_RECIPIENT     =
    *           MAIL_SENDER        =
                CONTROL_PARAMETERS = LS_CONTROL_PARAM
                OUTPUT_OPTIONS     = LS_COMPOSER_PARAM
    *           USER_SETTINGS      = 'Xls_head'
                LS_HEAD            = LS_HEAD
    *           IMPORTING
    *           DOCUMENT_OUTPUT_INFO       =
    *           JOB_OUTPUT_INFO    =
    *           JOB_OUTPUT_OPTIONS =
              TABLES
                LT_ITEM1           = LT_ITEM1
                LT_ITEM2           = LT_ITEM2
                LT_ITEM3           = LT_ITEM3
              EXCEPTIONS
                FORMATTING_ERROR   = 1
                INTERNAL_ERROR     = 2
                SEND_ERROR         = 3
                USER_CANCELED      = 4
                OTHERS             = 5.
            IF SY-SUBRC <> 0.
    * Implement suitable error handling here
            ENDIF.
    
            CLEAR:LT_ITEM1,LS_ITEM1,LT_ITEM2,LS_ITEM2,LT_ITEM3,LS_ITEM3.
          ENDLOOP.
        ENDIF.
      ENDIF.
      CALL FUNCTION 'SSF_CLOSE'
        IMPORTING
          JOB_OUTPUT_INFO  = I_JOB_OUTPUT_INFO
        EXCEPTIONS
          FORMATTING_ERROR = 1
          INTERNAL_ERROR   = 2
          SEND_ERROR       = 3
          OTHERS           = 4.
      IF SY-SUBRC = 0.
      ENDIF.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& Form handle_double_click
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *&      --> E_ROW
    *&      --> E_COLUMN
    *&---------------------------------------------------------------------*
    FORM HANDLE_DOUBLE_CLICK  USING    P_E_ROWTYPE TYPE LVC_S_ROW
                                           PS_COLUMN  TYPE LVC_S_COL
                                           PS_ROW_NO TYPE LVC_S_ROID.
    
      DATA LS_STYLEROW TYPE LVC_S_STYL.
      IF PS_COLUMN-FIELDNAME = 'AUFNR'  OR  PS_COLUMN-FIELDNAME = 'EQUNR'.
        READ TABLE GT_DATA INTO GS_DATA INDEX PS_ROW_NO-ROW_ID.
        IF SY-SUBRC = 0  .
          IF GS_DATA-AUFNR IS NOT INITIAL AND PS_COLUMN-FIELDNAME = 'AUFNR'.
            SET PARAMETER ID 'ANR' FIELD GS_DATA-AUFNR.
    *      SET PARAMETER ID 'GJR' FIELD GDT_DATA-PSTDATE+0(4).
            CALL TRANSACTION 'IW33' AND SKIP FIRST SCREEN .  "#EC CI_CALLTA
          ELSEIF GS_DATA-EQUNR IS NOT INITIAL AND PS_COLUMN-FIELDNAME = 'EQUNR'.
            SET PARAMETER ID 'EQN' FIELD GS_DATA-EQUNR.
    *      SET PARAMETER ID 'GJR' FIELD GDT_DATA-PSTDATE+0(4).
            CALL TRANSACTION 'IE03' AND SKIP FIRST SCREEN .  "#EC CI_CALLTA
          ENDIF.
    
        ENDIF.
      ENDIF.
    ENDFORM.