记录ABAP开发的日常——cl_salv_table的使用案例
前言:遇到一个需求,双击汇总ALV的某一行,穿透到第二屏显示明细ALV界面,之前是通过调用两次ALV函数实现该效果,但是这次想换另一种方式实现,恰好在网上看到cl_salv_table的使用案例,于是研究了下,正好在我的项目中用到,下面说下用法。
cl_salv_table使用
1.简单使用步骤:
"只需要简单的几行代码,就可实现如下效果"
CALL METHOD cl_salv_table=>factory
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
r_salv_table = DATA(lo_salv) "方法生成的ALV容器对象"
CHANGING
t_table = gt_data5. "alv展示的数据"
lo_salv->get_functions_base( )->set_all( ). "设置默认按键
lo_salv->display( ). "调用显示方法"
2.效果
当然现在你所看到的效果肯定不是这么简单的几行代码的作用,列颜色、抬头都需要单独设置。
3.设置列颜色
DATA:color TYPE lvc_s_colo . "列颜色
DATA:lr_cols TYPE REF TO cl_salv_columns_table, "所有列实例"
lr_col TYPE REF TO cl_salv_column_table. "单个列实例"
"设置字段目录
"获取所有列实例对象
lr_cols = lo_salv->get_columns( ).
"设置自适应宽度"
lr_cols->set_optimize( 'X' ).
"获取EQUNR 的列实例"
lr_col ?= lr_cols->get_column('EQUNR').
"设置列EQUNR的属性"
lr_col->set_long_text( '设备号' ).
lr_col->set_medium_text( '设备号' ).
lr_col->set_short_text( '设备号' ).
color-col = '1'.
color-int = '0'.
color-inv = '0'.
"设置列颜色"
lr_col->set_color( color ).
4.隐藏列
"有时候有些列是不需要显示在ALV界面上的,可以使用下面代码,隐藏掉它(但是在布局中还是可以看见)"
lr_col->set_visible( value = if_salv_c_bool_sap=>false ).
"如果在布局中也不想看见,则使用下面这段代码"
lr_col->set_technical( 'X' ).
5.设置表头
"设置表头
DATA: lo_header TYPE REF TO cl_salv_form_layout_grid,
lo_h_header TYPE REF TO cl_salv_form_header_info,
lo_h_flow TYPE REF TO cl_salv_form_layout_flow.
* header object
CREATE OBJECT lo_header.
lo_h_header = lo_header->create_header_information( row = 1 column = 1 ).
IF p_r1 EQ 'X'.
lo_h_header->set_text( '根据设备号统计-明细' ).
ELSE.
lo_h_header->set_text( '根据计划员组统计-明细' ).
ENDIF.
lo_h_flow = lo_header->create_flow( row = 2 column = 1 ).
lo_h_flow->create_text( text = '领料成本根据领料过账日期统计,委外服务成本根据委外服务采购订单发票过账日期统计' ).
lo_salv->set_top_of_list( lo_header ).
lo_salv->set_top_of_list_print( lo_header ).
6.双击事件
*下面是是事件的class的定义
CLASS cl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table "双击事件方法"
IMPORTING row column,
on_link_click FOR EVENT link_click OF cl_salv_events_table "热点事件方法"
IMPORTING row column.
ENDCLASS.
DATA: gr_handle_event TYPE REF TO cl_handle_events.
CLASS cl_handle_events IMPLEMENTATION.
METHOD on_double_click.
PERFORM handle_double_click USING row column .
ENDMETHOD.
METHOD on_link_click.
PERFORM handle_link_click USING row column .
ENDMETHOD.
ENDCLASS.
"获取事件对象"
DATA:lr_event TYPE REF TO cl_salv_events_table.
lr_event = lo_salv->get_event( ).
"注册事件处理方法"
CREATE OBJECT gr_handle_event.
"双击事件"
SET HANDLER gr_handle_event->on_double_click FOR lr_event.
"热点事件"
SET HANDLER gr_handle_event->on_link_click FOR lr_event.
*注意:热点事件需要给列字段设置以下属性:
lr_col->set_cell_type( if_salv_c_cell_type=>hotspot ).
*&---------------------------------------------------------------------*
*& Form handle_double_click
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ROW
*& --> COLUMN
*&---------------------------------------------------------------------*
FORM handle_double_click USING p_row TYPE i
p_column TYPE lvc_fname.
READ TABLE gt_item INDEX p_row INTO DATA(ls_item).
CASE p_column.
WHEN 'QMNUM'.
SET PARAMETER ID 'IQM' FIELD ls_item-qmnum.
CALL TRANSACTION 'IW23' AND SKIP FIRST SCREEN.
WHEN 'EQUNR'.
SET PARAMETER ID 'EQN' FIELD ls_item-equnr.
CALL TRANSACTION 'IE03' AND SKIP FIRST SCREEN.
WHEN OTHERS.
ENDCASE.
ENDFORM.
7.其他
当然cl_salv_table的功能还有很多,这里面只写了目前我所需要的,有空的话后续还可以继续研究。
更多详细内容还可以参照大神 汪正军 的博文 OO SALV。
觉得博主的文章对你有帮助的,动动鼠标一键三连,激励博主写出更多精彩文章!