細心的讀者肯定已經注意前面的兩個例子少了點什麼,少了ALV提供的標準功能,比如排序,過濾,彙總,等,以及用戶可以在ALV的功能欄上加上自己自定義的功能按鈕。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
ALV的標準功能可以通過類CL_SALV_FUNCTIONS和CL_SALV_FUNCTION來設計,通過這兩個類你可以對ALV提供的標準功能可見或不可見。也可以自己創建GUI STATUS設置自己的ALV功能,通過GUI STATUS來設置ALV的功能是通過類CL_SALV_TABLE的方法SET_SCREEN_STATUS來實現的。
1.首先我們要取得類CL_SALV_FUNCTIONS的實例,根據類CL_SALV_TABLE的方法get_functions可以取得功能實例。
lr_functions = gr_table->get_functions( ).
lr_functions->set_all( 'X' ).
2根據類CL_SALV_TABLE的方法設置功能欄。
gr_table->set_screen_status(
pfstatus = 'SALV_STANDARD'
report = sy-repid
set_functions = gr_table->c_functions_all ).
3.自定義功能的實現。ALV的自定義功能的實現動作要通過類的事件來處理。
Ø 首先定義事件的操作類
CLASS lcl_handle_events DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: on_user_command FOR EVENT added_function OF cl_salv_events
IMPORTING e_salv_function.
ENDCLASS. "lcl_handle_events DEFINITION
Ø 實現事件的操作類
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_user_command.
DATA l_string TYPE string.
CONCATENATE 'Function is ' e_salv_function
INTO l_string
SEPARATED BY space.
MESSAGE i000(0k) WITH l_string.
ENDMETHOD. "on_user_command
ENDCLASS. "lcl_handle_events IMPLEMENTATION
Ø 註冊事件
SET HANDLER lcl_handle_events=>on_user_command FOR lr_events.
下面是效果圖
下面是程序的所有代碼:
REPORT y_xin_002.
*變量定義
TYPES ty_spfli TYPE spfli OCCURS 0.
DATA: gr_table TYPE REF TO cl_salv_table.
*----------------------------------------------------------------------*
* CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
* 事件處理類(定義)
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: on_user_command FOR EVENT added_function OF cl_salv_events
IMPORTING e_salv_function.
ENDCLASS. "lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
* 事件處理類(實現)
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_user_command.
DATA l_string TYPE string.
CONCATENATE 'Function is ' e_salv_function
INTO l_string
SEPARATED BY space.
MESSAGE i000(0k) WITH l_string.
ENDMETHOD. "on_user_command
ENDCLASS. "lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
* 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,
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.
DATA: lr_functions TYPE REF TO cl_salv_functions,
lr_events TYPE REF TO cl_salv_events.
"創建實例
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab
).
CATCH cx_salv_msg.
ENDTRY.
lr_events = gr_table->get_event( ).
"設置ALV功能
gr_table->set_screen_status(
pfstatus = 'SALV_STANDARD'
report = sy-repid
set_functions = gr_table->c_functions_all ).
"註冊事件
SET HANDLER lcl_handle_events=>on_user_command FOR lr_events.
"顯示列表
gr_table->display( ).
ENDMETHOD. "alv_full
*主方法,整合數據
METHOD main.
DATA: lt_tab TYPE TABLE OF spfli.
"取得要顯示的數據
lt_tab = me->getdata( ).
me->alv_full( lt_tab ).
ENDMETHOD. "main
ENDCLASS. "lcl_alv IMPLEMENTATION
*報表執行
START-OF-SELECTION.
DATA lr_alv TYPE REF TO lcl_alv.
CREATE OBJECT lr_alv.
lr_alv->main( ).