单元格(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,如下:
以上。
发表评论