声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291387.html
OOSALV.. 123
三种显示模式... 123
全屏模式... 125
全屏经典列表模式... 126
可控模式... 126
CL_SALV_TABLE设置相关方法... 128
样式设置... 130
显示设置... 130
布局变式... 131
类似的Fieldcat. 133
隐藏字段(列)... 134
设置列标题... 135
设置列的颜色... 136
优化列宽... 137
SALV行列选择模式... 138
以弹出框显示SALV.. 139
排序、分类汇总... 140
设置数据过滤条件... 145
GUI Status. 147
使用预置的GUI Status. 147
在预设置工具栏上附加按钮... 148
事件... 150
DOUBLE_CLICK双击事件... 150
LINK_CLICK热点点击事件... 152
ADDED_FUNCTION附加功能(按钮)事件... 154
红绿灯、灯提示信息... 156
图标显示、图标提示信息... 158
设置单元格颜色
OOSALV
在Net Weaver2004平台上集合了利用函数和GRID的功能发布的SALV包程序(SALV也称为New ALV)。
SALV可以像使用函数方式生成ALV那样,不用创建屏幕就可以调用的全屏方式显示的ALV
SALV的GRID报表可以在后台运行,但以前函数方式或OO方式生成的GRID不能?
SALV与现有的方法(Function ALV)相比,为了方便以接口的方式提供更整合及细微的功能,但SALV不提供编辑功能(但可以通过SALV适配器调用CL_GUI_ALV_GRID修改成编辑模式,就可以在ALV中修改数据了)
更多的实例请参考SALV程序包(Package),里面有大量示例
SALV有以下三种类型的报表:
三种显示模式
l 全屏模式——Classic 报表模式(普通List列表)
l 利用控制器的模式(利用用户自定义控件区域来控制ALV显示大小)
与CL_GUI_ALV_GRID相似的是CL_SALV_TABLE类,通过其factory方法,生成SALV实例:
要显示ALV,只需要调用以下两个方法即可:
factory:静态方法。定义要显示在屏幕上的数据;定义ALV报表样式;调用此方法就会返回CL_SALV_TABLE类型的实例对象
display:实例方法。调用此方法屏幕上就显示ALV
LIST_DISPLAY:参数决定了列表显示的模式:是以List普通列表方式显示,还是Grid网格方式显示
R_CONTAINER:用户自定义控件区域的引用对象,类型为CL_GUI_CONTAINER
CONTAINER_NAME:屏幕上用户自定义控件区域(Custom Control)的名称
上面三个参数与显示模式关系如下:
LIST_DISPLAY |
R_CONTAINER |
CONTAINER_NAME |
|
全屏 |
ABAP_FALSE |
初始值 |
初始值 |
Classic List |
ABAP_TRUE |
初始值 |
初始值 |
利用控制器 |
ABAP_FALSE |
CL_GUI_CONTAINER对象引用 |
用户自定义控件区域(Custom Control)名称 |
全屏模式
与通过REUSE_ALV_GRID_DISPLAY函数产生的ALV相当:
DATA: gr_table TYPE REF TO cl_salv_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTINGr_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_table->display( )."调用实例方法显示表报
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
全屏经典列表模式
与通过REUSE_ALV_LIST_DISPLAY函数产生的ALV相当:
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
EXPORTINGlist_display = abap_true"以列表形式显示
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_functions = gr_table->get_functions( ).
gr_functions->set_default( )."Activate Standard Selection of Generic ALV Functions。激活工具栏中通用的选择性按钮。根据当前显示是List模式、还是Grid模式,来设置工具条上最基本的默认按钮,比gr_functions->set_all( abap_true)设置的按钮要少很多
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
可控模式
先绘制屏幕 100,然后在其上面放上用户自定义控件区域(Custom Control),并命名为CONTAINER_1:
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code TYPE syucomm.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
CALL SCREEN 100.
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
MODULE 100_pbo OUTPUT.
PERFORM inital.
"判断是否已分配了一个有效引用
IF gr_container IS NOT BOUND.
"创建容器
CREATE OBJECT gr_container
EXPORTING
container_name = ‘CONTAINER_1‘."屏幕上用户自定义控件名
"创建ALV
cl_salv_table=>factory(
EXPORTING
r_container = gr_container
container_name = ‘CONTAINER_1‘
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_data[] ).
"设置工具栏
gr_functions= gr_table->get_functions( ).
gr_functions->set_all( abap_true). "Activate All Generic ALV Functions,将激活所有的ALV内置通用按钮
"显示
gr_table->display( ).
ENDIF.
ENDMODULE.
CL_SALV_TABLE设置相关方法
对SALV进行设置,先需要通过CL_SALV_TABLE对象实例获取相关设置对象,然后再对这些设置对进行操作
如对样式的设置,需要先通过CL_SALV_TABLE对象的GET_LAYOUT( )方法拿到CL_SALV_LAYOUT对象,实后通过该对象相关方法对SALV进行设置;除样式外,如排序、工具栏设置、事件等,都是先通过某个GET*方法拿到相应对象,再通过该对象相关方法对SALV进行设置,这与以前Function ALV、及OO ALV不太一样。如上面程序中对SALV工具栏进行设置是这样的:
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
gr_functions = gr_table->get_functions( ).
gr_functions->set_all( abap_true).
CL_SALV_TABLE类GET*相关方法:
样式设置
显示设置
SET_VERTICAL_LINES:设置是否显示垂直线
SET_HORIZONTAL_LINES:设置是否显示水平线
SET_STRIPED_PATTERN:斑马条纹(行颜色交替)
SET_LIST_HEADER_SIZE:报表头
SET_FIT_COLUMN_TO_TABLE_SIZE:列自适应表格宽度
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
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_table->display( ). "调用实例方法显示表报
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bb‘.
APPEND gt_data.
ENDFORM.
布局变式
F4_LAYOUTS
SET_DEFAULT
SET_INITIAL_LAYOUT
SET_KEY
SET_SAVE_RESTRICTION
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout.
DATA: gs_program TYPE salv_s_layout_key."该结构包含了布局变式所属程序名
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_layout = gr_table->get_layout( ).
gs_program-report = sy-repid.
gr_layout->set_key( gs_program )."设置布局保存为变式时,这些变式应属性此Key(本程序名)
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none )."允许保存布局为变式
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bb‘.
APPEND gt_data.
ENDFORM.
类似的Fieldcat
Function ALV、OO ALV可通过Fieldcat对列进行相关设置,SALV也有类似于这样的东西,只不过不是Fieldcat,而是通过CL_SALV_COLUMN对象来实现的。CL_SALV_COLUMN的获取过程如下:
隐藏字段(列)
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_columns = gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘KEY1‘ )."需处理的列
gr_column->set_visible( cl_salv_column_table=>false )."隐藏列,注:这里虽然是隐藏了,但在布局设置里还是可以看到此列的,如果使布局里也看不到,则需要gr_column->set_technical( ‘X‘ ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
设置列标题
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_columns= gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘KEY2‘ )."需处理的列
gr_column->set_long_text( ‘key2‘ ).
gr_column->set_medium_text( ‘key2‘ ).
gr_column->set_short_text( ‘key2‘ ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
设置列的颜色
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: g_color TYPE lvc_s_colo.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_columns = gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘KEY2‘ )."需处理的列
g_color-col = ‘6‘.
g_color-int = ‘1‘.
g_color-inv = ‘0‘.
gr_column->set_color( g_color ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bb‘.
APPEND gt_data.
ENDFORM.
优化列宽
相当于Function ALV所使用Layout的colwidth_optimize属性
优化前:
优化后:
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(20),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( ‘X‘ ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bbbbbbbb‘.
APPEND gt_data.
ENDFORM.
SALV行列选择模式
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_selection TYPE REF TO cl_salv_selections.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(20),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
gr_selection = gr_table->get_selections( ).
gr_selection->set_selection_mode( if_salv_c_selection_mode=>row_column )."可以以行、列的方式进行选择
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bbbbbbbb‘.
APPEND gt_data.
ENDFORM.
以弹出框显示SALV
可控模式(利用控制器的模式)的SALV是不能以弹出框来显示的
DATA: gr_table TYPE REF TO cl_salv_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,"ALV标题行会参照词典类型
key2(20),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
gr_table->set_screen_popup(
start_column = 1
end_column = 50
start_line = 1
end_line = 5 ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bbbbbbbb‘.
APPEND gt_data.
ENDFORM.
排序、分类汇总
该示例与前面Function ALV的示例效果是一样的
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_agg TYPE REF TO cl_salv_aggregations.
DATA:BEGIN OF gt_data OCCURS 0,
key1(1),
key2(2),
str(3),
int1 TYPE i,
int2 TYPE i,
int3 TYPE i,
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
gr_columns= gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘KEY1‘ ).
gr_column->set_long_text( ‘key1‘ ).
gr_column ?= gr_columns->get_column( ‘KEY2‘ ).
gr_column->set_long_text( ‘key2‘ ).
gr_column ?= gr_columns->get_column( ‘STR‘ ).
gr_column->set_long_text( ‘str‘ ).
gr_column ?= gr_columns->get_column( ‘INT1‘ ).
gr_column->set_long_text( ‘int1‘ ).
gr_column ?= gr_columns->get_column( ‘INT2‘ ).
gr_column->set_long_text( ‘int2‘ ).
gr_column ?= gr_columns->get_column( ‘INT3‘ ).
gr_column->set_long_text( ‘int3‘ ).
gr_sorts = gr_table->get_sorts( ).
gr_sorts->add_sort(
columnname = ‘KEY1‘
position = 1 "排序的顺序,如果根据多个字段来排时,决定哪个先排
sequence = if_salv_c_sort=>sort_up "升序
"是否需要以此字段进行分类小计
subtotal = if_salv_c_bool_sap=>true
).
gr_sorts->add_sort(
columnname = ‘KEY2‘
position = 2
sequence = if_salv_c_sort=>sort_down "降序
subtotal = if_salv_c_bool_sap=>true
).
gr_agg = gr_table->get_aggregations( ).
"需要进行分类小计及汇总的字段:INT1、INT2
gr_agg->add_aggregation( ‘INT1‘ ). "决定此列是否进行分类汇总。注:如果先不进行排序,则只有汇总,不会进行分类小计
gr_agg->add_aggregation( ‘INT2‘ ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
gt_data-str = ‘aaa‘.
gt_data-int1 = 2.
gt_data-int2 = 1.
gt_data-int3 = 8.
APPEND gt_data.
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
gt_data-str = ‘aab‘.
gt_data-int1 = 3.
gt_data-int2 = 2.
gt_data-int3 = 7.
APPEND gt_data.
gt_data-key1 = ‘c‘.
gt_data-key2 = ‘aa‘.
gt_data-str = ‘aab‘.
gt_data-int1 = 4.
gt_data-int2 = 2.
gt_data-int3 = 6.
APPEND gt_data.
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘ab‘.
gt_data-str = ‘aba‘.
gt_data-int1 = 6.
gt_data-int2 = 1.
gt_data-int3 = 2.
APPEND gt_data.
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘ab‘.
gt_data-str = ‘abb‘.
gt_data-int1 = 3.
gt_data-int2 = 4.
gt_data-int3 = 2.
APPEND gt_data.
gt_data-key1 = ‘e‘.
gt_data-key2 = ‘ca‘.
gt_data-str = ‘eca‘.
gt_data-int1 = 2.
gt_data-int2 = 2.
gt_data-int3 = 4.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘ba‘.
gt_data-str = ‘bba‘.
gt_data-int1 = 8.
gt_data-int2 = 5.
gt_data-int2 = 2.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bb‘.
gt_data-str = ‘bbb‘.
gt_data-int1 = 1.
gt_data-int2 = 2.
gt_data-int3 = 4.
APPEND gt_data.
gt_data-key1 = ‘c‘.
gt_data-key2 = ‘ca‘.
gt_data-str = ‘cca‘.
gt_data-int1 = 5.
gt_data-int2 = 1.
gt_data-int2 = 3.
APPEND gt_data.
gt_data-key1 = ‘c‘.
gt_data-key2 = ‘cc‘.
gt_data-str = ‘ccc‘.
gt_data-int1 = 2.
gt_data-int2 = 1.
gt_data-int3 = 5.
APPEND gt_data.
gt_data-key1 = ‘d‘.
gt_data-key2 = ‘ca‘.
gt_data-str = ‘dca‘.
gt_data-int1 = 4.
gt_data-int2 = 6.
gt_data-int3 = 2.
APPEND gt_data.
ENDFORM.
设置数据过滤条件
ALV 的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_filter TYPE REF TO cl_salv_filters.
DATA:BEGIN OF gt_data OCCURS 0,
key1(1),
key2(2),
str(3),
int1 TYPE i,
int2 TYPE i,
int3 TYPE i,
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
gr_columns = gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘KEY1‘ ).
gr_column->set_long_text( ‘key1‘ ).
gr_column ?= gr_columns->get_column( ‘KEY2‘ ).
gr_column->set_long_text( ‘key2‘ ).
gr_column ?= gr_columns->get_column( ‘STR‘ ).
gr_column->set_long_text( ‘str‘ ).
gr_column ?= gr_columns->get_column( ‘INT1‘ ).
gr_column->set_long_text( ‘int1‘ ).
gr_column ?= gr_columns->get_column( ‘INT2‘ ).
gr_column->set_long_text( ‘int2‘ ).
gr_column ?= gr_columns->get_column( ‘INT3‘ ).
gr_column->set_long_text( ‘int3‘ ).
gr_filter = gr_table->get_filters( ).
"只有Key1为 a,str以ab开头的数据才显示出来
gr_filter->add_filter(
columnname = ‘KEY1‘
sign = ‘I‘
option = ‘EQ‘
low = ‘a‘).
gr_filter->add_filter(
columnname = ‘STR‘
sign = ‘I‘
option = ‘CP‘
low = ‘ab*‘).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
gt_data-str = ‘aaa‘.
gt_data-int1 = 2.
gt_data-int2 = 1.
gt_data-int3 = 8.
APPEND gt_data.
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
gt_data-str = ‘aab‘.
gt_data-int1 = 3.
gt_data-int2 = 2.
gt_data-int3 = 7.
APPEND gt_data.
gt_data-key1 = ‘c‘.
gt_data-key2 = ‘aa‘.
gt_data-str = ‘aab‘.
gt_data-int1 = 4.
gt_data-int2 = 2.
gt_data-int3 = 6.
APPEND gt_data.
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘ab‘.
gt_data-str = ‘aba‘.
gt_data-int1 = 6.
gt_data-int2 = 1.
gt_data-int3 = 2.
APPEND gt_data.
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘ab‘.
gt_data-str = ‘abb‘.
gt_data-int1 = 3.
gt_data-int2 = 4.
gt_data-int3 = 2.
APPEND gt_data.
ENDFORM.
GUI Status
使用预置的GUI Status
注:若要设置自定义的GUI Status,只适用于全屏模式与全屏幕经典列表模式的SALV
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory("全屏模式的SALV
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
"设置工具条:只适用于全屏模式与全屏幕经典列表模式的SALV
gr_table->set_screen_status(
pfstatus = ‘T002‘"系统提示的标准Status为SAPLSALV_METADATA_STATUS程序中的SALV_TABLE_STANDARD
report = sy-repid
"注:此参数只对SALV标准的预设保留按钮起作用,也就是说,当 T001 GUI Status是从
"系统中提供的标准Gui Staus拷贝时才起作用,即通用此参数来屏蔽或显示某些预置按钮
"对自己完全新创建的GUI Status是的按钮(实质上是根据 FunCode来判断的)不起作用
set_functions = gr_table->c_functions_all )."显示所有通用的预设按钮
"set_functions = gr_table->c_functions_default )."显示基本默认选择性的预设按钮
"set_functions = gr_table->c_functions_none )."所有预设按钮都将不会显示
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
在预设置工具栏上附加按钮
附加按钮只适用于可控制模式(即用户对话屏幕)的SALV
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code TYPE syucomm.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,
key2(2),
END OF gt_data.
START-OF-SELECTION.
CALL SCREEN 100.
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
MODULE 100_pbo OUTPUT.
PERFORM inital.
"判断是否已分配了一个有效引用
IF gr_container IS NOT BOUND.
"创建容器
CREATE OBJECT gr_container
EXPORTING
container_name = ‘CONTAINER_1‘."屏幕上用户自定义控件名
"创建ALV
cl_salv_table=>factory(
EXPORTING
r_container = gr_container
container_name = ‘CONTAINER_1‘
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_data[] ).
"附加刷新按钮
DATA: lr_functions TYPE REF TO cl_salv_functions_list.
lr_functions = gr_table->get_functions( ).
lr_functions->set_all( abap_true )."Activate All Generic ALV Functions,将激活所有的ALV内置通用按钮
INCLUDE <icon>.
DATA: l_icon TYPE string.
l_icon = icon_refresh.
"附加按钮,只适用于 可控模式 下的SALV
lr_functions->add_function(
name = ‘refresh‘
icon = l_icon
text = ‘刷新按钮‘
tooltip = ‘刷新数据‘
"按钮存放的位置:这里在右边附加。该参数的其他取值可以查看该方法源码,可以
"找到该参数其他取值的蛛丝马迹
position = if_salv_c_function_position=>right_of_salv_functions ).
"显示
gr_table->display( ).
ENDIF.
ENDMODULE.
事件
DOUBLE_CLICK双击事件
CLASSl_cl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table
IMPORTING
row "事件触发所在的行号
column."事件触发所在的列名
ENDCLASS.
CLASS l_cl_handle_events IMPLEMENTATION.
METHOD on_double_click.
PERFORM show_cell_info USING row column ‘is selected‘.
ENDMETHOD.
ENDCLASS.
DATA: gr_table TYPE REF TO cl_salv_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
"=====获取事件对象
DATA: lr_event TYPE REF TO cl_salv_events_table.
lr_event = gr_table->get_event( ).
"=====事件注册
DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
CREATE OBJECT lr_handle_event.
SET HANDLER lr_handle_event->on_double_click FOR lr_event.
gr_table->display( ).
FORM show_cell_info USING p_row TYPE i
p_column TYPE lvc_fname
p_text TYPE string.
DATA: l_row TYPE char10.
WRITE p_row TO l_row LEFT-JUSTIFIED.
CONCATENATE l_row ‘Line,‘ p_column ‘Column‘ p_text INTO p_text SEPARATED BY space.
MESSAGE i001(00) WITH p_text.
ENDFORM.
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
LINK_CLICK热点点击事件
CLASS l_cl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS: on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING
row "事件触发所在的行号
column."事件触发所在的列名
ENDCLASS.
CLASS l_cl_handle_events IMPLEMENTATION.
METHOD on_link_click.
PERFORM show_cell_info USING row column ‘is selected with hotspot‘.
ENDMETHOD.
ENDCLASS.
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,
key2(2),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
"设置热点列
gr_columns = gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘KEY1‘).
gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
"=====获取事件对象
DATA: lr_event TYPE REF TO cl_salv_events_table.
lr_event = gr_table->get_event( ).
"=====事件注册
DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
CREATE OBJECT lr_handle_event.
SET HANDLER lr_handle_event->on_link_click FOR lr_event.
gr_table->display( ).
FORM show_cell_info USING p_row TYPE i
p_column TYPE lvc_fname
p_text TYPE string.
DATA: l_row TYPE char10.
WRITE p_row TO l_row LEFT-JUSTIFIED.
CONCATENATE l_row ‘Line,‘ p_column ‘Column‘ p_text INTO p_text SEPARATED BY space.
MESSAGE i001(00) WITH p_text.
ENDFORM.
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
ADDED_FUNCTION附加功能(按钮)事件
在“在预设置工具栏上附加按钮”示例的基础上,增加按钮事件
CLASS l_cl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function.
ENDCLASS.
CLASS l_cl_handle_events IMPLEMENTATION.
METHOD on_user_command.
PERFORM handle_user_command USING e_salv_function.
ENDMETHOD.
ENDCLASS.
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,
key2(2),
END OF gt_data.
START-OF-SELECTION.
CALL SCREEN 100.
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
ENDFORM.
MODULE 100_pbo OUTPUT.
PERFORM inital.
"判断是否已分配了一个有效引用
IF gr_container IS NOT BOUND.
"创建容器
CREATE OBJECT gr_container
EXPORTING
container_name = ‘CONTAINER_1‘."屏幕上用户自定义控件名
"创建ALV
cl_salv_table=>factory(
EXPORTING
r_container = gr_container
container_name = ‘CONTAINER_1‘
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_data[] ).
"附加刷新按钮
DATA: lr_functions TYPE REF TO cl_salv_functions_list.
lr_functions = gr_table->get_functions( ).
lr_functions->set_all( abap_true ).
INCLUDE <icon>.
DATA: l_icon TYPE string.
l_icon = icon_refresh.
"附加按钮,只适用于 可控模式 下的SALV
lr_functions->add_function(
name = ‘REFRESH‘
icon = l_icon
text = ‘刷新按钮‘
tooltip = ‘刷新数据‘
"按钮存放的位置:这里在右边附加。该参数的其他取值可以查看该方法源码,可以
"找到该参数其他取值的蛛丝马迹
position = if_salv_c_function_position=>right_of_salv_functions ).
"=====获取事件对象
DATA: lr_event TYPE REF TO cl_salv_events_table.
lr_event = gr_table->get_event( ).
"=====事件注册
DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
CREATE OBJECT lr_handle_event.
SET HANDLER lr_handle_event->on_user_command FOR lr_event.
"显示
gr_table->display( ).
ENDIF.
ENDMODULE.
FORM handle_user_command USING p_function TYPE salv_de_function.
CASE p_function.
WHEN ‘REFRESH‘.
PERFORM inital.
gr_table->refresh( ).
ENDCASE.
ENDFORM.
红绿灯、灯提示信息
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: BEGIN OF gt_data OCCURS 0,
light(1), "信息灯列
val(1),
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
gr_columns = gr_table->get_columns( ).
gr_columns->set_exception_column( ‘LIGHT‘ ).
gr_column ?= gr_columns->get_column( ‘LIGHT‘ ).
"如果不通过下面set_ddic_reference方法来设置参
"照某词典类型,则异常列标题固定显示为 Exception
gr_column->set_long_text( ‘异常灯‘ ).
DATA: s_ddic TYPE salv_s_ddic_reference.
s_ddic-field = ‘FIELD‘.
s_ddic-table = ‘SALV_S_DDIC_REFERENCE‘.
gr_column->set_ddic_reference( s_ddic ).
gr_column ?= gr_columns->get_column( ‘VAL‘ ).
gr_column->set_long_text( ‘异常值‘ ).
"==========为异常列单无格不同的值添加不同的冒泡提示
DATA:lr_functional_settings TYPE REF TO cl_salv_functional_settings.
lr_functional_settings = gr_table->get_functional_settings( ).
DATA: lr_tooltips TYPE REF TO cl_salv_tooltips.
lr_tooltips = lr_functional_settings->get_tooltips( ).
lr_tooltips->add_tooltip(
"单元格显示类型:异常灯、图标、符号。即这里针对的是类型为 异常列 所有的单元格
type = cl_salv_tooltip=>c_type_exception
value = space"不同的图形不同的冒泡提示
tooltip = ‘Undefined‘).
lr_tooltips->add_tooltip(
type = cl_salv_tooltip=>c_type_exception
value = ‘1‘
tooltip = ‘红灯‘).
lr_tooltips->add_tooltip(
type = cl_salv_tooltip=>c_type_exception
value = ‘2‘
tooltip = ‘黄灯‘).
lr_tooltips->add_tooltip(
type = cl_salv_tooltip=>c_type_exception
value = ‘3‘
tooltip = ‘绿灯‘).
gr_table->display( ). "调用实例方法显示表报
FORM inital .
gt_data-light = ‘ ‘. "取值范围为:空、1~3
gt_data-val = ‘空‘.
APPEND gt_data .
gt_data-light = ‘1‘.
gt_data-val = ‘1‘.
APPEND gt_data .
gt_data-light = ‘2‘.
gt_data-val = ‘2‘.
APPEND gt_data .
gt_data-light = ‘3‘.
gt_data-val = ‘3‘.
APPEND gt_data .
ENDFORM.
图标显示、图标提示信息
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
INCLUDE <icon>.
DATA: BEGIN OF gt_data OCCURS 0,
icon TYPE icon_d, "图标
val TYPE string,
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table
CHANGING t_table = gt_data[] ).
gr_columns= gr_table->get_columns( ).
gr_column ?= gr_columns->get_column( ‘ICON‘ ).
gr_column->set_icon( if_salv_c_bool_sap=>true ).
gr_column->set_long_text( ‘图标‘ ).
gr_column ?= gr_columns->get_column( ‘VAL‘ ).
gr_column->set_long_text( ‘图标值‘ ).
"==========为图标列单无格不同的值添加不同的冒泡提示
DATA:lr_functional_settings TYPE REF TO cl_salv_functional_settings.
lr_functional_settings = gr_table->get_functional_settings( ).
DATA: lr_tooltips TYPE REF TO cl_salv_tooltips.
lr_tooltips = lr_functional_settings->get_tooltips( ).
DATA: lvc_value TYPE lvc_value.
lvc_value = icon_locked.
lr_tooltips->add_tooltip(
"单元格显示类型:异常灯、图标、符号。即这里针对的是类型为 图标列 所有的单元格
type = cl_salv_tooltip=>c_type_icon
value = lvc_value"不同的图形不同的冒泡提示
tooltip = ‘锁定‘).
lvc_value = icon_message_warning.
lr_tooltips->add_tooltip(
type = cl_salv_tooltip=>c_type_icon
value = lvc_value
tooltip = ‘警告‘).
lvc_value = icon_unlocked.
lr_tooltips->add_tooltip(
type = cl_salv_tooltip=>c_type_icon
value = lvc_value
tooltip = ‘解锁‘).
gr_table->display( ). "调用实例方法显示表报
FORM inital .
gt_data-icon = icon_locked.
"在前面加了等号,如果不加,也会直接输出图标,而不是文字
gt_data-val = `[email protected]@`.
APPEND gt_data .
gt_data-icon = icon_message_warning.
gt_data-val = `[email protected]@`.
APPEND gt_data .
gt_data-icon = icon_unlocked.
gt_data-val = `[email protected]@`.
APPEND gt_data .
ENDFORM.
设置单元格颜色
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: g_color TYPE lvc_s_colo.
DATA:BEGIN OF gt_data OCCURS 0,
key1 TYPE mara-matnr,
key2(2),
color TYPE lvc_t_scol,
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
cl_salv_table=>factory(
IMPORTING r_salv_table = gr_table"用来接收工厂产生的实例
CHANGING t_table = gt_data[] ).
FIELD-SYMBOLS: <ls_outtab> LIKE gt_data.
DATA: lt_color TYPE lvc_t_scol,
ls_color TYPE lvc_s_scol.
LOOP AT gt_data ASSIGNING <ls_outtab>.
CLEAR: ls_color,lt_color.
IF <ls_outtab>-key1 = ‘a‘.
ls_color-fname = ‘KEY1‘."为哪列设置颜色
ls_color-color-col = ‘6‘."颜色值
ls_color-color-int = ‘0‘."加深
ls_color-color-inv = ‘0‘."前景背景颜色反转
APPEND ls_color TO lt_color.
ENDIF.
IF <ls_outtab>-key2 = ‘bb‘.
ls_color-fname = ‘KEY2‘.
ls_color-color-col = ‘5‘.
ls_color-color-int = ‘0‘.
ls_color-color-inv = ‘0‘.
APPEND ls_color TO lt_color.
ENDIF.
<ls_outtab>-color = lt_color.
ENDLOOP.
gr_columns = gr_table->get_columns( ).
gr_columns->set_color_column( ‘COLOR‘ ).
gr_table->display( ).
FORM inital .
gt_data-key1 = ‘a‘.
gt_data-key2 = ‘aa‘.
APPEND gt_data.
gt_data-key1 = ‘b‘.
gt_data-key2 = ‘bb‘.
APPEND gt_data.
ENDFORM.