SAP SALV11 给SALV设置字段筛选条件

1.效果:

1

2.代码:

  • SE24->CL_SALV_FILTERS
    CLASS lcl_salv_model DEFINITION INHERITING FROM cl_salv_model.
      PUBLIC SECTION.
        DATA: o_control TYPE REF TO cl_salv_controller_model,
              o_adapter TYPE REF TO cl_salv_adapter.
    
        METHODS: save_model
          IMPORTING io_model TYPE REF TO cl_salv_model.
    
        METHODS: save_controller.
    
        METHODS: save_adapter.
      PRIVATE SECTION.
        DATA: lo_model TYPE REF TO cl_salv_model.
    ENDCLASS.
    
    CLASS lcl_report DEFINITION.
      PUBLIC SECTION.
        TYPES: BEGIN OF ty_sflight,
                 carrid   TYPE sflight-carrid,
                 connid   TYPE sflight-connid,
                 fldate   TYPE sflight-fldate,
                 price    TYPE sflight-price,
                 currency TYPE sflight-currency,
                 t_color  TYPE lvc_t_scol,
               END OF ty_sflight.
    
        TYPES: ty_t_sflight TYPE TABLE OF ty_sflight WITH DEFAULT KEY.
    
        DATA: lt_sflight TYPE TABLE OF ty_sflight.
        DATA: o_salv TYPE REF TO cl_salv_table.
        DATA: o_salv_model TYPE REF TO lcl_salv_model.
    
        METHODS: get_data.              "定义获取数据方法
        METHODS: salv_output.           "定义SALV输出方法
    
      PRIVATE SECTION.
        METHODS: set_pf_status          "定义设置SALV状态栏的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_layout             "定义设置SALV layout的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_top_of_page        "定义设置SALV 页头文本的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_end_of_page        "定义设置SALV 页尾文本的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_display_setting    "定义设置SALV GUI抬头文本的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_columns            "定义设置SALV 表列属性的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_hotspot            "定义设置SALV Hotspot的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: on_link_click          "定义设置SALV link单击事件的方法
          FOR EVENT link_click OF cl_salv_events_table
          IMPORTING row
                    column.
    
        METHODS: set_colors             "定义设置SALV 颜色属性的方法
          CHANGING co_alv     TYPE REF TO cl_salv_table
                   ct_sflight TYPE ty_t_sflight.
    
        METHODS: on_user_command        "定义设置SALV User_command属性的方法
          FOR EVENT added_function OF cl_salv_events_table
          IMPORTING e_salv_function.
    
        METHODS: set_aggregations       "定义设置SALV 计总属性的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    
        METHODS: set_filters            "定义设置SALV 筛选属性的方法
          CHANGING co_alv TYPE REF TO cl_salv_table.
    ENDCLASS.
    
    CLASS lcl_salv_model IMPLEMENTATION.
      METHOD save_model.
        lo_model = io_model.
      ENDMETHOD.
    
      METHOD save_controller.
        o_control = lo_model->r_controller.             "?= 类对象中的casting
      ENDMETHOD.
    
      METHOD save_adapter.
        o_adapter ?= lo_model->r_controller->r_adapter.
      ENDMETHOD.
    
    ENDCLASS.
    
    CLASS lcl_report IMPLEMENTATION.
      METHOD get_data.
        SELECT carrid connid fldate price currency
        FROM sflight
        INTO CORRESPONDING FIELDS OF TABLE lt_sflight
        UP TO 50 ROWS.
      ENDMETHOD.
    
      METHOD salv_output.
        DATA: lx_msg TYPE REF TO cx_salv_msg.
        DATA: lo_alv_model TYPE REF TO cl_salv_model.
    
        TRY.
            cl_salv_table=>factory(
            IMPORTING
              r_salv_table = o_salv
            CHANGING
              t_table = lt_sflight ).
          CATCH cx_salv_msg INTO lx_msg.
        ENDTRY.
    
        "call method set PF-Status
        CALL METHOD set_pf_status
          CHANGING
            co_alv = o_salv.
    
        "call method set Layout
        CALL METHOD set_layout
          CHANGING
            co_alv = o_salv.
    
        "call method set top-of-page
        CALL METHOD me->set_top_of_page
          CHANGING
            co_alv = o_salv.
    
        "call method set end-of-page
        CALL METHOD me->set_end_of_page
          CHANGING
            co_alv = o_salv.
    
        "call method set Disply_setting
        CALL METHOD set_display_setting
          CHANGING
            co_alv = o_salv.
    
        "call method set Columns
        CALL METHOD me->set_columns
          CHANGING
            co_alv = o_salv.
    
        "call method Set Hotspot
        CALL METHOD set_hotspot
          CHANGING
            co_alv = o_salv.
    
        "call method Set color
        CALL METHOD set_colors
          CHANGING
            co_alv     = o_salv
            ct_sflight = lt_sflight.
    
        "call method save_model
        lo_alv_model ?= o_salv.
        CREATE OBJECT o_salv_model.
    
        CALL METHOD o_salv_model->save_model
          EXPORTING
            io_model = lo_alv_model.
    
        "call method set_aggregations
        CALL METHOD set_aggregations
          CHANGING
            co_alv = o_salv.
    
        "call method set_filters
        CALL METHOD set_filters
          CHANGING
            co_alv = o_salv.
    
        "注册事件
        DATA: lo_events TYPE REF TO cl_salv_events_table.
    
        lo_events = o_salv->get_event( ).                             "获取事件对象
        SET HANDLER me->on_link_click FOR lo_events.                  "注册Hotspot事件
        SET HANDLER me->on_user_command FOR lo_events.                "注册User_command事件
    
        o_salv->display( ).
      ENDMETHOD.
    
      METHOD set_pf_status.
        DATA: lo_functions TYPE REF TO cl_salv_functions_list.
    
    *    "设置默认状态栏
    *    lo_functions = co_alv->get_functions( ).       "获取状态栏对象
    *    lo_functions->set_default( abap_true ).        "设置默认的状态栏
    *    lo_functions->set_detail( abap_true ).         "激活查看细节按钮
    *    lo_functions->set_print( abap_true ).          "激活打印按钮
    *    "激活其他功能键请查看 SE24->CL_SALV_FUNCTIONS_LIST
    
        "设置自定义状态栏
        co_alv->set_screen_status(
        pfstatus = 'STANDARD_FULLSCREEN'
        report = 'Z_DEMO'
        set_functions = co_alv->c_functions_all ).
    
      ENDMETHOD.
    
      METHOD set_layout.
        DATA: lo_layout TYPE REF TO cl_salv_layout,
              l_vari    TYPE slis_vari,
              ls_key    TYPE salv_s_layout_key.
    
        lo_layout = co_alv->get_layout( ).               "获取layout对象
        ls_key-report = sy-repid.                        "设置布局全局Key
        lo_layout->set_key( ls_key ).
        lo_layout->set_save_restriction( 3 ).            "删除保存布局的限制 Value 3 = IF_SALV_C_LAYOUT=>RESTRICT_NONE
    
        l_vari = '/Z001'.                                "默认使用布局:Z001 SAP默认:L_VARI = 'DEFAULT'.
    *    lo_layout->set_initial_layout( l_vari ).         "设置使用默认布局
      ENDMETHOD.
    
      METHOD set_top_of_page.
        DATA: lo_header TYPE REF TO cl_salv_form_layout_grid,
              lo_label  TYPE REF TO cl_salv_form_label,
              lo_flow   TYPE REF TO cl_salv_form_layout_flow.
    
        CREATE OBJECT lo_header.
    
        lo_label = lo_header->create_label( row = 1 column = 1 ).   "创建一个样式
        lo_label->set_text( '页头标题加粗文本:' ).
    
        lo_flow = lo_header->create_flow( row = 2  column = 1 ).
        lo_flow->create_text( text = '第一行文本:' tooltip = '提示文本' ).
    
        lo_flow = lo_header->create_flow( row = 3  column = 1 ).
        lo_flow->create_text( text = '文本' tooltip = '文本' ).
    
        co_alv->set_top_of_list( lo_header ).                     "输出自定义页头到对象
        co_alv->set_top_of_list_print( lo_header ).               "打印页头
      ENDMETHOD.
    
      METHOD set_end_of_page.
        DATA: lo_footer TYPE REF TO cl_salv_form_layout_grid,
              lo_label  TYPE REF TO cl_salv_form_label,
              lo_flow   TYPE REF TO cl_salv_form_layout_flow.
    
        CREATE OBJECT lo_footer.
    
        lo_label = lo_footer->create_label( row = 1 column = 1 ).   "创建一个样式
        lo_label->set_text( '页尾标题加粗文本:' ).
    
        lo_flow = lo_footer->create_flow( row = 2  column = 1 ).
        lo_flow->create_text( text = '第一行文本:' tooltip = '提示文本' ).
    
        lo_flow = lo_footer->create_flow( row = 3  column = 1 ).
        lo_flow->create_text( text = 'DATE:' tooltip = 'DATE:' ).
    
        lo_flow = lo_footer->create_flow( row = 3  column = 2 ).
        lo_flow->create_text( text = sy-datum tooltip = sy-datum ).
    
        co_alv->set_end_of_list( lo_footer ).                        "输出自定义页尾到对象
        co_alv->set_end_of_list_print( lo_footer ).                  "打印页尾
      ENDMETHOD.
    
      METHOD set_display_setting.
        DATA: lo_display TYPE REF TO cl_salv_display_settings.
    
        lo_display = co_alv->get_display_settings( ).                "获取对象            "
        lo_display->set_list_header( 'SALV Demo 005' ).              "设置GUI抬头文本
      ENDMETHOD.
    
      METHOD set_columns.
        DATA: lo_columns TYPE REF TO cl_salv_columns.
        DATA: lo_column TYPE REF TO cl_salv_column.
    
    
        lo_columns = o_salv->get_columns( ).                         "获取对象
        lo_columns->set_optimize( 'X' ).                             "设置行宽自适应
    
        TRY.
            lo_column = lo_columns->get_column( 'CARRID' ).          "获取列CARRID属性
            lo_column->set_long_text( '自定义长文本列描述文本' ).    "设置列长文本描述
            lo_column->set_medium_text( '自定义列描述文本' ).        "设置列中文本描述
            lo_column->set_short_text( '自定义文本' ).               "设置列短文本描述
          CATCH cx_salv_not_found.                          "#EC NO_HANDLER
        ENDTRY.
    
        TRY.
            lo_column = lo_columns->get_column( 'CONNID' ).          "获取列CARRID属性
            lo_column->set_long_text( 'CONNID 自定义文本' ).         "设置列长文本描述
            lo_column->set_medium_text( 'CONNID TEXT' ).             "设置列中文本描述
            lo_column->set_short_text( 'TEXT' ).                     "设置列短文本描述
          CATCH cx_salv_not_found.                          "#EC NO_HANDLER
        ENDTRY.
      ENDMETHOD.
    
      METHOD set_hotspot.
        DATA: lo_cols_tab TYPE REF TO cl_salv_columns_table,
              lo_col_tab  TYPE REF TO cl_salv_column_table.
    
        lo_cols_tab = co_alv->get_columns( ).                        "获取对象
    
        TRY.                                                         "获取字段
            lo_col_tab ?= lo_cols_tab->get_column( 'CARRID' ).        "?= 类对象中的casting
          CATCH cx_salv_not_found.
        ENDTRY.
    
        TRY.                                                         "设置Hotspot
            CALL METHOD lo_col_tab->set_cell_type
              EXPORTING
                value = if_salv_c_cell_type=>hotspot.
          CATCH cx_salv_data_error .
        ENDTRY.
      ENDMETHOD.
    
      METHOD on_link_click.
        DATA: l_url TYPE string.
    
        l_url = 'www.baidu.com'.
    
        CALL METHOD cl_gui_frontend_services=>execute                 "Hotspot 被单击时执行打开Url
          EXPORTING
            document = l_url
          EXCEPTIONS
            OTHERS   = 1.
    
      ENDMETHOD.
    
      METHOD set_colors.
        DATA: lo_cols_tab TYPE REF TO cl_salv_columns_table,
              lo_col_tab  TYPE REF TO cl_salv_column_table.
        DATA: ls_color TYPE lvc_s_colo.
    
        lo_cols_tab = co_alv->get_columns( ).                        "获取对象
        INCLUDE <color>.
    
        "整列设置颜色
        TRY.
            lo_col_tab ?= lo_cols_tab->get_column( 'CARRID' ).       "获取字段
            ls_color-col = col_positive.                             "定义颜色
            ls_color-int = 1.                                        "反转颜色启用/关闭 1/0
            ls_color-inv = 0.                                        "增强颜色启用/关闭 1/0
            "颜色代码:
            "col_background        '0'.
            "col_heading           '1'.
            "COL_NORMAL            '2'.
            "col_total             '3'.
            "col_key               '4'.
            "col_positive          '5'.
            "COL_NEGATIVE          '6'.
            "col_group             '7'.
    
            lo_col_tab->set_color( ls_color ).                       "设置颜色
          CATCH cx_salv_not_found.
        ENDTRY.
    
        "单元格设置颜色
        DATA: lt_s_color TYPE lvc_t_scol,
              ls_s_color TYPE lvc_s_scol,
              l_count    TYPE i.
        CLEAR: ls_color.
    
        LOOP AT ct_sflight INTO DATA(wa_sflight).
          l_count = l_count + 1.
          CASE l_count.
            WHEN 2.
              ls_s_color-fname = 'CONNID'.
              ls_s_color-color-col = col_group.
              ls_s_color-color-int = 1.                              "反转颜色启用/关闭 1/0
              ls_s_color-color-inv = 0.                              "增强颜色启用/关闭 1/0
              APPEND ls_s_color TO lt_s_color.
              CLEAR ls_s_color.
            WHEN 7.
              ls_s_color-fname = 'CONNID'.
              ls_s_color-color-col = col_heading.
              ls_s_color-color-int = 1.                              "反转颜色启用/关闭 1/0
              ls_s_color-color-inv = 0.                              "增强颜色启用/关闭 1/0
              APPEND ls_s_color TO lt_s_color.
              CLEAR ls_color.
            WHEN OTHERS.
          ENDCASE.
    
          wa_sflight-t_color = lt_s_color.
          MODIFY ct_sflight FROM wa_sflight.
          CLEAR: wa_sflight,lt_s_color.
        ENDLOOP.
    
        "行设置颜色
        CLEAR: l_count.
        LOOP AT ct_sflight REFERENCE INTO DATA(ref_sflight).
          l_count = l_count + 1.
    
          CASE l_count.
            WHEN 5.
              ls_s_color-fname = 'CARRID'.
              ls_s_color-color-col = col_total.
              ls_s_color-color-int = 1.                              "反转颜色启用/关闭 1/0
              ls_s_color-color-inv = 0.                              "增强颜色启用/关闭 1/0
              APPEND ls_s_color TO lt_s_color.
    
              ls_s_color-fname = 'CONNID'.
              APPEND ls_s_color TO lt_s_color.
    
              ls_s_color-fname = 'FLDATE'.
              APPEND ls_s_color TO lt_s_color.
    
              ls_s_color-fname = 'PRICE'.
              APPEND ls_s_color TO lt_s_color.
    
              ls_s_color-fname = 'CURRENCY'.
              APPEND ls_s_color TO lt_s_color.
    
              CLEAR ls_s_color.
            WHEN OTHERS.
          ENDCASE.
          APPEND LINES OF lt_s_color TO ref_sflight->t_color.       "添加行颜色定义,不能覆盖;否则上面的单元格颜色信息将丢失
          CLEAR: lt_s_color.
        ENDLOOP.
    
        TRY.
            lo_cols_tab->set_color_column( 'T_COLOR' ).              "设置颜色信息表为lt_sflight-T_COLOR
          CATCH cx_salv_data_error.                         "#EC NO_HANDLER
        ENDTRY.
    
      ENDMETHOD.
    
      METHOD on_user_command.
        DATA: lo_grid      TYPE REF TO cl_gui_alv_grid,
              lo_full_abap TYPE REF TO cl_salv_fullscreen_adapter.
    
        DATA: ls_layout TYPE lvc_s_layo.
    
        CASE e_salv_function.
    
          WHEN 'EDIT'.
            CALL METHOD me->o_salv_model->save_controller.
            CALL METHOD me->o_salv_model->save_adapter.
            lo_full_abap ?= me->o_salv_model->o_adapter.
            lo_grid = lo_full_abap->get_grid( ).
    
            IF lo_grid IS BOUND.
    
              CALL METHOD lo_grid->get_frontend_layout
                IMPORTING
                  es_layout = ls_layout.
    
              IF ls_layout-edit = abap_true.                        "如果是可编辑状态设置为不可编辑,否则设置可编辑
                ls_layout-edit = abap_false.
              ELSE.
                ls_layout-edit = abap_true.
              ENDIF.
    
              CALL METHOD lo_grid->set_frontend_layout
                EXPORTING
                  is_layout = ls_layout.
    
              CALL METHOD lo_grid->refresh_table_display.
            ENDIF.
    
          WHEN 'OKAY'.
            MESSAGE '你按了按钮"OKAY"' TYPE 'I'.
    
          WHEN OTHERS.
        ENDCASE.
      ENDMETHOD.
    
      METHOD set_aggregations.
        DATA: lo_aggrs TYPE REF TO cl_salv_aggregations.
    
        lo_aggrs = co_alv->get_aggregations( ).                     "获取对象
    
        TRY.
            CALL METHOD lo_aggrs->add_aggregation
              EXPORTING
                columnname  = 'PRICE'
                aggregation = if_salv_c_aggregation=>total.       "Total/Minimum/Maximum/Average/NO aggregation
          CATCH cx_salv_data_error .                        "#EC NO_HANDLER
          CATCH cx_salv_not_found .                         "#EC NO_HANDLER
          CATCH cx_salv_existing .                          "#EC NO_HANDLER
        ENDTRY.
    
    *    TRY.
    *        CALL METHOD lo_aggrs->add_aggregation
    *          EXPORTING
    *            columnname  = 'PRICE'
    *            aggregation = if_salv_c_aggregation=>average.         "Total/Minimum/Maximum/Average/NO aggregation
    *      CATCH cx_salv_data_error .                        "#EC NO_HANDLER
    *      CATCH cx_salv_not_found .                         "#EC NO_HANDLER
    *      CATCH cx_salv_existing .                          "#EC NO_HANDLER
    *    ENDTRY.
    
        lo_aggrs->set_aggregation_before_items( ).                  "设置属性
    
      ENDMETHOD.
      METHOD set_filters.
        DATA: lo_filters TYPE REF TO cl_salv_filters.
    
        lo_filters = co_alv->get_filters( ).                        "获取对象
    
        TRY.
            CALL METHOD lo_filters->add_filter
              EXPORTING
                columnname = 'CARRID'
                sign       = 'I'
                option     = 'EQ'
                low        = 'AZ'.
    
          CATCH cx_salv_not_found .                         "#EC NO_HANDLER
          CATCH cx_salv_data_error .                        "#EC NO_HANDLER
          CATCH cx_salv_existing .                          "#EC NO_HANDLER
        ENDTRY.
    
        TRY.
            CALL METHOD lo_filters->add_filter
              EXPORTING
                columnname = 'CONNID'
                sign       = 'I'
                option     = 'EQ'
                low        = '0555'.
    
          CATCH cx_salv_not_found .                         "#EC NO_HANDLER
          CATCH cx_salv_data_error .                        "#EC NO_HANDLER
          CATCH cx_salv_existing .                          "#EC NO_HANDLER
        ENDTRY.
    
      ENDMETHOD.
    
    ENDCLASS.
    
    START-OF-SELECTION.
      DATA: lo_report TYPE REF TO lcl_report.
    
      CREATE OBJECT lo_report. "实例化SALV对象
    
      lo_report->get_data( ).                                       "获取数据
      lo_report->salv_output( ).                                    "输出
    

版权声明:本文为qq_30797051原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。