ALV詳解:OO SALV


OOSALV

Net Weaver2004平台上集合了利用函數和GRID的功能發布的SALV包程序(SALV也稱為New ALV)。

SALV可以像使用函數方式生成ALV那樣,不用創建屏幕就可以調用的全屏方式顯示的ALV

SALVGRID報表可以在后台運行,但以前函數方式或OO方式生成的GRID不能?

SALV與現有的方法(Function ALV)相比,為了方便以接口的方式提供更整合及細微的功能,但SALV不提供編輯功能(但可以通過SALV適配器調用CL_GUI_ALV_GRID修改成編輯模式,就可以在ALV中修改數據了

更多的實例請參考SALV程序包(Package,里面有大量示例

 

 

SALV有以下三種類型的報表:

image096

三種顯示模式

l  全屏模式

l  全屏模式——Classic 報表模式(普通List列表)

l  利用控制器的模式(利用用戶自定義控件區域來控制ALV顯示大小)

CL_GUI_ALV_GRID相似的是CL_SALV_TABLE類,通過其factory方法,生成SALV實例:

image097

要顯示ALV,只需要調用以下兩個方法即可:

factory靜態方法。定義要顯示在屏幕上的數據;定義ALV報表樣式;調用此方法就會返回CL_SALV_TABLE類型的實例對象

display實例方法。調用此方法屏幕上就顯示ALV

image098

LIST_DISPLAY:參數決定了列表顯示的模式:是以List普通列表方式顯示,還是Grid網格方式顯示

R_CONTAINER用戶自定義控件區域的引用對象,類型為CL_GUI_CONTAINER

CONTAINER_NAME:屏幕上用戶自定義控件區域(Custom Controlimage064的名稱

上面三個參數與顯示模式關系如下:

 

LIST_DISPLAY

R_CONTAINER

CONTAINER_NAME

全屏

ABAP_FALSE

初始值

初始值

Classic List

ABAP_TRUE

初始值

初始值

利用控制器

ABAP_FALSE

CL_GUI_CONTAINER對象引用

用戶自定義控件區域(Custom Control)名稱

全屏模式

image099

與通過REUSE_ALV_GRID_DISPLAY函數產生的ALV相當:

DATA: gr_table TYPE REF TO cl_salv_table.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
    CHANGING t_table = gt_data[] ).

  gr_table
->display( )."
調用實例方法顯示表報

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

全屏經典列表模式

image100

與通過REUSE_ALV_LIST_DISPLAY函數產生的ALV相當:

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
    
EXPORTING list_display = abap_true"以列表形式顯示
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).
  gr_functions
= gr_table->get_functions( ).
  gr_functions
->set_default( )."Activate Standard Selection of Generic ALV Functions。激活工具欄中通用的選擇性按鈕。根據當前顯示是List模式、還是Grid模式,來設置工具條上最基本的默認按鈕,比gr_functions->set_all( abap_true)設置的按鈕要少很多
  gr_table->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

可控模式

先繪制屏幕 100,然后在其上面放上用戶自定義控件區域(Custom Controlimage064[1],並命名為CONTAINER_1

image101

image102

 

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code TYPE syucomm.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
CALL SCREEN 100.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

MODULE 100_pbo OUTPUT.
 
PERFORM inital.
 
"判斷是否已分配了一個有效引用
 
IF gr_container IS NOT BOUND.
   
"創建容器
   
CREATE OBJECT gr_container
     
EXPORTING

        container_name
= 'CONTAINER_1'."屏幕上用戶自定義控件名
   
"創建ALV
    cl_salv_table
=>factory(
     
EXPORTING
          r_container
= gr_container
          container_name
= 'CONTAINER_1'

     
IMPORTING
          r_salv_table
= gr_table
     
CHANGING

          t_table
= gt_data[] ).
    
"設置工具欄
   gr_functions
= gr_table->get_functions( ).
    gr_functions
->set_all( abap_true). "Activate All Generic ALV Functions,將激活所有的ALV內置通用按鈕

   
"顯示
    gr_table
->display( ).

 
ENDIF.
ENDMODULE.

CL_SALV_TABLE設置相關方法

SALV進行設置,先需要通過CL_SALV_TABLE對象實例獲取相關設置對象,然后再對這些設置對進行操作

如對樣式的設置,需要先通過CL_SALV_TABLE對象的GET_LAYOUT( )方法拿到CL_SALV_LAYOUT對象,實后通過該對象相關方法對SALV進行設置;除樣式外,如排序、工具欄設置、事件等,都是先通過某個GET*方法拿到相應對象,再通過該對象相關方法對SALV進行設置,這與以前Function ALV、及OO ALV不太一樣。如上面程序中對SALV工具欄進行設置是這樣的:

DATA: gr_functions TYPE REF TO cl_salv_functions_list.
gr_functions = gr_table->get_functions( ).

gr_functions
->set_all( abap_true).

 

CL_SALV_TABLEGET*相關方法:

image103

樣式設置

顯示設置

image104

SET_VERTICAL_LINES:設置是否顯示垂直線

SET_HORIZONTAL_LINES:設置是否顯示水平線

SET_STRIPED_PATTERN:斑馬條紋(行顏色交替)

SET_LIST_HEADER_SIZE:報表頭

SET_FIT_COLUMN_TO_TABLE_SIZE:列自適應表格寬度

image105

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_display
= gr_table->get_display_settings( ).
  gr_display
->set_striped_pattern( cl_salv_display_settings=>true ).
  gr_display
->set_list_header('Header Test').

  gr_table
->display( ). "調用實例方法顯示表報

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bb'.
 
APPEND gt_data.
ENDFORM.

布局變式

image106

F4_LAYOUTS

SET_DEFAULT

SET_INITIAL_LAYOUT

SET_KEY

SET_SAVE_RESTRICTION

image107

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout.
DATA: gs_program TYPE salv_s_layout_key."該結構包含了布局變式所屬程序名
DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_layout
= gr_table->get_layout( ).
  gs_program
-report = sy-repid.
  gr_layout
->set_key( gs_program )."設置布局保存為變式時,這些變式應屬性此Key(本程序名)
  gr_layout
->set_save_restriction( cl_salv_layout=>restrict_none )."允許保存布局為變式

  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bb'.
 
APPEND gt_data.
ENDFORM.

類似的Fieldcat

Function ALVOO ALV可通過Fieldcat對列進行相關設置,SALV也有類似於這樣的東西,只不過不是Fieldcat,而是通過CL_SALV_COLUMN對象來實現的。CL_SALV_COLUMN的獲取過程如下:

image108

image109

image110

隱藏字段(列)

image111

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_columns
= gr_table->get_columns( ).
  gr_column ?= gr_columns
->get_column( 'KEY1' )."需處理的列

 
gr_column->set_visible( cl_salv_column_table=>false )."隱藏列,注:這里雖然是隱藏了,但在布局設置里還是可以看到此列的,如果使布局里也看不到,則需要gr_column->set_technical( 'X' ).

  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

設置列標題

image112


DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_columns
= gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( 'KEY2' )."
需處理的列
  gr_column->set_long_text( 'key2' ).
  gr_column
->set_medium_text( 'key2' ).
  gr_column
->set_short_text( 'key2'
).
  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

設置列的顏色

image113
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table
.
DATA: g_color TYPE lvc_s_colo.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_columns
= gr_table->get_columns( ).
  gr_column ?= gr_columns
->get_column( 'KEY2' )."需處理的列
  g_color
-col = '6'.
  g_color
-int = '1'.
  g_color
-inv = '0'
.
  gr_column->set_color( g_color ).

  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data-key1 = 'b'.

  gt_data
-key2 = 'bb'.
 
APPEND gt_data.
ENDFORM.

優化列寬

相當於Function ALV所使用Layoutcolwidth_optimize屬性

優化前:image114

優化后:image115

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(20),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_columns
= gr_table->get_columns
( ).
  gr_columns->set_optimize( 'X' ).

  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bbbbbbbb'.
 
APPEND gt_data.
ENDFORM.

SALV行列選擇模式

image116

image117

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_selection TYPE REF TO cl_salv_selections.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(20),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

  gr_selection
= gr_table
->get_selections( ).
 
gr_selection->set_selection_mode( if_salv_c_selection_mode=>row_column )."可以以行、列的方式進行選擇

  gr_table
->display( ).

FORM
inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bbbbbbbb'.
 
APPEND gt_data.
ENDFORM.

以彈出框顯示SALV

可控模式(利用控制器的模式)SALV是不能以彈出框來顯示的

image118

DATA: gr_table TYPE REF TO cl_salv_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,"ALV標題行會參照詞典類型
  key2
(20),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table
   
CHANGING t_table = gt_data[]
).
  gr_table->set_screen_popup(
    start_column
= 1
    end_column
= 50
    start_line
= 1
    end_line
= 5
).
  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bbbbbbbb'.
 
APPEND gt_data.
ENDFORM.

排序、分類匯總

該示例與前面Function ALV的示例效果是一樣的

image119

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_agg TYPE REF TO cl_salv_aggregations.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.

  cl_salv_table
=>factory(
     
IMPORTING r_salv_table = gr_table
     
CHANGING t_table = gt_data[] ).


  gr_columns
= gr_table->get_columns( ).
  gr_column ?= gr_columns
->get_column( 'KEY1' ).
  gr_column
->set_long_text( 'key1' ).
  gr_column ?= gr_columns->get_column( 'KEY2' ).
  gr_column
->set_long_text( 'key2' ).
  gr_column ?= gr_columns
->get_column( 'STR' ).
  gr_column
->set_long_text( 'str' ).
  gr_column ?= gr_columns
->get_column( 'INT1' ).
  gr_column
->set_long_text( 'int1' ).
  gr_column ?= gr_columns
->get_column( 'INT2' ).
  gr_column
->set_long_text( 'int2' ).
  gr_column ?= gr_columns
->get_column( 'INT3' ).
  gr_column
->set_long_text( 'int3' ).

  gr_sorts
= gr_table->get_sorts( ).
  gr_sorts
->add_sort(
    columnname
= 'KEY1'
   
position = 1 "排序的順序,如果根據多個字段來排時,決定哪個先排
    sequence
= if_salv_c_sort=>sort_up "升序
   
"是否需要以此字段進行分類小計
    subtotal
= if_salv_c_bool_sap=>true
 
).


  gr_sorts
->add_sort(
    columnname
= 'KEY2'
   
position = 2
    sequence
= if_salv_c_sort=>sort_down "降序
    subtotal
= if_salv_c_bool_sap=>true
 
).


  gr_agg
= gr_table->get_aggregations( ).
 
"需要進行分類小計及匯總的字段:INT1INT2
  gr_agg
->add_aggregation( 'INT1' ). "決定此列是否進行分類匯總。注:如果先不進行排序,則只有匯總,不會進行分類小計
  gr_agg
->add_aggregation( 'INT2' ).

  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 2.
  gt_data
-int3 = 7.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 2.
  gt_data
-int3 = 6.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'aba'.
  gt_data
-int1 = 6.
  gt_data
-int2 = 1.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'abb'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 4.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'e'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'eca'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 2.
  gt_data
-int3 = 4.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'ba'.
  gt_data
-str = 'bba'.
  gt_data
-int1 = 8.
  gt_data
-int2 = 5.
  gt_data
-int2 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bb'.
  gt_data
-str = 'bbb'.
  gt_data
-int1 = 1.
  gt_data
-int2 = 2.
  gt_data
-int3 = 4.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'cca'.
  gt_data
-int1 = 5.
  gt_data
-int2 = 1.
  gt_data
-int2 = 3.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'cc'.
  gt_data
-str = 'ccc'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 5.
 
APPEND gt_data.

  gt_data
-key1 = 'd'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'dca'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 6.
  gt_data
-int3 = 2.
 
APPEND gt_data.
ENDFORM.

設置數據過濾條件

ALV 的標准按鈕中已經有過濾的功能,我們也可以在初始顯示的時候就設置過濾條件

image120

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_sorts TYPE REF TO cl_salv_sorts.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table
.
DATA: gr_filter TYPE REF TO cl_salv_filters.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.

  cl_salv_table
=>factory(
     
IMPORTING r_salv_table = gr_table
     
CHANGING t_table = gt_data[] ).


  gr_columns
= gr_table->get_columns( ).
  gr_column ?= gr_columns
->get_column( 'KEY1' ).
  gr_column
->set_long_text( 'key1' ).
  gr_column ?= gr_columns
->get_column( 'KEY2' ).
  gr_column
->set_long_text( 'key2' ).
  gr_column ?= gr_columns
->get_column( 'STR' ).
  gr_column
->set_long_text( 'str' ).
  gr_column ?= gr_columns
->get_column( 'INT1' ).
  gr_column
->set_long_text( 'int1' ).
  gr_column ?= gr_columns
->get_column( 'INT2' ).
  gr_column
->set_long_text( 'int2' ).
  gr_column ?= gr_columns
->get_column( 'INT3' ).
  gr_column
->set_long_text( 'int3' ).


 
gr_filter = gr_table->get_filters( ).
 
"只有Key1 astrab開頭的數據才顯示出來
  gr_filter
->add_filter(
    columnname
= 'KEY1'
   
sign = 'I'
    option
= 'EQ'
    low
= 'a').
  gr_filter
->add_filter(
    columnname
= 'STR'
   
sign = 'I'
    option
= 'CP'
    low
= 'ab*'
).

  gr_table->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 2.
  gt_data
-int3 = 7.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 2.
  gt_data
-int3 = 6.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'aba'.
  gt_data
-int1 = 6.
  gt_data
-int2 = 1.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'abb'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 4.
  gt_data
-int3 = 2.
 
APPEND gt_data.
ENDFORM.

GUI Status

使用預置的GUI Status

注:若要設置自定義的GUI Status只適用於全屏模式全屏幕經典列表模式SALV

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory("全屏模式的SALV
   
IMPORTING r_salv_table = gr_table
   
CHANGING t_table = gt_data[] ).


 
"設置工具條:只適用於全屏模式全屏幕經典列表模式SALV
  gr_table
->set_screen_status(
     pfstatus
= 'T002'"系統提示的標准StatusSAPLSALV_METADATA_STATUS程序中的SALV_TABLE_STANDARD
    
report = sy-repid
    
"注:此參數只對SALV標准的預設保留按鈕起作用,也就是說,當 T001 GUI Status是從
    
"系統中提供的標准Gui Staus拷貝時才起作用,即通用此參數來屏蔽或顯示某些預置按鈕
    
"對自己完全新創建的GUI Status是的按鈕(實質上是根據 FunCode來判斷的)不起作用
     set_functions
= gr_table->c_functions_all )."顯示所有通用的預設按鈕
    
"set_functions = gr_table->c_functions_default )."顯示基本默認選擇性的預設按鈕
    
"set_functions = gr_table->c_functions_none )."所有預設按鈕都將不會顯示

  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

在預設置工具欄上附加按鈕

附加按鈕只適用於可控制模式(即用戶對話屏幕)的SALV

image121
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.
DATA: ok_code TYPE syucomm.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
CALL SCREEN 100.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

MODULE 100_pbo OUTPUT.
 
PERFORM inital.
 
"判斷是否已分配了一個有效引用
 
IF gr_container IS NOT BOUND.
   
"創建容器
   
CREATE OBJECT gr_container
     
EXPORTING

        container_name
= 'CONTAINER_1'."屏幕上用戶自定義控件名
   
"創建ALV
    cl_salv_table
=>factory(
     
EXPORTING
          r_container
= gr_container
          container_name
= 'CONTAINER_1'

     
IMPORTING
          r_salv_table
= gr_table
     
CHANGING

          t_table
= gt_data[] ).

   
"附加刷新按鈕
   
DATA: lr_functions TYPE REF TO cl_salv_functions_list.
    lr_functions
= gr_table->get_functions( ).
    lr_functions
->set_all( abap_true )."Activate All Generic ALV Functions,將激活所有的ALV內置通用按鈕
   
INCLUDE <icon>.
   
DATA: l_icon TYPE string.
    l_icon
= icon_refresh.
   
"附加按鈕,只適用於 可控模式 下的SALV
    lr_functions
->add_function(
      name
= 'refresh'
     
icon = l_icon
     
text = '
刷新按鈕'
      tooltip
= '刷新數據'
     
"按鈕存放的位置:這里在右邊附加。該參數的其他取值可以查看該方法源碼,可以
     
"找到該參數其他取值的蛛絲馬跡
     
position = if_salv_c_function_position=>right_of_salv_functions ).

   
"顯示
    gr_table
->display( ).
 
ENDIF.
ENDMODULE.

事件

DOUBLE_CLICK雙擊事件

image122

CLASS l_cl_handle_events DEFINITION.
 
PUBLIC SECTION.
   
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_double_click.
   
PERFORM show_cell_info USING row column 'is selected'.
 
ENDMETHOD.
ENDCLASS.

DATA: gr_table TYPE REF TO cl_salv_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table
   
CHANGING t_table = gt_data[] ).


 
"=====
獲取事件對象
  DATA: lr_event TYPE REF TO cl_salv_events_table.
  lr_event 
