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版权协议,转载请附上原文出处链接和本声明。