单元格(cell)style在ALV中扮演着十分重要的角色,可以通过单元格style将单元格设置成文本、checkbox、热点(hotspot)、链接(link)、按钮、下拉list等,详细可以接口IF_SALV_C_CELL_TYPE看到,如下:
具体实现方法如下:
1,在SALV最终输入内表中定义一个保存style的字段,字段类型为salv_t_int4_column,是个表类型,表类型中的结构(structure)定义如下,由一个列名和对应值组成。当不指定列名,只对value赋值,意味着整行的单元格都应用同一个style,具体例子参照下面的代码中(将第5行全部设定为热点)。
2,将单元格的style保存到1中的字段,
3,调用cl_salv_columns_table->set_cell_type_column()指定保存style的字段,也就是步骤1中创建的字段
完整代码:
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
|
REPORT z_salv_15.
*
CLASS lcl_report DEFINITION.
*
PUBLIC SECTION.
*
* SALV输出内表类型
TYPES: BEGIN OF ty_vbak,
vbeln TYPE vbak-vbeln,
erdat TYPE erdat,
auart TYPE auart,
kunnr TYPE kunnr,
i_celltype TYPE salv_t_int4_column, "为设置单元格style用
END OF ty_vbak.
DATA: t_vbak TYPE STANDARD TABLE OF ty_vbak.
* ALV reference
DATA: o_alv TYPE REF TO cl_salv_table.
METHODS:
get_data, " data selection
generate_output. " Generating output
*
PRIVATE SECTION.
METHODS:
set_columns. " Set columns
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.
*
METHOD get_data.
* data selection
SELECT vbeln
erdat
auart
kunnr
INTO CORRESPONDING FIELDS OF TABLE t_vbak
FROM vbak
UP TO 20 ROWS.
FIELD-SYMBOLS: <lfs_vbak> LIKE LINE OF t_vbak.
DATA: lt_celltype TYPE salv_t_int4_column.
DATA: ls_celltype LIKE LINE OF lt_celltype.
LOOP AT t_vbak ASSIGNING <lfs_vbak>.
CLEAR: lt_celltype.
* 只有第二行 VBELN列设定hotspot
IF sy-tabix = 2.
ls_celltype-columnname = 'VBELN'.
ls_celltype-value = if_salv_c_cell_type=>hotspot.
APPEND ls_celltype TO lt_celltype.
* 第三行ERDAT单元格设定成按钮
ELSEIF sy-tabix = 3.
ls_celltype-columnname = 'ERDAT'.
ls_celltype-value = if_salv_c_cell_type=>button.
APPEND ls_celltype TO lt_celltype.
* 不指定列就意味着整个第5行都设置成hotspot
ELSEIF sy-tabix = 5.
ls_celltype-columnname = ''.
ls_celltype-value = if_salv_c_cell_type=>hotspot.
APPEND ls_celltype TO lt_celltype.
ENDIF.
<lfs_vbak>-i_celltype = lt_celltype.
ENDLOOP.
ENDMETHOD. "get_data
*
METHOD generate_output.
* New ALV instance
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = t_vbak ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.
*
* Setting up the Columns
me->set_columns( ).
* Displaying the ALV
o_alv->display( ).
ENDMETHOD. "generate_output
*
METHOD set_columns.
*
*...Get all the Columns
DATA: lo_cols TYPE REF TO cl_salv_columns_table.
lo_cols = o_alv->get_columns( ).
*
* set the Column optimization
lo_cols->set_optimize( 'X' ).
* 设置单元格style的字段
TRY.
lo_cols->set_cell_type_column( 'I_CELLTYPE' ).
CATCH cx_salv_data_error. "#EC NO_HANDLER
ENDTRY.
ENDMETHOD. "SET_COLUMNS
*
*
ENDCLASS. "lcl_report IMPLEMENTATION
|
运行后,第二行 VBELN列设定hotspot,第三行ERDAT单元格设定成按钮,整个第5行设置成hotspot,如下:
以上。