= gr_table->get_event
( ).

 
"=====事件注冊
 
DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
 
CREATE OBJECT lr_handle_event.
 
SET HANDLER lr_handle_event->on_double_click
FOR lr_event.

  gr_table
->display( ).

FORM show_cell_info USING p_row TYPE i
                          p_column
TYPE lvc_fname
                          p_text
TYPE string.

 
DATA: l_row TYPE char10.
 
WRITE p_row TO l_row LEFT-JUSTIFIED.

 
CONCATENATE l_row 'Line,' p_column 'Column' p_text INTO p_text SEPARATED BY space.
 
MESSAGE i001(00) WITH p_text.

ENDFORM.
FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

LINK_CLICK熱點點擊事件

image123

CLASS l_cl_handle_events DEFINITION.
 
PUBLIC SECTION.
   
METHODS: on_link_click
FOR EVENT link_click OF cl_salv_events_table
                 
IMPORTING

                    row
"事件觸發所在的行號
                    column
."事件觸發所在的列名
ENDCLASS.

CLASS l_cl_handle_events IMPLEMENTATION.
 
METHOD on_link_click.
   
PERFORM show_cell_info USING row column 'is selected with hotspot'.
 
ENDMETHOD.
ENDCLASS.

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table
   
CHANGING t_table = gt_data[] ).


 
"
設置熱點列
  gr_columns = gr_table->get_columns( ).
  gr_column ?= gr_columns
