单元格(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,如下:

以上。


发表评论