Loading

记录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.效果

image

当然现在你所看到的效果肯定不是这么简单的几行代码的作用,列颜色、抬头都需要单独设置。

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

posted @ 2021-12-01 17:50  Gjboy666  阅读(2284)  评论(0编辑  收藏  举报