->get_column( 'KEY1').
  gr_column
->set_cell_type( if_salv_c_cell_type=>hotspot
).

 
"=====獲取事件對象
 
DATA: lr_event TYPE REF TO cl_salv_events_table.
  lr_event
= gr_table->get_event( ).

 
"=====事件注冊
 
DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
 
CREATE OBJECT lr_handle_event.
 
SET HANDLER lr_handle_event->on_link_click FOR lr_event.

  gr_table
->display( ).

FORM show_cell_info USING p_row TYPE i
                          p_column
TYPE lvc_fname
                          p_text
TYPE string.

 
DATA: l_row TYPE char10.
 
WRITE p_row TO l_row LEFT-JUSTIFIED.

 
CONCATENATE l_row 'Line,' p_column 'Column' p_text INTO p_text SEPARATED BY space.
 
MESSAGE i001(00) WITH p_text.

ENDFORM.
FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

ADDED_FUNCTION附加功能(按鈕)事件

在“在預設置工具欄上附加按鈕”示例的基礎上,增加按鈕事件

image124

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.

ENDCLASS.

CLASS l_cl_handle_events IMPLEMENTATION.
 
METHOD on_user_command.
   
PERFORM handle_user_command USING e_salv_function.
 
ENDMETHOD.
ENDCLASS.

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_functions TYPE REF TO cl_salv_functions_list.
DATA:gr_container TYPE REF TO cl_gui_custom_container.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
CALL SCREEN 100.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

