布局列分组(Columns Specific Grouping)这个概念大家可能会很陌生,SALV的这个功能并不常用,它到底是什么呢,通常情况下ALV的布局(Layout)下是没有列分组的(可以把列分组理解成过滤器),如下:
经过程序实现后,列分组如下:
这个列分组就是为了方便大家在布局中选择字段轻而易举的找到所想要的字段,有些ALV显示的字段确实很多,而且字段名字也比较相似,尤其是FI/CO中的一些ALV报表。
这个布局列分组用到了类 CL_SALV_SPECIFIC_GROUPS,具体实现步骤如下:
1,调用cl_salv_specific_groups->add_specific_group()添加列分组名
2,调用cl_salv_column_list->set_specific_group()将ALV中的字段加入到列分组下
下面代码在布局中添加2个列分组GRP1和GRP2,然后向这两个分组下分别加入HSL开头和TSL开头的字段。
完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
REPORT z_salv_19.
*----------------------------------------------------------------------*
* CLASS lcl_report DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
*
PUBLIC SECTION.
DATA: t_data TYPE STANDARD TABLE OF faglflext.
DATA: o_salv TYPE REF TO cl_salv_table.
METHODS:
get_data,
set_column_specific_group,
generate_output.
ENDCLASS. "lcl_report DEFINITION
*
*
START-OF-SELECTION.
DATA: lo_report TYPE REF TO lcl_report.
CREATE OBJECT lo_report.
lo_report->get_data( ).
lo_report->generate_output( ).
*----------------------------------------------------------------------*
* CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
METHOD get_data.
* data selection
SELECT * FROM faglflext
INTO TABLE t_data
UP TO 20 ROWS.
IF sy-subrc <> 0.
* 如果找不到就添加一行初始行,本例子用来演示布局(layout)选择字段,
* 和显示内容没关系,所以空行也无所谓
APPEND INITIAL LINE TO t_data.
ENDIF.
ENDMETHOD. "get_data
*
*.......................................................................
METHOD generate_output.
DATA: lo_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_salv
CHANGING
t_table = t_data ).
CATCH cx_salv_msg INTO lo_msg.
ENDTRY.
DATA: lo_functions TYPE REF TO cl_salv_functions_list.
lo_functions = o_salv->get_functions( ).
lo_functions->set_all( abap_true ).
me->set_column_specific_group( ).
* Displaying the ALV
o_salv->display( ).
ENDMETHOD. "generate_output
*
METHOD set_column_specific_group.
*----
* create the Groups
*----
DATA: lo_functional_settings TYPE REF TO cl_salv_functional_settings,
lo_specific_groups TYPE REF TO cl_salv_specific_groups,
lv_text TYPE cl_salv_specific_groups=>y_text.
lo_functional_settings = o_salv->get_functional_settings( ).
lo_specific_groups = lo_functional_settings->get_specific_groups( ).
* 添加group GRP1
TRY.
lv_text = 'HSL Amounts'.
lo_specific_groups->add_specific_group( id = 'GRP1'
text = lv_text ).
CATCH cx_salv_existing. "#EC NO_HANDLER
ENDTRY.
* 添加group GRP2
TRY.
lv_text = 'TSL Amounts'.
lo_specific_groups->add_specific_group( id = 'GRP2'
text = lv_text ).
CATCH cx_salv_existing. "#EC NO_HANDLER
ENDTRY.
*----
* Assign the group to columns
*----
DATA: lo_columns TYPE REF TO cl_salv_columns_table,
lo_column TYPE REF TO cl_salv_column_list,
lt_cols TYPE salv_t_column_ref,
ls_cols LIKE LINE OF lt_cols.
lo_columns = o_salv->get_columns( ).
lt_cols = lo_columns->get( ).
TRY.
* 隐藏RCLNT字段,client
lo_column ?= lo_columns->get_column( 'RCLNT' ).
lo_column->set_technical( if_salv_c_bool_sap=>true ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
LOOP AT lt_cols INTO ls_cols.
lo_column ?= ls_cols-r_column. "Narrow casting
CASE ls_cols-columnname+0(3).
"将以‘HSL’开始的表字段分配给group GRP1,然后设置为不显示
WHEN 'HSL'.
lo_column->set_specific_group( id = 'GRP1' ).
lo_column->set_visible( '' ).
"将以‘TSL’开始的表字段分配给group GRP2,然后设置为不显示
WHEN 'TSL'.
lo_column->set_specific_group( id = 'GRP2' ).
lo_column->set_visible( '' ).
ENDCASE.
ENDLOOP.
ENDMETHOD. "set_column_specific_group
ENDCLASS. "lcl_report IMPLEMENTATION
|
运行后可以看到布局中创建的列分组,如下:
上面代码中用到了SALV的列隐藏功能,具体参照-->SALV教程10-列属性设定-隐藏列.
以上。