前言介绍:SALV是一个用面向对象写出ALV简单报表的类。
好处:
简单快捷,用来做个弹窗,或者作为明细的显示窗口,有很高的便捷性。
限制(缺点):
•列数限制为90。
•列的输出长度限制为128个字符。
•ALV的结构使用户可以在屏幕上操作您的表格。尽管ALV为打印表格提供了几个基本功能,但它并不用于配置缩小的打印布局。
•对于排序和小计,您最多使用九个级别或列。
•对于可聚合列,确保列的内部长度足够大,不仅适用于单个值,也适用于结果。
•输出列是面向列的。只能显示平面结构的表。不能显示嵌套的表和结构。
•使用ALV显示的表格不可用于输入。
•如果将表格用作容器中的网格,则不能使用批处理模式。
•总计和小计的输出由ALV单独处理。您既不能将结果传递给应用程序,也不能以任何方式操纵它们。
一、上实例
DATA:go_alv TYPE REF TO cl_salv_table. "ALV Table
DATA BEGIN OF typ_alv .
INCLUDE TYPE makt ."包含自己创建表的所有字段
DATA del TYPE char10. "删除标记
DATA z TYPE i. "
DATA END OF typ_alv .
DATA : gs_makt LIKE typ_alv, ""alv报表的结构,传一行数据的
gt_makt LIKE TABLE OF typ_alv. "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 makt
INTO TABLE gt_makt
UP TO 10 ROWS.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = go_alv
CHANGING
t_table = gt_makt ).
CATCH cx_salv_msg. "#EC NO_HANDLER
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内置通用按钮
"使用自己定义的9000状态
go_alv->set_screen_status(
pfstatus = '9000'
report = sy-repid "'ZLIMF_SALV' "程序名
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.
"修改 选中第一行的z字段
MODIFY gt_makt FROM VALUE #( Z = '6' ) INDEX ls_row TRANSPORTING Z.
ENDIF.
go_alv->refresh( ).
ENDCASE.
ENDFORM.
FORM show_cell_info USING p_row TYPE i
p_column TYPE lvc_fname.
MESSAGE '行:' && p_row && ',列:' && p_column TYPE 'I'.
ENDFORM.
实际效果:
二、简单介绍下功能
1.自动获取gt_makt的feildcat,也可以自定义添加字段,定义内表时候使用数据元素,就可以自动获取了。
2.斑马条纹,自动列宽,选中行或者列,标准预设按钮。
3.双击事件,可以获取点击单元格的行数和列名。
4.自定义按钮,获取选中行,点击按钮,修改内表数据后,刷新alv。
5.可以设置ALV长宽,你可以把它作为弹窗或者全屏alv。
设置ALV的大小:
6.单元格不能编辑,是硬伤。
了解上面这几种功能,你基本上就掌握SALV了。
好了今天的分享到这了,分享使我快乐,我是寒武青锋。
参考链接:
1.江正军OO SALV
2.百度sap自定义按钮事件
3.百度sap SALV选择模式