記錄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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM