SAP-ABAP-SLAV用法
SALV 是 SAP ALV 显示的第三代技术,第一代 REUSE_ALV_LIST_DISPLAY / REUSE_GRID__DISPLAY 是基于函数的,第二代 cl_gui_alv_grid 使用面向对象的方式,但必须有一个 container (使用dialog screen),第三代 cl_salv_table 也是基于面向对象,使用起来更加简单。756版本之前不能编辑,这是它的一个缺点,756 版本之后可以编辑。
1、使用 SALV 显示数据
使用 SALV 显示数据,需要两个步骤:
1)通过 cl_salv_table 的 factory 方法构建一个 salv 对象,传入内表
2)通过 cl_salv_table 的实例方法 display() 显示数据

REPORT ztest01. SELECT * FROM spfli UP TO 20 ROWS INTO TABLE @DATA(lt_spfli). TRY. cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_salv) CHANGING t_table = lt_spfli ). lo_salv->display( ). CATCH cx_salv_msg INTO DATA(lo_exception). DATA(lv_msg) = lo_exception->get_text( ). MESSAGE lv_msg TYPE 'I'. ENDTRY.

2、工具栏
上图的 SALV 没有工具栏,这是因为 cl_salv_table 在面向对象的思想下,工具栏被实现为单独的对象 cl_salv_functions_list 。


在程序的 display()之前,添加下面的代码:
REPORT ztest01. SELECT * FROM spfli UP TO 20 ROWS INTO TABLE @DATA(lt_spfli). TRY. cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_salv) CHANGING t_table = lt_spfli ). "___________________________________________________________ " 显示工具栏 lo_salv->get_functions( )->set_all( ). "___________________________________________________________ lo_salv->display( ). CATCH cx_salv_msg INTO DATA(lo_exception). DATA(lv_msg) = lo_exception->get_text( ). MESSAGE lv_msg TYPE 'I'. ENDTRY.
3、显示设置
SALV 显示设置的类是 CL_SALV_DISPLAY_SETTINGS,cl_salv_table 的 get_display_settings() 方法获取。CL_SALV_DISPLAY_SETTINGS 的重要方法包括:
- 是否显示垂直线 (SET_VERTICAL_LINES)
- 是否显示水平线 (SET_HORIZONTAL_LINES)
- 条纹显示(SET_STRIPED_PATTERN)
- 设置 ALV 标题 (SET_LIST_HEADER)
" 条纹显示 data(lo_display_settings) = lo_salv->get_display_settings( ). lo_display_settings->set_striped_pattern( abap_true ).
4、字段设置
cl_salv_table 的 get_columns() 方法获取所有列(类型为 cl_salv_columns_table),cl_salv_columns_table 的 get_column() 方法得到某一列。
" 字段名设置 data(lo_column) = lo_salv->get_columns( )->get_column( 'CONNID' ). lo_column->set_short_text( '航班' ). lo_column->set_medium_text( '航班' ). lo_column->set_long_text( '航班' ). " 自适应列宽 lo_salv->get_columns( )->set_optimize( 'X' ). " 隐藏某列 data(lo_hide_col) = lo_salv->get_columns( )->get_column( 'PERIOD' ). lo_hide_col->set_visible( abap_false ).
5、字段排序
字段排序通过类 CL_SALV_SORTS 来实现。
" 按列排序 lo_salv->get_sorts( )->add_sort( 'CONNID' ).
6、允许保存布局
* Layut saving *---------------------------------------------- data(lo_layout) = lo_salv->get_layout( ). " set layout key lo_layout->set_key( value #( report = sy-repid ) ). " Allow variant saving " remove restriction on saving layouts lo_layout->set_save_restriction( if_salv_c_layout=>restrict_none ). " Set initial layout lo_layout->set_initial_layout( 'Z01' ). " Allow setting layouts as default layouts lo_layout->set_default( abap_true ).
7、热点
热点的列在下面有超链接的下划线,通过事件可以设置点击的动作。
" Register hotspot column data(lo_hotspot_col) = lo_salv->get_columns( )->get_column( 'CARRID' ). data(lo_hotspot_table) = cast cl_salv_column_table( lo_hotspot_col ). lo_hotspot_table->set_cell_type( if_salv_c_cell_type=>hotspot ).
现在在 CARRID 列,已经有了下划线的超链接,但点击没有反应。我们还需要定义类来处理 cl_salv_events_table 的 link_click 事件。
第一步:定义事件处理类
class lcl_event_handler definition. public section. methods on_link_click for event link_click of cl_salv_events_table importing row column. endclass. class lcl_event_handler implementation. method on_link_click. " Handle hotspot click data(lv_msg) = | Row: { row } Column: { column } |. message lv_msg type 'I'. endmethod. endclass.
第二步:实例化 lcl_event_hander
data(lo_event_handler) = new lcl_event_handler( ).
第三步:将 lo_event_hander 注册为处理 CL_SALV_EVENTS_TABLE 的 link_click 事件处理器
data(lo_events) = lo_salv->get_event( ).
set handler lo_event_handler->on_link_click for lo_events.
8、设置合计列
" 合计列 lo_salv->get_aggregations( )->add_aggregation( columnname = 'DISTANCE' aggregation = if_salv_c_aggregation=>total ).

浙公网安备 33010602011771号