SALV无废话教程

SALV 是 SAP ALV 显示的第三代技术,第一代 REUSE_ALV_LIST_DISPLAY / REUSE_GRID__DISPLAY 是基于函数的,第二代 cl_gui_alv_grid 使用面向对象的方式,但必须有一个 container (使用dialog screen),第三代 cl_salv_table 也是基于面向对象,使用起来更加简单。756版本之前不能编辑,这是它的一个缺点,756 版本之后可以编辑。

使用 SALV 显示数据

使用 SALV 显示数据,需要两个步骤:

1)通过 cl_salv_table 的 factory 方法构建一个 salv 对象,传入内表

2)通过 cl_salv_table 的实例方法 display() 显示数据

  select * from spfli up to 20 rows
  into table @data(lt_spfli).

  cl_salv_table=>factory(
    importing
      r_salv_table   = data(lo_salv)
    changing
      t_table        = lt_spfli
  ).

  lo_salv->display(  ).

在 Eclipse ADT 中,输入 cl_salv_table=>facotry 之后,可以通过快捷键 Shift + Enter 完成代码的输入,如下图所示,这种方式比 GUI 的 Pattern 更好用。

另外就是需要处理 exception: cx_salv_msg,示例代码如下:

start-of-selection.
  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.

和 SAP 之前的方法比,我们不需要去构建每一个输出列的 fieldcatalog,只需要给定装载数据的内表就可以了。运行,程序显示的界面如下:

工具栏

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

我们在程序的 display()之前,添加下面的代码:

" 显示工具栏
lo_salv->get_functions( )->set_all(  ).

显示设置

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 ).

字段设置

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 ).

字段排序

字段排序通过类 CL_SALV_SORTS 来实现。

" 按列排序
lo_salv->get_sorts( )->add_sort( 'CONNID' ).

允许保存布局

*----------------------------------------------
*     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 ).

热点

热点的列在下面有超链接的下划线,通过事件可以设置点击的动作。

  " 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.

设置合计列

" 合计列
lo_salv->get_aggregations( )->add_aggregation(
        columnname  = 'DISTANCE'
        aggregation = if_salv_c_aggregation=>total ).

ABAP SALVSAP List Viewer)是一个用于在SAP系统中创建和显示报表的工具。要在ABAP SALV报表中添加复选框(checkbox),你可以按照以下步骤进行操作: 1. 定义内表(table):首先,你需要定义一个内表来存储数据和复选框的状态。可以使用`TYPES`关键字定义一个包含所需字段的结构。 2. 填充内表数据:将需要显示的数据填充到内表中。可以使用`APPEND`语句将数据行添加到内表中。 3. 创建SALV对象:使用`CL_SALV_TABLE`类创建一个SALV对象,并将内表作为参数传递给构造方法。 4. 添加复选框列:通过调用`ADD_CHECKBOX_COLUMN`方法,为SALV对象添加一个复选框列。可以指定该列的标题和字段名。 5. 显示报表:使用`DISPLAY`方法显示SALV报表。 下面是一个简单的示例代码: ```abap DATA: lt_data TYPE TABLE OF (your_structure), lo_salv TYPE REF TO cl_salv_table. * 定义内表类型 TYPES: BEGIN OF ty_data, field1 TYPE data_type, field2 TYPE data_type, checkbox TYPE abap_bool, END OF ty_data. * 填充内表数据 APPEND VALUE #( field1 = value1 field2 = value2 ) TO lt_data. * 创建SALV对象 lo_salv = cl_salv_table=>factory( ). * 添加复选框列 lo_salv->add_checkbox_column( title = 'CheckBox' fieldname = 'CHECKBOX' ). * 设置内表数据 lo_salv->set_table_for_first_display( exporting i_structure_name = 'TY_DATA' changing it_outtab = lt_data ). * 显示报表 lo_salv->display( ). ``` 这段代码将在SALV报表中显示一个复选框列,用户可以选择或取消选择复选框。请根据你的实际需求修改字段名称、数据类型和内表数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值