MODULE 100_pbo OUTPUT.
 
PERFORM inital.
 
"判斷是否已分配了一個有效引用
 
IF gr_container IS NOT BOUND.
   
"創建容器
   
CREATE OBJECT gr_container
     
EXPORTING

        container_name
= 'CONTAINER_1'."屏幕上用戶自定義控件名
   
"創建ALV
    cl_salv_table
=>factory(
     
EXPORTING
          r_container
= gr_container
          container_name
= 'CONTAINER_1'

     
IMPORTING
          r_salv_table
= gr_table
     
CHANGING

          t_table
= gt_data[] ).

   
"附加刷新按鈕
   
DATA: lr_functions TYPE REF TO cl_salv_functions_list.
    lr_functions
= gr_table->get_functions( ).
    lr_functions
->set_all( abap_true ).
   
INCLUDE <icon>.
   
DATA: l_icon TYPE string.
    l_icon
= icon_refresh.
   
"附加按鈕,只適用於 可控模式 下的SALV
    lr_functions
->add_function(
      name
= 'REFRESH'
     
icon = l_icon
     
text = '
刷新按鈕'
      tooltip
= '刷新數據'
     
"按鈕存放的位置:這里在右邊附加。該參數的其他取值可以查看該方法源碼,可以
     
"找到該參數其他取值的蛛絲馬跡
     
position = if_salv_c_function_position=>right_of_salv_functions ).

   
"=====獲取事件對象
   
