zoukankan      html  css  js  c++  java
  • OOALV 分割屏幕

    1功能说明

    需要开发一个报表,分为上下两个部分,下边需要再分割为左右两个部分,点击上边部分的行,下边两个报表信息发生变化。

    效果如下:

     

    2代码实现

    1、数据查询

    分别查询MARA、MARC、MAKT三张表,存放在三个内表中,分别放在1、2、3界面,并调用9000屏幕

    9000屏幕中逻辑流

     

    2、创建容器

    FRM_CREATE_CONTAINER_9000

    创建容器对象方法:

     

    3、分割容器

    将创建的容器分割为两行一列

     

    获得拆分后的上半部分(第一行,第一列),并设置宽度

     

    获得拆分后的下半部分(第二行,第一列),将其再次拆分为一行两列,即左右两个部分

     

    同样获取拆分后的左半部分(第一行第一列),设置宽度,同理设置右半部分

     

    创建ALV对象

     

    其他逻辑与创建普通OOALV一致,在最终显示时,分别调用三个ALV对象的SET_TABLE_FOR_FIRST_DISPLAY方法即可。

    4、双击事件

    点击一行时,查询这行物料对应的MARC和MAKT表中的数据,并展示在2、3区域内

    5、方法说明

    在实现容器时,常用两种实现方式,一种是在屏幕中画区域,一种是只创建屏幕。

    ① 需要画区域时,定义容器为:

     

    创建对象方法:

     

    ② 不需要画区域时,定义容器为:

     

    创建容器对象方法:

     

    当分割屏幕是,把容器对象作为参数传入

     

    此处传入的容器参数PARENT参照CL_GUI_CONTAINER类,所以传入的容器对象可以是G_CONTAINER_9000,也可以是G_CONTAINER_9001,因为CL_GUI_CUSTOM_CONTAINER和CL_GUI_DOCKING_CONTAINER都是继承了CL_GUI_CONTAINER类。

    个人倾向于不画区域的方法,最终展示的效果也会比较美观,文档源代码展示的是不画区域的做法

    3源代码

    *&---------------------------------------------------------------------*
    REPORT ZTEST001.
    
    *----------------------------------------------------------------------*
    * 数据库表声明/Database table declaration
    *----------------------------------------------------------------------*
    TABLES:MARA.
    
    *--------------------------------------------------------------------*
    *内表定义
    *--------------------------------------------------------------------*
    TYPES: BEGIN OF TY_ALV,
             MATNR  TYPE MARA-MATNR,    "物料号
             MTART  TYPE MARA-MTART,    "物料类型
             MATKL  TYPE MARA-MATKL,    "物料组
             MEINS  TYPE MARA-MEINS,    "基本计量单位
    
             ZCHECK TYPE C,
             ICON   TYPE CHAR4,
             MSG    TYPE CHAR50,
           END OF TY_ALV.
    
    TYPES:BEGIN OF TY_MARC,
            MATNR  TYPE MARC-MATNR,    "物料号
            WERKS  TYPE MARC-WERKS,    "工厂
            BWTTY  TYPE MARC-BWTTY,    "评估类别
    
            ZCHECK TYPE C,
          END OF TY_MARC.
    
    TYPES:BEGIN OF TY_MAKT,
            MATNR  TYPE MAKT-MATNR,    "物料号
            SPRAS  TYPE MAKT-SPRAS,    "语言代码
            MAKTX  TYPE MAKT-MAKTX,    "物料描述
    
            ZCHECK TYPE C,
          END OF TY_MAKT.
    *----------------------------------------------------------------------*
    * 全局变量定义/Global variable definition
    *----------------------------------------------------------------------*
    DATA:GT_ALV1 TYPE STANDARD TABLE OF TY_ALV,
         GS_ALV1 TYPE TY_ALV,
         GT_MAKT TYPE STANDARD TABLE OF TY_MAKT,
         GS_MAKT TYPE TY_MAKT,
         GT_MARC TYPE STANDARD TABLE OF TY_MARC,
         GS_MARC TYPE TY_MARC,
         LT_ALV2 TYPE STANDARD TABLE OF TY_MARC,
         LS_ALV2 TYPE TY_MARC,
         LT_ALV3 TYPE STANDARD TABLE OF TY_MAKT,
         LS_ALV3 TYPE TY_MAKT.
    
    "创建ALV屏幕
    DATA: G_GRID_T         TYPE REF TO CL_GUI_ALV_GRID, "顶部
          G_GRID_L         TYPE REF TO CL_GUI_ALV_GRID, "底部——左部
          G_GRID_R         TYPE REF TO CL_GUI_ALV_GRID, "底部——右部
          G_CONTAINER_9000 TYPE REF TO CL_GUI_DOCKING_CONTAINER, "ALV容器 不用画屏幕容器 cl_gui_custom_container, "ALV container容器 需要画屏幕容器
          G_SPLITTER       TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
          G_SPLITTER1      TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
          G_CONTAINER_T    TYPE REF TO CL_GUI_CONTAINER, "顶部
          G_CONTAINER_B    TYPE REF TO CL_GUI_CONTAINER, "底部
          G_CONTAINER_L    TYPE REF TO CL_GUI_CONTAINER, "底部——左部
          G_CONTAINER_R    TYPE REF TO CL_GUI_CONTAINER, "底部——右部
          GT_EXCLUDE_9000  TYPE UI_FUNCTIONS, "     用于去掉不要的菜单栏
          GT_FIELDCAT_T    TYPE LVC_T_FCAT, "顶部字段
          GT_FIELDCAT_L    TYPE LVC_T_FCAT, "底部——左部字段
          GT_FIELDCAT_R    TYPE LVC_T_FCAT, "底部——右部字段
          GS_LAYOUT_L      TYPE LVC_S_LAYO, "底部——左部布局
          GS_LAYOUT_R      TYPE LVC_S_LAYO, "底部——右部布局
          GS_VARIANT_T     TYPE DISVARIANT,
          GS_VARIANT_L     TYPE DISVARIANT,
          GS_VARIANT_R     TYPE DISVARIANT,
          GT_SORT          TYPE LVC_T_SORT, "用于排序
          GS_SORT          TYPE LVC_S_SORT, "用于排序
          GT_FILT          TYPE LVC_T_FILT.
    
    DATA:GV_9000   TYPE SCRFNAME VALUE 'Z9000', "GV_TABLE 是屏幕中定义的控件
         R_UCOMM   LIKE SY-UCOMM,
         OK_CODE   TYPE SY-UCOMM,
         SAVE_CODE TYPE SY-UCOMM.
    
    *&---------------------------------------------------------------------*
    *& 字段串定义/Field-symbols                                            *
    *&---------------------------------------------------------------------*
    FIELD-SYMBOLS:<FS_ALV1> TYPE TY_ALV.
    
    *--------------------------------------------------------------------*
    *ALV参数声明
    *--------------------------------------------------------------------*
    DATA: GT_FIELDCAT TYPE LVC_T_FCAT, "字段目录内表
          GS_FIELDCAT TYPE LVC_S_FCAT, "字段目录工作区
          GS_LAYOUT   TYPE LVC_S_LAYO. "用于定义ALV表单的相关格式、属性
    
    *--------------------------------------------------------------------*
    *定义选择屏幕参数
    *--------------------------------------------------------------------*
    SELECTION-SCREEN BEGIN OF BLOCK BLK0 WITH FRAME.
    SELECT-OPTIONS: S_MATNR FOR MARA-MATNR.  "物料
    SELECT-OPTIONS: S_ERSDA FOR MARA-ERSDA DEFAULT '20190801' TO '20190831'.  "创建日期
    SELECTION-SCREEN END OF BLOCK BLK0.
    *&---------------------------------------------------------------------*
    *& INITIALIZATION/选择屏幕前初始化                                     *
    *&---------------------------------------------------------------------*
    INITIALIZATION.
    
      CLASS ALV_EVENT_9000 DEFINITION DEFERRED."
    
    CLASS ALV_EVENT_9000 DEFINITION.
    
      PUBLIC SECTION.
        METHODS HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK  OF CL_GUI_ALV_GRID"双击事件
          IMPORTING E_ROW E_COLUMN ES_ROW_NO.
    
        METHODS HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID"用户按钮事件
          IMPORTING E_UCOMM.
    
        METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID"工具条事件
          IMPORTING E_OBJECT E_INTERACTIVE.
    ENDCLASS. "alv_event_9000 DEFINITION
    
    *----------------------------------------------------------------------*
    *   CLASS BELOW_ALV_EVENT IMPLEMENTATION 定义的事件类对应的事件响应模块
    *----------------------------------------------------------------------*
    CLASS ALV_EVENT_9000 IMPLEMENTATION.
    
      METHOD HANDLE_DOUBLE_CLICK .      "双击事件
        PERFORM FRM_DOUBLE_CLICK USING E_ROW E_COLUMN ES_ROW_NO.
      ENDMETHOD.                    "HANDLE_USER_COMMAND
    
      METHOD HANDLE_USER_COMMAND.       "用户按钮事件
        PERFORM FRM_HANDLE_USER_COMMAND9000 USING E_UCOMM.
      ENDMETHOD.                    "handle_hotspot_click
    
      METHOD  HANDLE_TOOLBAR.            "工具条事件
        PERFORM FRM_HANDLE_TOOLBAR9000 USING E_OBJECT E_INTERACTIVE."设置工具条图标
      ENDMETHOD.                    "HANDLE_DOUBLE_CLICK
    
    ENDCLASS. "alv_event_9000 IMPLEMENTATION
    
    AT SELECTION-SCREEN.
    *&---------------------------------------------------------------------*
    *& Start-of-selection/开始选择屏幕                                     *
    *&---------------------------------------------------------------------*
    START-OF-SELECTION.
    
      "获取数据
      PERFORM FRM_GET_DATA.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_LAYOUT
    *&---------------------------------------------------------------------*
    FORM FRM_LAYOUT.
      CLEAR:GS_LAYOUT,GS_LAYOUT_L,GS_LAYOUT_R.
      GS_LAYOUT-GRID_TITLE = '第1个界面'.   "标题
      GS_LAYOUT-CWIDTH_OPT = 'A'.   "优化列宽
      GS_LAYOUT-ZEBRA = 'X'.        "斑马线
      GS_LAYOUT-SEL_MODE = 'A'.     "设置行模式"
      GS_LAYOUT-BOX_FNAME = 'ZCHECK'."选择行控制
    
      GS_LAYOUT_L = GS_LAYOUT_R = GS_LAYOUT.
    
      GS_LAYOUT_L-GRID_TITLE = '第2个界面'.   "标题
      GS_LAYOUT_R-GRID_TITLE = '第3个界面'.   "标题
    ENDFORM.
    
    
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_DATA3
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM FRM_GET_DATA.
    
      SELECT
        MATNR"物料号
        MTART"物料类型
        MATKL"物料组
        MEINS"基本计量单位
      FROM MARA
      INTO TABLE GT_ALV1
      WHERE MATNR IN S_MATNR
        AND ERSDA IN S_ERSDA.
    
      IF GT_ALV1 IS NOT INITIAL.
        SELECT
          MATNR"物料号
          WERKS"工厂
          BWTTY"评估类别
        FROM MARC
        INTO TABLE GT_MARC
        FOR ALL ENTRIES IN GT_ALV1
        WHERE MATNR = GT_ALV1-MATNR.
    
        SELECT
          MATNR"物料号
          SPRAS"语言代码
          MAKTX"物料描述
        FROM MAKT
        INTO TABLE GT_MAKT
        FOR ALL ENTRIES IN GT_ALV1
        WHERE MATNR = GT_ALV1-MATNR.
      ENDIF.
    
      IF GT_ALV1 IS INITIAL.
        MESSAGE '系统中无相关数据' TYPE 'S' DISPLAY LIKE 'E'.
        STOP.
      ELSE.
        CALL SCREEN 9000.
      ENDIF.
    
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_FIELDCAT3
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM FRM_FIELDCAT4.
    *&---alv 表头宏
      DEFINE INIT_FIELDCAT.
        CLEAR gs_fieldcat.
        gs_fieldcat-fieldname  = &1.    " 字段技术名称
        gs_fieldcat-coltext    = &2.    " 显示名称
        gs_fieldcat-ref_table  = &3.    " 参照表,标准功能实现例如搜索帮助
        gs_fieldcat-ref_field  = &4.    " 参照表字段,标准功能实现例如搜索帮助
        gs_fieldcat-no_init_ch = &5.
        gs_fieldcat-EDIT       = &6.    " 是否可以编辑
        gs_fieldcat-KEY        = &7.    "
        gs_fieldcat-HOTSPOT    = &8.    "
        gs_fieldcat-outputlen  = &9.    "
        APPEND gs_fieldcat TO gt_fieldcat.
      END-OF-DEFINITION.
    
      REFRESH:GT_FIELDCAT.
      INIT_FIELDCAT 'MATNR' '物料号' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'MTART' '物料类型' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'MATKL' '物料组' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'MEINS' '基本计量单位' '' '' '' '' '' '' '' .
      GT_FIELDCAT_T = GT_FIELDCAT.
    
      REFRESH:GT_FIELDCAT.
      INIT_FIELDCAT 'MATNR' '物料号' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'WERKS' '工厂' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'BWTTY' '评估类别' '' '' '' '' '' '' '' .
      GT_FIELDCAT_L = GT_FIELDCAT.
    
      REFRESH:GT_FIELDCAT.
      INIT_FIELDCAT 'MATNR' '物料号' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'SPRAS' '语言代码' '' '' '' '' '' '' '' .
      INIT_FIELDCAT 'MAKTX' '物料描述' '' '' '' '' '' '' '' .
      GT_FIELDCAT_R = GT_FIELDCAT.
    
    
    ENDFORM.
    
    FORM FRM_ENTER_DATA.
      MESSAGE '调用方法成功' TYPE 'S'.
    ENDFORM.
    
    
    MODULE STATUS_9000 OUTPUT.
      SET PF-STATUS 'STANDARD'.
    ENDMODULE.
    
    MODULE DISPLAY_ALV_9000 OUTPUT.
      IF G_CONTAINER_9000 IS NOT BOUND.
        PERFORM FRM_CREATE_CONTAINER_9000.
    *    PERFORM FRM_ALV_SORT_9000.
        PERFORM FRM_FIELDCAT4.
        PERFORM FRM_LAYOUT.
        PERFORM FRM_ALV_BTN_EXCLUDE_9000.
        PERFORM FRM_ALV_EVENT_9000.
        PERFORM FRM_ALV_DISPLAY_9000.
      ELSE.
        PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T.
        PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_L.
        PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_R.
      ENDIF.
    ENDMODULE.
    
    
    MODULE USER_COMMAND_9000 INPUT.
      DATA: LT_ROW  TYPE LVC_T_ROW,
            LT_ROID TYPE LVC_T_ROID,
            LS_ROW  TYPE LVC_S_ROW.
    
      SAVE_CODE = OK_CODE.
      CLEAR OK_CODE.
      CASE SAVE_CODE.
        WHEN '&BACK'."设置功能键返回按钮单击事件
          LEAVE TO SCREEN 0.
        WHEN '&EXIT'.
          LEAVE PROGRAM.
      ENDCASE.
    ENDMODULE.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_CREATE_CONTAINER_9000
    *&      创建容器
    *&---------------------------------------------------------------------*
    FORM FRM_CREATE_CONTAINER_9000.
    *  创建 容器
    
      CREATE OBJECT G_CONTAINER_9000
        EXPORTING
          REPID                       = SY-REPID
          DYNNR                       = '9000'
    *     side                        = cl_gui_docking_container=>dock_at_right      ”ALV贴屏幕右边,从屏幕右边开始算宽度
          SIDE                        = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_TOP       "ALV贴屏幕左边,从左边算屏幕宽度,
          EXTENSION                   = 1000                                          "屏幕宽度
    *     ratio                       = 95  "屏幕比例 小于5大于95会报cntl_error异常
          STYLE                       = CL_GUI_CONTROL=>WS_CHILD                     "可选参数,设置ALV是否可用手动拖动大小
        EXCEPTIONS
          CNTL_ERROR                  = 1
          CNTL_SYSTEM_ERROR           = 2
          CREATE_ERROR                = 3
          LIFETIME_ERROR              = 4
          LIFETIME_DYNPRO_DYNPRO_LINK = 5
          OTHERS                      = 6.
    
      IF SY-SUBRC <> 0.
        MESSAGE S001(00) WITH '屏幕初始化失败'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    
      "拆分成2行1列部分
      CREATE OBJECT G_SPLITTER
        EXPORTING
          PARENT  = G_CONTAINER_9000
          ROWS    = 2
          COLUMNS = 1.
    
      "一行一列
      CALL METHOD G_SPLITTER->GET_CONTAINER
        EXPORTING
          ROW       = 1
          COLUMN    = 1
        RECEIVING
          CONTAINER = G_CONTAINER_T.
    
      CALL METHOD G_SPLITTER->SET_COLUMN_WIDTH
        EXPORTING
          ID    = 1
          WIDTH = 100.
    
      "二行一列*
      CALL METHOD G_SPLITTER->GET_CONTAINER
        EXPORTING
          ROW       = 2
          COLUMN    = 1
        RECEIVING
          CONTAINER = G_CONTAINER_B.
    
      "拆分成一行二列部分*
      CREATE OBJECT G_SPLITTER1
        EXPORTING
          PARENT  = G_CONTAINER_B
          ROWS    = 1
          COLUMNS = 2.
    
      "一行一列*
      CALL METHOD G_SPLITTER1->GET_CONTAINER
        EXPORTING
          ROW       = 1
          COLUMN    = 1
        RECEIVING
          CONTAINER = G_CONTAINER_L.
    
      CALL METHOD G_SPLITTER1->SET_COLUMN_WIDTH
        EXPORTING
          ID    = 2
          WIDTH = 50.
    
      "*一行二列*
      CALL METHOD G_SPLITTER1->GET_CONTAINER
        EXPORTING
          ROW       = 1
          COLUMN    = 2
        RECEIVING
          CONTAINER = G_CONTAINER_R.
    
      CALL METHOD G_SPLITTER1->SET_COLUMN_WIDTH
        EXPORTING
          ID    = 3
          WIDTH = 50.
    
      CREATE OBJECT G_GRID_T"上半部分
        EXPORTING
          I_PARENT = G_CONTAINER_T.
    
      CREATE OBJECT G_GRID_L"左半部分
        EXPORTING
          I_PARENT = G_CONTAINER_L.
    
      CREATE OBJECT G_GRID_R"右半部分
        EXPORTING
          I_PARENT = G_CONTAINER_R.
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_ALV_BTN_EXCLUDE_9000
    *&      排除不用的按钮
    *&---------------------------------------------------------------------*
    FORM FRM_ALV_BTN_EXCLUDE_9000.
    
      DATA: LS_EXCLUDE TYPE UI_FUNC.
      REFRESH GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_DETAIL.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CHECK.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
      CLEAR LS_EXCLUDE.
      LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_REFRESH.
      APPEND LS_EXCLUDE TO GT_EXCLUDE_9000.
    
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_ALV_EVENT_9000
    *&---------------------------------------------------------------------*
    FORM FRM_ALV_EVENT_9000.
      DATA: LR_EVENT_HANDLER TYPE REF TO ALV_EVENT_9000.
    
    *  CALL METHOD G_GRID_T->register_edit_event  "注册回车事件
    *    EXPORTING
    *      i_event_id = cl_gui_alv_grid=>mc_evt_enter.
    *
    *  CALL METHOD g_grid_9000->register_edit_event  "注册失去鼠标事件
    *    EXPORTING
    *      i_event_id = cl_gui_alv_grid=>mc_evt_modified.
    
      IF LR_EVENT_HANDLER IS INITIAL.
        CREATE OBJECT LR_EVENT_HANDLER.
      ENDIF.
    
    *  SET HANDLER LR_EVENT_HANDLER->HANDLE_DATA_CHANGED FOR G_GRID_9000. "数据改动事件
      SET HANDLER LR_EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR G_GRID_T.
    *  SET HANDLER LR_EVENT_HANDLER->HANDLE_ON_F4 FOR G_GRID_9000.
    *  SET HANDLER LR_EVENT_HANDLER->HANDLE_HOTSPOT_CLICK FOR G_GRID_9000 .
      SET HANDLER LR_EVENT_HANDLER->HANDLE_TOOLBAR FOR G_GRID_T.      "工具栏事件
      SET HANDLER LR_EVENT_HANDLER->HANDLE_USER_COMMAND FOR G_GRID_T. "用户命令事件
    
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_ALV_DISPLAY_9000
    *&---------------------------------------------------------------------*
    FORM FRM_ALV_DISPLAY_9000.
      CALL METHOD G_GRID_T->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
    *     I_CONSISTENCY_CHECK           = 'X'
          IS_VARIANT                    = GS_VARIANT_T
          IT_TOOLBAR_EXCLUDING          = GT_EXCLUDE_9000
          I_SAVE                        = 'A'
          I_DEFAULT                     = 'X' "允许定义默认布局
          IS_LAYOUT                     = GS_LAYOUT
        CHANGING
          IT_OUTTAB                     = GT_ALV1
          IT_FIELDCATALOG               = GT_FIELDCAT_T
        EXCEPTIONS
          INVALID_PARAMETER_COMBINATION = 1
          PROGRAM_ERROR                 = 2
          TOO_MANY_LINES                = 3
          OTHERS                        = 4.
      IF SY-SUBRC <> 0.
      ENDIF.
    
      CALL METHOD G_GRID_L->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
    *     I_CONSISTENCY_CHECK           = 'X'
          IS_VARIANT                    = GS_VARIANT_L
          IT_TOOLBAR_EXCLUDING          = GT_EXCLUDE_9000
          I_SAVE                        = 'A'
          I_DEFAULT                     = 'X' "允许定义默认布局
          IS_LAYOUT                     = GS_LAYOUT_L
    *     IS_PRINT                      = GS_PRINT_H
        CHANGING
          IT_OUTTAB                     = LT_ALV2
          IT_FIELDCATALOG               = GT_FIELDCAT_L
        EXCEPTIONS
          INVALID_PARAMETER_COMBINATION = 1
          PROGRAM_ERROR                 = 2
          TOO_MANY_LINES                = 3
          OTHERS                        = 4.
      IF SY-SUBRC <> 0.
      ENDIF.
    
      CALL METHOD G_GRID_R->SET_TABLE_FOR_FIRST_DISPLAY
        EXPORTING
    *     I_CONSISTENCY_CHECK           = 'X'
          IS_VARIANT                    = GS_VARIANT_R
          IT_TOOLBAR_EXCLUDING          = GT_EXCLUDE_9000
          I_SAVE                        = 'A'
          I_DEFAULT                     = 'X' "允许定义默认布局
          IS_LAYOUT                     = GS_LAYOUT_R
    *     IS_PRINT                      = GS_PRINT_H
        CHANGING
          IT_OUTTAB                     = LT_ALV3
          IT_FIELDCATALOG               = GT_FIELDCAT_R
        EXCEPTIONS
          INVALID_PARAMETER_COMBINATION = 1
          PROGRAM_ERROR                 = 2
          TOO_MANY_LINES                = 3
          OTHERS                        = 4.
      IF SY-SUBRC <> 0.
      ENDIF.
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_DOUBLE_CLICK
    *&---------------------------------------------------------------------*
    FORM FRM_DOUBLE_CLICK USING P_E_ROW_ID TYPE LVC_S_ROW
          P_E_COLUMN_ID TYPE LVC_S_COL
          P_ES_ROW_NO TYPE LVC_S_ROID.
      READ TABLE GT_ALV1 INTO GS_ALV1 INDEX P_ES_ROW_NO-ROW_ID."得到点击的行
      IF SY-SUBRC EQ 0.
        REFRESH:LT_ALV2,LT_ALV3.
        LOOP AT GT_MARC INTO GS_MARC WHERE MATNR = GS_ALV1-MATNR.
          CLEAR:LS_ALV2.
          MOVE-CORRESPONDING GS_MARC TO LS_ALV2.
    
          APPEND LS_ALV2 TO LT_ALV2.
          CLEAR:GS_MARC.
        ENDLOOP.
    
        LOOP AT GT_MAKT INTO GS_MAKT WHERE MATNR = GS_ALV1-MATNR.
          CLEAR:LS_ALV3.
          MOVE-CORRESPONDING GS_MAKT TO LS_ALV3.
          APPEND LS_ALV3 TO LT_ALV3.
          CLEAR:GS_MAKT.
        ENDLOOP.
    
        PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T.
        PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_L.
        PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_R.
      ENDIF.
    
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_HANDLE_USER_COMMAND
    *&---------------------------------------------------------------------*
    FORM FRM_HANDLE_USER_COMMAND9000 USING PV_UCOMM.
    
      CALL METHOD G_GRID_T->GET_SELECTED_ROWS
        IMPORTING
          ET_INDEX_ROWS = LT_ROW
          ET_ROW_NO     = LT_ROID.
    
      FIELD-SYMBOLS:<FS_ZCHECK>.
    *  因为OOALV中侧边栏选择框不起作用,但是需要使用,就将选中的行的侧边栏的值修改一下
      LOOP AT GT_ALV1 ASSIGNING <FS_ALV1>.
        <FS_ALV1>-ZCHECK = ''.
      ENDLOOP.
    
      IF LT_ROW IS NOT INITIAL.
        LOOP AT LT_ROW INTO LS_ROW.
          LOOP AT GT_ALV1 ASSIGNING <FS_ALV1>.
            IF SY-TABIX = LS_ROW-INDEX.
              <FS_ALV1>-ZCHECK = 'X'.
            ENDIF.
          ENDLOOP.
          CLEAR:LS_ROW.
        ENDLOOP.
      ELSE.
        MESSAGE '请选择数据' TYPE 'S' DISPLAY LIKE 'E'.
        RETURN.
      ENDIF.
    
      CASE PV_UCOMM.
        WHEN '&ENTER'."审批通过
          PERFORM FRM_ENTER_DATA.
        WHEN OTHERS.
      ENDCASE.
    
      PERFORM FRM_REFRESH_ALV_9000 USING G_GRID_T.
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_HANDLE_TOOLBAR
    *&---------------------------------------------------------------------*
    FORM FRM_HANDLE_TOOLBAR9000 USING P_OBJECT P_INTERACTIVE.
    
      PERFORM FRM_HANDLE_TOOLBAR_PRO USING P_OBJECT '&ENTER' '@0V@' '确认'.
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_HANDLE_TOOLBAR_PRO
    *&---------------------------------------------------------------------*
    FORM FRM_HANDLE_TOOLBAR_PRO USING P_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET
          P_FUNCTION TYPE STB_BUTTON-FUNCTION
          P_ICON TYPE STB_BUTTON-ICON
          P_TEXT TYPE STB_BUTTON-TEXT.
      DATA: LS_TOOLBAR   TYPE STB_BUTTON,
            LV_QUICKINFO TYPE STB_BUTTON-QUICKINFO.
    
      CLEAR LS_TOOLBAR.
      MOVE 3 TO LS_TOOLBAR-BUTN_TYPE. " 分隔符
      APPEND LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR.
    
      CLEAR LS_TOOLBAR.
      MOVE 0 TO LS_TOOLBAR-BUTN_TYPE.   " 按钮(正常)
      MOVE P_FUNCTION TO LS_TOOLBAR-FUNCTION. "功能码
      MOVE P_ICON TO LS_TOOLBAR-ICON.   "图标
      MOVE P_TEXT TO LS_TOOLBAR-TEXT.   "显示文本
      LV_QUICKINFO = P_TEXT.
      MOVE LV_QUICKINFO  TO LS_TOOLBAR-QUICKINFO.
      APPEND LS_TOOLBAR TO P_OBJECT->MT_TOOLBAR.
    ENDFORM.
    
    *&---------------------------------------------------------------------*
    *&      Form  FRM_REFRESH_ALV_9000
    *&---------------------------------------------------------------------*
    FORM FRM_REFRESH_ALV_9000 USING PV_GRID TYPE REF TO CL_GUI_ALV_GRID.
      DATA: LT_CELLTAB TYPE LVC_T_STYL,
            LS_CELLTAB TYPE LVC_S_STYL,
            LS_STABLE  TYPE LVC_S_STBL.
    
      LS_STABLE-ROW = 'X'.  "固定行
      LS_STABLE-COL = 'X'.  "固定列
    
      CHECK PV_GRID IS NOT INITIAL.
    
      CALL METHOD PV_GRID->REFRESH_TABLE_DISPLAY
        EXPORTING
          IS_STABLE = LS_STABLE
    *     I_SOFT_REFRESH = 'X'
        EXCEPTIONS
          FINISHED  = 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.
      CALL METHOD CL_GUI_CFW=>FLUSH.
    ENDFORM.
  • 相关阅读:
    OpenGL(九) 三维混色和深度缓存设置
    自由度(degree of freedom)
    自由度(degree of freedom)
    非参贝叶斯(Bayesian Non-parameter)初步
    非参贝叶斯(Bayesian Non-parameter)初步
    一个GCC4.6.3的奇妙问题的糊涂解决方案
    Rational Rose--简介
    android 国际化
    日志文件C++ 时间 文件 行数
    看原理图之UART
  • 原文地址:https://www.cnblogs.com/BinGeneral/p/13559759.html
Copyright © 2011-2022 走看看