一般的ALV有三種顯示形式,分別爲<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、普通的List
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
二、全屏的Grid
三、在自定義屏幕的顯示的Grid
跟以往實現這三種ALV顯示方式相比,以往的三種顯示方式分別是調用不同的Function和Class,實現方式複雜。現在這三種顯示方式可以通過一個類(CL_SALV_TABLE)來實現,而且通過這個類和它的子類可以更加容易的實現ALV的功能,比如:排序,總計,過濾,頁眉頁腳,單擊雙擊事件等。
下面讓我們一步一步地來實現這三種顯示形式。
1.首先我們先創建選擇屏幕,屏幕有三個選項,三個選項分別爲三種顯示方式。
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.
PARAMETERS: p_full RADIOBUTTON GROUP rg,
p_list RADIOBUTTON GROUP rg,
p_grid RADIOBUTTON GROUP rg.
SELECTION-SCREEN END OF BLOCK blk.
2取得要顯示的數據。
SELECT * INTO TABLE lt_tab FROM spfli
3.判斷選擇屏幕的選項創建不同的實例。
CASE 'X'.
WHEN p_full.
me->alv_full( lt_tab ).
WHEN p_list.
me->alv_list( lt_tab ).
WHEN p_grid.
me->alv_grid( lt_tab ).
ENDCASE.
4.當用戶選擇第一個選項,列表輸出爲全屏的網格列表,執行方法alv_full( )。
METHOD alv_full.
"創建實例
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
"顯示列表
gr_table->display( ).
ENDMETHOD. "alv_full
5.當用戶選擇第二個選項,列表輸出爲普通的列表,執行方法alv_list( ).alv_list方法跟alv_full方法不同的是在創建實例的時候多了一個選項list_display = ‘X’.
METHOD alv_list.
"創建實例
TRY.
cl_salv_table=>factory(
EXPORTING
list_display = 'X'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
"顯示列表
gr_table->display( ).
ENDMETHOD. "alv_list
6.當用戶選擇第三個選項,列表在自定義屏幕上輸出網格列表,執行方法alv_grid( ).方法alv_grid()調用了屏幕100。執行屏幕的時候會執行它的PBO和PAI,也就是會執行module status_0100和user_command_0100。Status_0100的代碼是:
"定義變量
DATA: lr_container TYPE REF TO cl_gui_custom_container,
lr_alv2 TYPE REF TO lcl_alv,
lt_tab TYPE TABLE OF spfli.
"創建容器實例
IF cl_salv_table=>is_offline( ) = ''.
CREATE OBJECT lr_container
EXPORTING
container_name = 'CONTAINER'.
ENDIF.
"創建類LCL_ALV實例
CREATE OBJECT lr_alv2.
"取得列表數據
lt_tab = lr_alv2->getdata( ).
"創建ALV實例
TRY.
cl_salv_table=>factory(
EXPORTING
r_container = lr_container
container_name = 'CONTAINER'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
"顯示ALV列表
gr_table->display( ).
"釋放內存
FREE lt_tab.
下面是程序的所有代碼:
REPORT y_xin_002.
*變量定義
TYPES ty_spfli TYPE spfli OCCURS 0.
DATA: gr_table TYPE REF TO cl_salv_table.
*選擇屏幕設計
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.
PARAMETERS: p_full RADIOBUTTON GROUP rg,
p_list RADIOBUTTON GROUP rg,
p_grid RADIOBUTTON GROUP rg.
SELECTION-SCREEN END OF BLOCK blk.
*----------------------------------------------------------------------*
* CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
* ALV操作類(定義)
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
PUBLIC SECTION.
METHODS: getdata "取得要顯示的數據
RETURNING value(lt_tab) TYPE ty_spfli,
alv_full "全屏Grid列表處理方法
IMPORTING value(lt_tab) TYPE ty_spfli,
alv_list "普通List處理方法
IMPORTING value(lt_tab) TYPE ty_spfli,
alv_grid "在自定義屏幕上顯示的列表
IMPORTING value(lt_tab) TYPE ty_spfli,
main. "主方法
ENDCLASS. "lcl_alv DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
* ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
METHOD getdata.
SELECT * INTO TABLE lt_tab FROM spfli.
ENDMETHOD. "getdata
*輸出全屏網格列表的方法
METHOD alv_full.
"創建實例
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
"顯示列表
gr_table->display( ).
ENDMETHOD. "alv_full
*輸出全屏普通列表的方法
METHOD alv_list.
"創建實例
TRY.
cl_salv_table=>factory(
EXPORTING
list_display = 'X'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
"顯示列表
gr_table->display( ).
ENDMETHOD. "alv_list
*輸出在自定義屏幕上的列表
METHOD alv_grid.
CALL SCREEN '0100'.
ENDMETHOD. "alv_grid
*主方法,整合數據
METHOD main.
DATA: lt_tab TYPE TABLE OF spfli.
"取得要顯示的數據
lt_tab = me->getdata( ).
"判斷選擇屏幕的選擇條件調用不同的方法
CASE 'X'.
WHEN p_full.
me->alv_full( lt_tab ).
WHEN p_list.
me->alv_list( lt_tab ).
WHEN p_grid.
me->alv_grid( lt_tab ).
ENDCASE.
ENDMETHOD. "main
ENDCLASS. "lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
* MODULE status_0100
*----------------------------------------------------------------------*
* PBO 屏幕輸出前執行
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
"定義變量
DATA: lr_container TYPE REF TO cl_gui_custom_container,
lr_alv2 TYPE REF TO lcl_alv,
lt_tab TYPE TABLE OF spfli.
"創建容器實例
IF cl_salv_table=>is_offline( ) = ''.
CREATE OBJECT lr_container
EXPORTING
container_name = 'CONTAINER'.
ENDIF.
"創建類LCL_ALV實例
CREATE OBJECT lr_alv2.
"取得列表數據
lt_tab = lr_alv2->getdata( ).
"創建ALV實例
TRY.
cl_salv_table=>factory(
EXPORTING
r_container = lr_container
container_name = 'CONTAINER'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
"顯示ALV列表
gr_table->display( ).
"釋放內存
FREE lt_tab.
ENDMODULE. "status_0100
*----------------------------------------------------------------------*
* MODULE user_command_0100
*----------------------------------------------------------------------*
* PAI 屏幕輸出後的動作
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
ENDMODULE. "user_command_0100
*報表執行
START-OF-SELECTION.
DATA lr_alv TYPE REF TO lcl_alv.
CREATE OBJECT lr_alv.
lr_alv->main( ).