1.1、ALV工具栏按钮及行项目双击事件的控制
Dialog ALV工具栏是和控制整合在一起的,可以通过以下方法在工具栏中增加菜单或按钮。
STEP | 01 为了方便代码的分类管理,首先建立一个Include程序,用于存放ALV的控制代码,Include程序的命名的命名尽量与主程序的命名接近,以方便程序的统计及管理,如本例中的主程序名为“ZSCREEN06”,Include程序命名为“ZSCREEN06ALV”。
增加工具栏中的按钮首先需要定义一个工具栏对象,对象参考类型STB_BUTTON,属性如下:
属性字段 | 功能描述 |
FUNCTION | 为按钮分配功能代码 |
ICON | 图标的名称 |
QUICKINFO | 关于图标的简要信息 |
BUTN_TYPE |
工具栏按钮类型,用1位代码来表示,代码及类型描述如下: 2 菜单 3 分割符 4 单选按钮 5 复选框 6 菜单项 |
DISABLED | 设置该按钮的状态为不可用 |
TEXT | 注释(40个字符) |
CHECKED | 设置为选中时的状态 |
STEP | 02 ALV操作的对象仍然为系统类接口CL_GUI_ALV_GRID,在Include程序中需要维护相关类及方法的代码,如下图所示,代码中介绍了具体的方法定义及属性描述。
*&---------------------------------------------------------------------*
*& Report ZSCREEN07
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zscreen07.
TABLES : spfli.
DATA : BEGIN OF lspfli OCCURS 0. "在内表中新增COLOR作为颜色属性存放字段
INCLUDE STRUCTURE spfli.
DATA : color TYPE char10,
END OF lspfli.
DATA : fieldcat TYPE lvc_t_fcat, "定义Fieldcat对象
grid TYPE REF TO cl_gui_alv_grid, "定义ALV控件名
g_container TYPE scrfname VALUE 'CONT1', "定义本地容器的对象名
is_layout TYPE lvc_s_layo,
g_custom_container TYPE REF TO cl_gui_custom_container. "定义容器对象名
SELECTION-SCREEN BEGIN OF SCREEN 0101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS : s_carrid FOR spfli-carrid,
s_connid FOR spfli-connid.
SELECTION-SCREEN END OF BLOCK 10.
SELECTION-SCREEN END OF SCREEN 0101.
START-OF-SELECTION.
CALL SCREEN '1001'.
INCLUDE zscreen07ialv.
FORM alvshow.
CREATE OBJECT g_custom_container "创建容器对象
EXPORTING
container_name = g_container.
CREATE OBJECT grid
EXPORTING
i_parent = g_custom_container. "创建控件对象
is_layout-info_fname = 'COLOR'. "定义颜色属性字段
CALL METHOD grid->set_table_for_first_display
EXPORTING
i_structure_name = 'SPFLI'
is_layout = is_layout
i_save = 'X'
CHANGING
it_outtab = lspfli[]
it_fieldcatalog = fieldcat[].
*注册ALV中引用的事件
SET HANDLER alv_event_receiver=>handle_toolbar
alv_event_receiver=>handle_menu_button
alv_event_receiver=>handle_user_command
alv_event_receiver=>handle_double_click
FOR ALL INSTANCES.
*调用方法激活自定义工具栏对象
CALL METHOD grid->set_toolbar_interactive.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
CASE sy-ucomm.
WHEN '&EXIT'.
LEAVE TO SCREEN 0.
WHEN 'EXEC'.
SELECT * FROM spfli
INTO CORRESPONDING FIELDS OF TABLE lspfli
WHERE carrid IN s_carrid
AND connid IN s_connid.
lspfli-color = 'C610'.
MODIFY lspfli TRANSPORTING color WHERE distance <= '3000'. "当distance为空时,显示更改属性
IF g_custom_container IS INITIAL. "检查是否创建容器对象
PERFORM alvshow.
ELSE.
CALL METHOD grid->refresh_table_display.
ENDIF.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
SET PF-STATUS 'T001'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
ZSCREEN07IALV代码
*&---------------------------------------------------------------------*
*& Include ZSCREEN07IALV
*&---------------------------------------------------------------------*
DATA : gs_toolbar TYPE stb_button.
CLASS alv_event_receiver DEFINITION DEFERRED. "声明类对象
CLASS alv_event_receiver DEFINITION. "声明类成员的可见性
PUBLIC SECTION. "定义相关类成员可以被程序中的所有对象调用
CLASS-METHODS : "定义方法类
handle_toolbar "初始化工具栏对象事件,如增加按钮并设定其属性
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_menu_button "该事件用于在下拉菜单中增加选项
FOR EVENT menu_button OF cl_gui_alv_grid
IMPORTING e_object e_ucomm,
handle_user_command "定义单击事件
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_double_click "定义双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no.
ENDCLASS.
CLASS alv_event_receiver IMPLEMENTATION. "实现方法类
METHOD handle_toolbar.
gs_toolbar-function = 'B_SUM'. "为按钮分配功能代码
gs_toolbar-icon = icon_display. "为按钮分配图标
gs_toolbar-text = '总行数'. "为按钮分配文本
gs_toolbar-butn_type = '0'. "定义按钮类型,不填时为0
APPEND gs_toolbar TO e_object->mt_toolbar. "添加到按钮工具栏
gs_toolbar-function = 'B_LIST'. "为按钮分配功能代码
gs_toolbar-quickinfo = '自定义下拉菜单'. "
gs_toolbar-icon = icon_biw_report_view. "为按钮分配图标
gs_toolbar-text = '下拉菜单'. "为按钮分配文本
gs_toolbar-butn_type = '1'. "定义按钮类型,不填时为0
APPEND gs_toolbar TO e_object->mt_toolbar. "添加到按钮工具栏
ENDMETHOD.
METHOD handle_menu_button.
IF e_ucomm = 'B_LIST'. "在菜单中增加选项,可以多次用该方法以增加多行
CALL METHOD e_object->add_function
EXPORTING
icon = icon_display
fcode = 'B_SUM'
text = '显示ALV总行数'.
ENDIF.
ENDMETHOD.
METHOD handle_user_command. "获取单击ALV工具栏按钮时的功能码
DATA : sum TYPE i.
IF e_ucomm = 'B_SUM'.
DESCRIBE TABLE lspfli[] LINES sum.
MESSAGE i001(00) WITH '当前ALV表格的总行数是:' sum.
ENDIF.
ENDMETHOD.
METHOD handle_double_click.
DATA : ls_spfli TYPE spfli. "获取当前行号,与内表一致
READ TABLE lspfli INTO ls_spfli INDEX es_row_no-row_id.
MESSAGE i001(00) WITH '当前行:' es_row_no-row_id ',航线代码:' ls_spfli-carrid.
ENDMETHOD.
ENDCLASS.
执行后的结果