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.
原文地址:https://www.cnblogs.com/BinGeneral/p/13559759.html