前言
SALV是什么?是SAP推出的一种面向对象的ALV开发技术,它能使用较少的代码,快速构建出一个ALV。
我所认识的很多开发顾问很少有人在项目中使用过,甚至有部分顾问还未曾听说过SALV。
初识SALV
下面我们通过一个简单的例子来认识一下SALV
REPORT zyxs_salv01.DATA gt_sflight TYPE STANDARD TABLE OF sflight.DATA go_salv TYPE REF TO cl_salv_table.
SELECT * UP TO 100 ROWS INTO TABLE @gt_sflight FROM sflight.
*Create alv object.TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_salv CHANGING t_table = gt_sflight. CATCH cx_salv_msg.ENDTRY.• Display alvgo_salv->display( ).
怎么样?是不是很简单,只需要调用 cl_salv_table=>factory 方法,传入需要显示的数据内表,返回一个 cl_salv_table对象,然后调用display方法就可以显示了,相较于其它的Function
ALV或者CL_GUI_ALV_GRID类来说,使用起来简单多了,SALV无需定义内表的fieldcatalog,仅仅这一点就能节省开发顾问的不少时间了。
基础使用SALV
在实际使用中,一个ALV一些基础的功能是需要具备的,如标准工具栏、列的隐藏、列名描述的修改、行/列/单元格颜色、斑马线、列宽自适应、保存布局等,接下来这个例子将为大家揭示SALV的一些基础使用方法。
REPORT zyxs_salv02.TYPES: BEGIN OF gty_sflight. INCLUDE STRUCTURE sflight.TYPES: t_color TYPE lvc_t_scol, END OF gty_sflight.
DATA: gt_sflight TYPE STANDARD TABLE OF gty_sflight.DATA go_salv TYPE REF TO cl_salv_table.
SELECT * UP TO 100 ROWS INTO CORRESPONDING FIELDS OF TABLE @gt_sflight FROM sflight.
DATA: lt_s_color TYPE lvc_t_scol, ls_s_color TYPE lvc_s_scol.
LOOP AT gt_sflight ASSIGNING FIELD-SYMBOL(<fs_sflight>). REFRESH: lt_s_color. IF sy-tabix MOD 3 = 0.* 被3整除的行设置行颜色 ls_s_color-color-col = 5. ls_s_color-color-int = 0. ls_s_color-color-inv = 0. APPEND ls_s_color TO lt_s_color. CLEAR ls_s_color. ENDIF. IF sy-tabix MOD 2 = 0.* 被2整除的行,设置单元格颜色,注意和设置整行的区别,多fname字段赋值 ls_s_color-fname = 'PAYMENTSUM'. ls_s_color-color-col = 6. ls_s_color-color-int = 0. ls_s_color-color-inv = 0. APPEND ls_s_color TO lt_s_color. CLEAR ls_s_color. ENDIF. <fs_sflight>-t_color = lt_s_color.ENDLOOP.
*Create alv object.TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_salv CHANGING t_table = gt_sflight. CATCH cx_salv_msg.ENDTRY.* 显示SALV所有标准功能.DATA(lo_functions) = go_salv->get_functions( ).lo_functions->set_all( abap_true ).
* 获取所有列DATA(lo_columns) = go_salv->get_columns( ).* 设置列宽自适应lo_columns->set_optimize( abap_true ).*设置斑马线DATA(lo_dspset) = go_salv->get_display_settings( ).lo_dspset->set_striped_pattern( abap_true ).
DATA lo_column TYPE REF TO cl_salv_column.*隐藏列TRY. lo_column ?= lo_columns->get_column( columnname = 'MANDT' ). lo_column->set_technical( abap_true ).
CATCH cx_salv_not_found .ENDTRY.*改列描述TRY. lo_column ?= lo_columns->get_column( columnname = 'SEATSMAX' ). lo_column->set_short_text( '经济舱座位数' ). lo_column->set_medium_text( '经济舱座位数' ). lo_column->set_long_text( '经济舱座位数' ). CATCH cx_salv_not_found .ENDTRY.
*设置整列颜色DATA: lo_col_tab TYPE REF TO cl_salv_column_table.DATA: ls_color TYPE lvc_s_colo.TRY. lo_col_tab ?= lo_columns->get_column( columnname = 'SEATSMAX' ). ls_color-col = 3. "定义颜色 ls_color-int = 1. "反转颜色启用/关闭 1/0 ls_color-inv = 0. "增强颜色启用/关闭 1/0 lo_col_tab->set_color( ls_color ). "设置颜色 CATCH cx_salv_not_found.ENDTRY."设置行和单元格颜色TRY. lo_columns->set_color_column( 'T_COLOR' ). CATCH cx_salv_data_error .ENDTRY.
DATA: ls_key TYPE salv_s_layout_key.DATA(lo_layout) = go_salv->get_layout( ).ls_key-report = sy-repid.ls_key-handle = '1000'.* 设置默认布局lo_layout->set_key( ls_key ).lo_layout->set_default( abap_true ).* 允许保存布局lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).• Display alvgo_salv->display( ).
这样这个简单的例子就可以满足日常的ALV的一些简单输出了。
cl_salv_column这个类还有很多方法,关于列的设置,都可以在这个类中找到对应的方法。
事件的使用
SALV同其它ALV一样,支持单击(hostspot)、双击、添加自定义按钮等功能,下面通过一个列子来介绍。
REPORT zyxs_salv03.*---------------------------------------------------------------------** CLASS lcl_handle_events DEFINITION*---------------------------------------------------------------------** 定义事件处理类*---------------------------------------------------------------------*CLASS lcl_handle_events DEFINITION. PUBLIC SECTION. METHODS: on_user_command FOR EVENT added_function OF cl_salv_events IMPORTING e_salv_function,
on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column,
on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column.ENDCLASS. "lcl_handle_events DEFINITION
*---------------------------------------------------------------------** CLASS lcl_handle_events IMPLEMENTATION*---------------------------------------------------------------------** 实现事件处理类*---------------------------------------------------------------------*CLASS lcl_handle_events IMPLEMENTATION. METHOD on_user_command. PERFORM show_function_info USING e_salv_function '自定义事件'. ENDMETHOD. "on_user_command
METHOD on_double_click. PERFORM show_cell_info USING row column '双击'. ENDMETHOD. "on_double_click
METHOD on_link_click. PERFORM show_cell_info USING row column '单击'. ENDMETHOD. "on_single_clickENDCLASS. "lcl_handle_events IMPLEMENTATIONDATA gt_sflight TYPE STANDARD TABLE OF sflight.DATA go_salv TYPE REF TO cl_salv_table.DATA gr_events TYPE REF TO lcl_handle_events.
START-OF-SELECTION. SELECT * UP TO 100 ROWS INTO TABLE @gt_sflight FROM sflight.
PERFORM display.
*&---------------------------------------------------------------------**& Form display*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*FORM display.*Create alv object. TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = go_salv CHANGING t_table = gt_sflight. CATCH cx_salv_msg. ENDTRY.* 可以以行、列的方式进行选择 DATA(lr_selection) = go_salv->get_selections( ). lr_selection->set_selection_mode( if_salv_c_selection_mode=>row_column ).• 设置自定义GUI状态栏 go_salv->set_screen_status( pfstatus = 'ZSALV_STATUS' report = sy-repid set_functions = go_salv->c_functions_all ).
* 显示SALV所有标准功能. DATA(lo_functions) = go_salv->get_functions( ). lo_functions->set_all( abap_true ).
* 获取所有列 DATA(lo_columns) = go_salv->get_columns( ).* 设置列宽自适应 lo_columns->set_optimize( abap_true ).*设置斑马线 DATA(lo_dspset) = go_salv->get_display_settings( ). lo_dspset->set_striped_pattern( abap_true ).
DATA lo_column TYPE REF TO cl_salv_column_table.*隐藏列 TRY. lo_column ?= lo_columns->get_column( columnname = 'MANDT' ). lo_column->set_technical( abap_true ).
CATCH cx_salv_not_found . ENDTRY.
*设置热点列 TRY. lo_column ?= lo_columns->get_column( 'CARRID' ). lo_column->set_cell_type( if_salv_c_cell_type=>hotspot ). CATCH cx_salv_not_found. "#EC NO_HANDLER ENDTRY.
*注册事件 DATA: lr_events TYPE REF TO cl_salv_events_table. lr_events = go_salv->get_event( ). CREATE OBJECT gr_events. SET HANDLER gr_events->on_user_command FOR lr_events. SET HANDLER gr_events->on_double_click FOR lr_events. SET HANDLER gr_events->on_link_click FOR lr_events.
DATA: ls_key TYPE salv_s_layout_key. DATA(lo_layout) = go_salv->get_layout( ). ls_key-report = sy-repid. ls_key-handle = '1000'.* 设置默认布局 lo_layout->set_key( ls_key ). lo_layout->set_default( abap_true ).* 允许保存布局 lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).• Display alv go_salv->display( ).
ENDFORM.*&---------------------------------------------------------------------**& Form show_function_info*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*FORM show_function_info USING i_function TYPE salv_de_function i_text TYPE string.
DAT
...