01 功能说明
本系列将通过模拟用户与开发者之间的对话场景,来逐步演示SALV的使用。在本篇中,我们将延续前文内容,解决用户最新提出的需求,并同时介绍 SALV部分事件的触发时机 ,为后续新增功能的实现提供必要的知识储备。让我们一起来探索吧。
赶紧动手试一试,以便更好地掌握这些新的知识点。
02 功能效果
第12天 用户说:选择模式
现在每次只能复制单行数据,我想选择多行进行复制。
IF p_day12 EQ 'X'.
DATA lo_selections TYPE REF TO cl_salv_selections.
lo_selections = go_salv->get_selections( ).
lo_selections->set_selection_mode( if_salv_c_selection_mode=>cell ).
...
ENDIF.
第13天 用户说:触发事件
用户今天啥也没说,你来研究下SALV的触发事件吧!
IF p_day13 EQ 'X'.
DATA lo_events_table TYPE REF TO cl_salv_events_table.
lo_events_table = go_salv->get_event( ).
DATA lo_evt_handler TYPE REF TO lcl_evt_handler.
CREATE OBJECT lo_evt_handler.
SET HANDLER lo_evt_handler->on_link_click FOR lo_events_table.
SET HANDLER lo_evt_handler->on_double_click FOR lo_events_table.
SET HANDLER lo_evt_handler->on_added_function FOR lo_events_table.
SET HANDLER lo_evt_handler->before_salv_function FOR lo_events_table.
SET HANDLER lo_evt_handler->after_salv_function FOR lo_events_table.
...
ENDIF.
03 源码分享
CLASS lcl_evt_handler DEFINITION.
PUBLIC SECTION.
METHODS on_link_click "单击(热点)
FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
METHODS on_double_click "双击
FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column.
METHODS on_added_function "新增按钮点击
FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function.
METHODS before_salv_function "标准按钮点击前
FOR EVENT before_salv_function OF cl_salv_events_table
IMPORTING e_salv_function.
METHODS after_salv_function "标准按钮点击后
FOR EVENT after_salv_function OF cl_salv_events_table
IMPORTING e_salv_function.
ENDCLASS.
CLASS lcl_evt_handler IMPLEMENTATION.
METHOD on_link_click.
MESSAGE i001(00) WITH 'on_link_click:' row ' - ' column.
ENDMETHOD.
METHOD on_double_click.
MESSAGE i001(00) WITH 'on_double_click:' row ' - ' column.
ENDMETHOD.
METHOD on_added_function.
MESSAGE i001(00) WITH 'on_added_function:' e_salv_function.
ENDMETHOD.
METHOD before_salv_function.
MESSAGE i001(00) WITH 'before_salv_function:' e_salv_function.
ENDMETHOD.
METHOD after_salv_function.
MESSAGE i001(00) WITH 'after_salv_function:' e_salv_function.
ENDMETHOD.
ENDCLASS.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) day01 .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) day02 .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) day03 .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) day04 .
SELECTION-SCREEN END OF LINE.
...
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) day12 .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(79) day13 .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t2.
PARAMETERS p_day01 AS CHECKBOX DEFAULT 'X' . "01、基本展示
PARAMETERS p_day02 AS CHECKBOX DEFAULT 'X' . "02、外观设置
PARAMETERS p_day03 AS CHECKBOX DEFAULT 'X' . "03、列设置
PARAMETERS p_day04 AS CHECKBOX DEFAULT 'X' . "04、按钮设置
...
PARAMETERS p_day12 AS CHECKBOX DEFAULT 'X' . "12、选择模式
PARAMETERS p_day13 AS CHECKBOX DEFAULT 'X' . "13、触发事件
SELECTION-SCREEN END OF BLOCK b2.
INITIALIZATION.
sy-title = 'ABAP SALV演示程序-公众号(ABAP猿)'.
t1 = '用户说'.
t2 = '你来做'.
day01 = '01、从表SPFLI获取数据,并进行基本展示。'.
day02 = '02、能否修改下抬头标题文本,并斑马纹展示?'.
day03 = '03、能否优化下列宽?'.
day04 = '04、怎么没有应用工具栏按钮,能加上吗?'.
...
day12 = '12、现在每次只能复制单行数据,我想选择多行进行复制。'.
day13 = '13、用户今天啥也没说,你来研究下SALV的触发事件吧!'.
%_p_day01_%_app_%-text = '01、基本展示'.
%_p_day02_%_app_%-text = '02、外观设置'.
%_p_day03_%_app_%-text = '03、列设置'.
%_p_day04_%_app_%-text = '04、按钮设置'.
...
%_p_day12_%_app_%-text = '12、选择模式'.
%_p_day13_%_app_%-text = '13、触发事件'.
START-OF-SELECTION.
*------------------------------------*
CHECK p_day01 EQ 'X'.
DATA gt_spfli TYPE TABLE OF spfli.
SELECT * FROM spfli INTO TABLE gt_spfli UP TO 30 ROWS.
DATA go_salv TYPE REF TO cl_salv_table.
cl_salv_table=>factory(
IMPORTING
r_salv_table = go_salv
CHANGING
t_table = gt_spfli ).
...
*------------------------------------*
IF p_day02 EQ 'X'.
DATA lo_display TYPE REF TO cl_salv_display_settings.
lo_display = go_salv->get_display_settings( ).
lo_display->set_list_header( 'ABAP SALV演示程序-公众号(ABAP猿)' ).
lo_display->set_striped_pattern( 'X' ).
...
ENDIF.
*------------------------------------*
IF p_day03 EQ 'X'.
DATA lo_columns TYPE REF TO cl_salv_columns_table .
lo_columns = go_salv->get_columns( ).
lo_columns->set_optimize( 'X' ).
...
IF p_day13 = 'X'.
DATA lo_column TYPE REF TO cl_salv_column_table .
lo_column ?= lo_columns->get_column( columnname = 'CARRID' ).
lo_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
ENDIF.
ENDIF.
*------------------------------------*
IF p_day04 EQ 'X'.
DATA lo_functions TYPE REF TO cl_salv_functions.
lo_functions = go_salv->get_functions( ).
lo_functions->set_all( 'X' ).
...
ENDIF.
*------------------------------------*
...
*------------------------------------*
IF p_day12 EQ 'X'.
DATA lo_selections TYPE REF TO cl_salv_selections.
lo_selections = go_salv->get_selections( ).
lo_selections->set_selection_mode( if_salv_c_selection_mode=>cell ).
...
ENDIF.
*------------------------------------*
IF p_day13 EQ 'X'.
DATA lo_events_table TYPE REF TO cl_salv_events_table.
lo_events_table = go_salv->get_event( ).
DATA lo_evt_handler TYPE REF TO lcl_evt_handler.
CREATE OBJECT lo_evt_handler.
SET HANDLER lo_evt_handler->on_link_click FOR lo_events_table.
SET HANDLER lo_evt_handler->on_double_click FOR lo_events_table.
SET HANDLER lo_evt_handler->on_added_function FOR lo_events_table.
SET HANDLER lo_evt_handler->before_salv_function FOR lo_events_table.
SET HANDLER lo_evt_handler->after_salv_function FOR lo_events_table.
...
ENDIF.
*------------------------------------*
go_salv->display( ).
小贴士:
- 可使用BC_DATA_GEN生成数据,以便查看演示效果;
- 以上纯属个人总结,如有纰漏请联系我;
以上是今日分享,希望对你有所帮助~~
04 关注我
更多干货请扫码关注微信公众号:ABAP猿