前言:遇到一個需求,雙擊匯總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。