布局列分组(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-列属性设定-隐藏列.
以上。


发表评论