DATA: lr_event TYPE REF TO cl_salv_events_table.
    lr_event
= gr_table->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.

   
"顯示
    gr_table
->display( ).

 
ENDIF.
ENDMODULE.

FORM handle_user_command USING p_function TYPE salv_de_function.
 
CASE p_function.
   
WHEN 'REFRESH'.
     
PERFORM inital.
      gr_table
->refresh( ).
 
ENDCASE.
ENDFORM.

紅綠燈、燈提示信息

image125

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA: BEGIN OF gt_data OCCURS 0,
  light
(1), "信息燈列
  val
(1),
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table
   
CHANGING t_table = gt_data[] ).


  gr_columns
= gr_table->get_columns( ).
  gr_columns
->set_exception_column( 'LIGHT' ).

  gr_column ?= gr_columns
->get_column( 'LIGHT' ).
  "如果不通過下面set_ddic_reference方法來設置參
  "
照某詞典類型,則異常列標題固定顯示為 Exception
  gr_column
->set_long_text( '異常燈' ).
 
DATA: s_ddic TYPE salv_s_ddic_reference.
  s_ddic
-field = 'FIELD'.
  s_ddic
-table = 'SALV_S_DDIC_REFERENCE'.

  gr_column
->set_ddic_reference( s_ddic ).
  gr_column ?= gr_columns
