一、概要
在Net Weaver 2004 平台上集合了利用函数和 GRID 的功能发布的 SALV 包程序 (SALV也称为 New ALV)。SALV 可以像利用函数生成 ALV 的不用创建屏幕就可以调用的全屏式ALV,还可以利用控制器在屏幕的控制器中显示 ALV。利用GRID 的ALV 虽然不能注册成 Batch Job 在后台运行,但 SALV 却可以。SALV 与现有的方法 (Function ALV) 相比,为了方便以接口的方式提供更整合及细微的功能,但是 SALV 不提供编辑功能。
二、SALV类型与实现
定义数据,为下面例子声明共同的变量:
DATA:gt_itab TYPE TABLE OF sflight,
gr_table TYPE REF TO cl_salv_table.
SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_itab.
类型:
全屏模式
*全屏模式
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
CALL METHOD gr_table->display.
全屏模式-Classic报表模式
*全屏Classic List模式
cl_salv_table=>factory(
EXPORTING
list_display = abap_true
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
CALL METHOD gr_table->display.
利用控制器模式(此处还需要创建一个屏幕和自定义控件container)
*利用控制器的模式
DATA:gui TYPE REF TO cl_gui_custom_container,
ok_code LIKE sy-ucomm .
CALL SCREEN 100.
INCLUDE z_salv_test_status_0100o01.
INCLUDE z_salv_test_user_command_01i01.
*----------------------------------------------------------------------*
***INCLUDE Z_SALV_TEST_STATUS_0100O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS '100'.
IF gui is INITIAL.
CREATE OBJECT gui
EXPORTING
container_name = 'CONTAINER'.
TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
r_container = gui
container_name = 'CONTAINER'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
.
CATCH cx_salv_msg.
ENDTRY.
CALL METHOD gr_table->display.
ENDIF.
ENDMODULE.
*----------------------------------------------------------------------*
***INCLUDE Z_SALV_TEST_USER_COMMAND_01I01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'EXIT'.
set SCREEN 0.
leave SCREEN.
ENDCASE.
ENDMODULE.
在画面上显示 ALV,使用以下两种方法已足够。
(1) FACTORY
- 定义要显示在画面上的数据
-定义ALV 报表样式。
(2) DISPLAY
-调用此方法画面上就显示 ALV。
FACTORY 方法是静态方法,因此使用 =>符号,而DISPLAY 方法是 Instance 方法,因此使用-> 符号。
三、设置SALV输出样式
1、SALV与子类
定义子类的引用对象变量:
DATA gr_display TYPE REF TO cl_salv_display_settings
调用子类类型对应的主类方法:
gr_display = gr_table->get display_settings ( ).
利用子类方法设置详细事项:
gr_display->set_striped_pattern(value = 'X')
2、设置标题
3、设置SALV的垂直/水平区分行
4、保存布局
*****设置布局
DATA gr_display TYPE REF TO cl_salv_display_settings.
DATA gr_layout TYPE REF TO cl_salv_layout.
DATA g_program TYPE salv_s_layout_key.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
*设置标题
gr_display = gr_table->get_display_settings( ).
gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
gr_display->set_list_header('header test').
*关闭垂直、水平区分行
gr_display->set_horizontal_lines( cl_salv_display_settings=>false ).
gr_display->set_vertical_lines( cl_salv_display_settings=>false ).
*保存布局
gr_layout = gr_table->get_layout( ).
g_program-report = sy-repid.
gr_layout->set_key( g_program ).
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
CALL METHOD gr_table->display.
5、修改字段属性
******修改字段属性
DATA:gr_columns TYPE REF TO cl_salv_columns_table,
gr_column TYPE REF TO cl_salv_column_table.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
gr_columns = gr_table->get_columns( ).
*隐藏字段属性
gr_column ?= gr_columns->get_column( 'MANDT' ).
gr_column->set_visible( cl_salv_column_table=>false ).
*修改字段描述
gr_column ?= gr_columns->get_column( 'CARRID' ).
gr_column->set_long_text( 'long text' ).
gr_column->set_medium_text( 'medium text' ).
gr_column->set_short_text( 'short text' ).
*设置字段颜色
DATA g_color TYPE lvc_s_colo.
gr_column ?= gr_columns->get_column( 'PRICE' ).
g_color-col = '6'.
g_color-int = '1'.
g_color-inv = '0'.
gr_column->set_color( g_color ).
*设置字段的最佳长度
gr_columns->set_optimize( 'X' ).
gr_table->display( ).
6、SALV选择模式
******SALV选择模式
DATA gr_selection TYPE REF TO cl_salv_selections.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
gr_selection = gr_table->get_selections( ).
gr_selection->set_selection_mode( if_salv_c_selection_mode=>row_column ).
CALL METHOD gr_table->display.
7、以弹出窗口形式显示
可以在弹出窗口下显示 SALV,可以通过 set_screen _popup 方法实现,但利用控制器的方法中是无法使用的。利用控制器的 SALV 是在屏幕属性中选择 Dialog Box 来实现此功能的
******以弹出窗口显示
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
CALL METHOD gr_table->set_screen_popup
EXPORTING
start_column = 1
end_column = 100
start_line = 1
end_line = 20 .
CALL METHOD gr_table->display.
8、数据排序
数据排序利用参照 CL_SALV_SORTS 类的对象参照变量实现。利用 GR_TABLE 的GET_SORT 方法与负责排序的 ALV 对象链接通过 ADD_SORT 方法追加要排序的字段。
****数据排序
DATA gr_sort TYPE REF TO cl_salv_sorts.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
gr_sort = gr_table->get_sorts( ).
gr_sort->add_sort( 'CONNID' ).
CALL METHOD gr_table->display.
9、设置 Aggregation
利用 CL_SALV_AGGREATIONS 类可以合计 Numeric 类型的字段数据。若只是在字段级别上进行合计就没必要排序数据,但是根据主键值进行小计 (Subtotal) 就需要先进行排序。
*****设置Aggregation
DATA gr_sorts TYPE REF TO cl_salv_sorts.
DATA gr_agg TYPE REF TO cl_salv_aggregations.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
gr_sorts = gr_table->get_sorts( ).
gr_sorts->add_sort( columnname = 'CONNID' subtotal = 'X' ).
gr_agg = gr_table->get_aggregations( ).
gr_agg->add_aggregation( 'PRICE' ).
CALL METHOD gr_table->display.
10、设置过滤字段
过滤功能可以限制显示在 ALV 报表中的数据。利用 CL_SALV_FILTERS 类设置GR_TABLE 的GET_FILTERS 方法。通过 ADD_FILTER 方法追加过滤设置条件及字段。
****设置过滤字段
DATA gr_filter TYPE REF TO cl_salv_filters.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_itab
).
gr_filter = gr_table->get_filters( ).
gr_filter->add_filter( columnname = 'CONNID'
sign = 'I'
option = 'EQ'
low = '555' ).
CALL METHOD gr_table->display.
事件
事件是没有继承关系的类之间互相调用方法时使用的特殊方法。对像(或者类)为了调用 (Trigger)其他对象(或者类)的事件的方法而使用事件。通过 CALLMETHOD 语句调用一般方法的时候一个方法会由多个对象调用。与此类似,所有对象都可以调用事件且只有事件主体的对象才能执行事件。调用一般方法时程序可以决定要调用的方法。与此相同,在事件中可以决定事件要反映的事件。
(1)定义事件
(2)定义事件控制器方法
(3)注册事件控制器方法
(4)调用事件
(5)执行事件控制方法
DOUBLE CLICK 事件
HOTSPOTCLICK 事件
Toolbar 事件
USER-COMMAND 事件
SALV GRID要素
处理信号灯
处理信号灯(Exception)是将界限值利用图表按区间显示数据的属性。如[图 17-14]所示SALV 字段用图表显示按钮根据特定字段的值修改颜色。这可以方便最终用户识别数据的紧急性、重要性。
处理按钮
在SALV 中可以利用ALV Object 类以图标形式显示单元格。为了显示图标,追加 icon d类型的字段。
修改单元格颜色
在 SALV GRID 中可以修改需要强调的单元格的颜色。一般字段单位的颜色强调更常使用系统资源。内表中追加LVC T SCOL 类型的颜色表。此逻辑与在 ALV GRID 中设置单元格颜色的过程相似。