SALV是一个用面向对象写出ALV简单报表的类
*&好处:
*&简单快捷,用来做个弹窗,或者作为明细的显示窗口,有很高的便捷性。
*&限制(缺点):
*&•列数限制为90。
*&•列的输出长度限制为128个字符。
*&•ALV的结构使用户可以在屏幕上操作您的表格。尽管ALV为打印表格提供了几个基本功能,但它并不用于配置缩小的打印布局。
*&•对于排序和小计,您最多使用九个级别或列。
*&•对于可聚合列,确保列的内部长度足够大,不仅适用于单个值,也适用于结果。
*&•输出列是面向列的。只能显示平面结构的表。不能显示嵌套的表和结构。
*&•使用ALV显示的表格不可用于输入。
*&•如果将表格用作容器中的网格,则不能使用批处理模式。
*&•总计和小计的输出由ALV单独处理。您既不能将结果传递给应用程序,也不能以任何方式操纵它们。
DATA:go_alv TYPE REF TO cl_salv_table. "ALV Table DATA BEGIN OF ty_alv. INCLUDE TYPE mara. DATA:del TYPE char10, z TYPE i. DATA END OF ty_alv. DATA:gs_mara LIKE ty_alv, gt_mara LIKE TABLE OF ty_alv. "事件类的定义 CLASS l_cl_handle_events DEFINITION. PUBLIC SECTION. "用户操作按钮 METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table IMPORTING e_salv_function. "双击事件 METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column. ENDCLASS. "方法实现 CLASS l_cl_handle_events IMPLEMENTATION. METHOD on_user_command. PERFORM handle_user_command USING e_salv_function. ENDMETHOD. METHOD on_double_click. PERFORM show_cell_info USING row column. ENDMETHOD. ENDCLASS. START-OF-SELECTION. SELECT * FROM mara INTO TABLE gt_mara UP TO 100 ROWS. TRY . cl_salv_table=>factory( IMPORTING r_salv_table = go_alv CHANGING t_table = gt_mara ). CATCH cx_salv_msg. ENDTRY. "给列设置长文本 go_alv->get_columns( )->get_column( 'DEL' )->set_long_text( '删除' ). go_alv->get_columns( )->get_column( 'Z' )->set_long_text( '自定义' ). "自动列宽 go_alv->get_columns( )->set_optimize( 'X' ). "斑马线 go_alv->get_display_settings( )->set_striped_pattern( 'X' ). "set selection mode 可以行列进行选择 go_alv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ). *******标准按钮和自定义状态使用一个就好 "标准按钮 * go_alv->get_functions( )->set_all( abap_true ). "将激活所以的ALV内置通用按钮 "使用自己定义的PF状态 go_alv->set_screen_status( pfstatus = 'IT017_PF' "SE41->状态按钮->程序:SAPLKKBL,状态:STANDARD 复制到知道程序和状态 report = sy-repid set_functions = go_alv->c_functions_all ). "设置屏幕大小,若是要全屏,就注释如下代码 IF go_alv IS BOUND. go_alv->set_screen_popup( start_column = 30 end_column = 160 start_line = 5 end_line = 20 ). ENDIF. "获取事件对象 DATA: lr_event TYPE REF TO cl_salv_events_table. lr_event = go_alv->get_event( ). "事件注册 DATA: lr_handle_event TYPE REF TO l_cl_handle_events. CREATE OBJECT lr_handle_event. SET HANDLER lr_handle_event->on_user_command FOR lr_event. SET HANDLER lr_handle_event->on_double_click FOR lr_event. "显示 go_alv->display( ). FORM handle_user_command USING p_function TYPE salv_de_function. CASE p_function. WHEN 'ZB'. "获取选中的行/列 DATA(lv_rows) = go_alv->get_selections( )->get_selected_rows( ). READ TABLE lv_rows INTO DATA(ls_row) INDEX 1. IF sy-subrc = 0. MODIFY gt_mara FROM VALUE #( Z = '7' ) INDEX ls_row TRANSPORTING Z. ENDIF. go_alv->refresh( ). WHEN OTHERS. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form show_cell_info *&---------------------------------------------------------------------* FORM show_cell_info USING p_row TYPE i p_column TYPE lvc_fname. MESSAGE '行:' && p_row && ',列:' && p_column TYPE 'I'. ENDFORM.
结果:
固定窗口图:

浮窗图:

动态设置列名
DATA:cl_descr TYPE REF TO cl_abap_structdescr, lv_fname TYPE lvc_fname, lv_short TYPE scrtext_s, lv_medium TYPE scrtext_m, lv_long TYPE scrtext_l. cl_descr ?= cl_abap_typedescr=>describe_by_data( gs_mara ). LOOP AT cl_descr->components ASSIGNING FIELD-SYMBOL(<fs_comp>). CLEAR:lv_fname, lv_short, lv_long. lv_fname = <fs_comp>-name. lv_short = <fs_comp>-name. lv_medium = <fs_comp>-name. lv_long = <fs_comp>-name. go_alv->get_columns( )->get_column( lv_fname )->set_short_text( lv_short ). go_alv->get_columns( )->get_column( lv_fname )->set_medium_text( lv_medium ). go_alv->get_columns( )->get_column( lv_fname )->set_long_text( lv_long ). ENDLOOP.
posted on 2021-10-18 09:09 seven1314pp 阅读(318) 评论(0) 收藏 举报
浙公网安备 33010602011771号