->get_column( 'VAL' ).
  gr_column
->set_long_text( '異常值' ).

 
"==========為異常列單無格不同的值添加不同的冒泡提示
 
DATA:lr_functional_settings TYPE REF TO cl_salv_functional_settings.
  lr_functional_settings
= gr_table->get_functional_settings( ).
 
DATA: lr_tooltips TYPE REF TO cl_salv_tooltips.
  lr_tooltips
= lr_functional_settings->get_tooltips( ).

  lr_tooltips
->add_tooltip(
 
"單元格顯示類型:異常燈、圖標、符號。即這里針對的是類型為 異常列 所有的單元格
   
type = cl_salv_tooltip=>c_type_exception
   
value = space"
不同的圖形不同的冒泡提示
    tooltip
= 'Undefined').
  lr_tooltips
->add_tooltip(
   
type = cl_salv_tooltip=>c_type_exception
   
value = '1'

    tooltip
= '紅燈').
  lr_tooltips
->add_tooltip(
   
type = cl_salv_tooltip=>c_type_exception
   
value = '2'

    tooltip
= '黃燈').
  lr_tooltips
->add_tooltip(
   
type = cl_salv_tooltip=>c_type_exception
   
value = '3'

    tooltip
= '綠燈').
  gr_table
->display( ). "調用實例方法顯示表報

FORM inital .
  gt_data
-light = ' '. "取值范圍為:空、1~3
  gt_data
-val = ''.
 
APPEND gt_data .

  gt_data
-light = '1'.
  gt_data
-val = '1'.
 
APPEND gt_data .

  gt_data
-light = '2'.
  gt_data
-val = '2'.
 
APPEND gt_data .

  gt_data
-light = '3'.
  gt_data
-val = '3'.
 
APPEND gt_data .
ENDFORM.

圖標顯示、圖標提示信息

image126

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
INCLUDE <icon>.
DATA: BEGIN OF gt_data OCCURS 0,
 
icon TYPE icon_d, "圖標
  val
TYPE string,
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table
   
CHANGING t_table = gt_data[] ).


  gr_columns
= gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( 'ICON' ).
  gr_column
->set_icon( if_salv_c_bool_sap=>true ).
  gr_column
->set_long_text( '圖標' ).

  gr_column ?= gr_columns
->get_column( 'VAL' ).
  gr_column
->set_long_text( '圖標值' ).

 
"==========為圖標列單無格不同的值添加不同的冒泡提示
 
DATA:lr_functional_settings TYPE REF TO cl_salv_functional_settings.
  lr_functional_settings
= gr_table->get_functional_settings( ).
 
DATA: lr_tooltips TYPE REF TO cl_salv_tooltips.
  lr_tooltips
= lr_functional_settings->get_tooltips( ).

 
DATA: lvc_value TYPE lvc_value.
  lvc_value
= icon_locked.
  lr_tooltips
->add_tooltip(
 
"單元格顯示類型:異常燈、圖標、符號。即這里針對的是類型為 圖標列 所有的單元格
   
type = cl_salv_tooltip=>c_type_icon
   
value = lvc_value"
不同的圖形不同的冒泡提示
    tooltip
= '鎖定').
  lvc_value
= icon_message_warning.
  lr_tooltips
->add_tooltip(
   
type = cl_salv_tooltip=>c_type_icon
   
value =
lvc_value
    tooltip
= '
警告').
  lvc_value
= icon_unlocked.
  lr_tooltips
->add_tooltip(
   
type = cl_salv_tooltip=>c_type_icon
   
value =
lvc_value
    tooltip
= '
解鎖').

  gr_table
->display( ). "調用實例方法顯示表報

FORM inital .

  gt_data
-icon = icon_locked.
 
"在前面加了等號,如果不加,也會直接輸出圖標,而不是文字
  gt_data
-val = `=@06@`.
 
APPEND gt_data .

  gt_data
-icon = icon_message_warning.
  gt_data
-val = `=@1A@`.
 
APPEND gt_data .

  gt_data
-icon = icon_unlocked.
  gt_data
-val = `=@07@`.
 
APPEND gt_data .
ENDFORM.

設置單元格顏色

image127

DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.

DATA: g_color TYPE lvc_s_colo.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
TYPE mara-matnr,
  key2
(2),
 
color TYPE lvc_t_scol,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
  cl_salv_table
=>factory(
   
IMPORTING r_salv_table = gr_table"用來接收工廠產生的實例
   
CHANGING t_table = gt_data[] ).

 
FIELD-SYMBOLS: <ls_outtab> LIKE gt_data.
 
DATA: lt_color TYPE lvc_t_scol,
        ls_color
TYPE lvc_s_scol.

 
LOOP AT gt_data ASSIGNING <ls_outtab>.
   
CLEAR: ls_color,lt_color.
   
IF <ls_outtab>-key1 = 'a'.
      ls_color
-fname = 'KEY1'."為哪列設置顏色
      ls_color
-color-col = '6'."顏色值
      ls_color
-color-int = '0'."加深
      ls_color
-color-inv = '0'."前景背景顏色反轉
     
APPEND ls_color TO  lt_color.
   
ENDIF.
   
IF <ls_outtab>-key2 = 'bb'.
      ls_color
-fname = 'KEY2'.
      ls_color
-color-col = '5'.
      ls_color
-color-int = '0'.
      ls_color
-color-inv = '0'.
     
APPEND ls_color TO  lt_color.
   
ENDIF.
    <ls_outtab>
-color = lt_color.
 
ENDLOOP.

  gr_columns
= gr_table->get_columns( ).
  gr_columns
->set_color_column( 'COLOR' ).
  gr_table
->display( ).

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bb'.
 
APPEND gt_data.
ENDFORM.


免責聲明!

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



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