OO实现ALV
一、????? 最簡單的ALV顯示
以前都是通過函數“REUSE_ALV_GRID_DISPLAY”來顯示列表,這種方式是面向過程的,現在有另外一種面向對象化的方式來顯示列表,函數REUSE_ALV_GRID_DISPLAY可以做到的它也能夠做到。它主要是通過一個類CL_SALV_TABLE來實現的.
下面讓我們來實現最簡單的ALV列表。
1取得要顯示的數據。
SELECT * INTO TABLE lt_tab FROM spfli
2.調用類CL_SALV_TABLE的靜態方法Factory()創建類的實例。
TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = lr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
?3.取得實例之后再調用方法Display()顯示列表.
??????lr_table->display( ).
?處理過程完成,最后讓我們看一下顯示結果。
?
下面是報表的所有源代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES ty_spfli TYPE spfli OCCURS 0.
?
*----------------------------------------------------------------------*
*??????CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*??????ALV操作類(定義)
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
? PUBLIC SECTION.
??? METHODS:getdata???????? "取得要顯示的數據
??????????????RETURNING value(lt_tab) TYPE ty_spfli,
????????????alv_process???? "ALV處理方法
??????????????IMPORTING value(lt_tab) TYPE ty_spfli,
????????????main.?????????? "主方法
? PRIVATE SECTION.
??? DATA gr_table TYPE REF TOcl_salv_table.
ENDCLASS.???????????????????"lcl_alv DEFINITION
?
*----------------------------------------------------------------------*
*??????CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*??????ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? SELECT * INTO TABLE lt_tabFROM spfli.
? ENDMETHOD.???????????????????"getdata
?
*ALV處理方法
? METHOD alv_process.
??? "創建實例
??? 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_process
?
*主方法,整合數據
? METHOD main.
??? DATA: lt_tab TYPE TABLE OFspfli.
?
??? "取得要顯示的數據
??? lt_tab = me->getdata( ).
??? "處理數據
??? me->alv_process( lt_tab).
? ENDMETHOD.???????????????????"main
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
*報表執行
start-of-selection.
? data? lr_alv?? type refto lcl_alv.
? create object lr_alv.
? lr_alv->main( ).
關于ALV的最全文檔可以參考SAP Help
http://help.sap.com/saphelp_nw70/helpdata/EN/5e/88d440e14f8431e10000000a1550b0/content.htm
?
二、????? ALV顯示的三種形式
一般的ALV有三種顯示形式,分別為
一、普通的List
?二、全屏的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.
? "創建容器實例
? IFcl_salv_table=>is_offline( ) = ''.
???CREATE OBJECT lr_container
?????EXPORTING
???????container_name = 'CONTAINER'.
? ENDIF.
? "創建類LCL_ALV實例
? CREATEOBJECT 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
????? ).
??? CATCHcx_salv_msg.
? ENDTRY.
? "顯示ALV列表
?gr_table->display( ).
? "釋放內存
? FREElt_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.
? PUBLICSECTION.
???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.
*取得要顯示的數據
? METHODgetdata.
???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
?
*輸出全屏普通列表的方法
? METHODalv_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
?
*輸出在自定義屏幕上的列表
? METHODalv_grid.
??? CALLSCREEN '0100'.
?ENDMETHOD.???????????????????"alv_grid
?
*主方法,整合數據
? METHODmain.
??? 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_alvIMPLEMENTATION
?
*----------------------------------------------------------------------*
*? 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.
? "創建容器實例
? IFcl_salv_table=>is_offline( ) = ''.
??? CREATEOBJECT 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
????? ).
??? CATCHcx_salv_msg.
? ENDTRY.
? "顯示ALV列表
?gr_table->display( ).
? "釋放內存
? FREElt_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.
? CREATEOBJECT lr_alv.
?lr_alv->main( ).
三、????? ALV的功能設計
細心的讀者肯定已經注意前面的兩個例子少了點什么,少了ALV提供的標準功能,比如排序,過濾,匯總,等,以及用戶可以在ALV的功能欄上加上自己自定義的功能按鈕。
?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的自定義功能的實現動作要通過類的事件來處理。
????????首先定義事件的操作類
??? CLASSlcl_handle_events DEFINITION.
? PUBLICSECTION.
???CLASS-METHODS: on_user_command FOR EVENT added_function OF cl_salv_events
????????????????????? IMPORTINGe_salv_function.
ENDCLASS.????????????? ??????"lcl_handle_events DEFINITION
????????實現事件的操作類
CLASS lcl_handle_events IMPLEMENTATION.
? METHODon_user_command.
??? DATAl_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_eventsIMPLEMENTATION
????????? 注冊事件
SET HANDLERlcl_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.
? PUBLICSECTION.
???CLASS-METHODS: on_user_command FOR EVENT added_function OFcl_salv_events
????????????????????? IMPORTINGe_salv_function.
ENDCLASS.??????????????????? "lcl_handle_eventsDEFINITION
?
*----------------------------------------------------------------------*
*?????? CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*?????? 事件處理類(實現)
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
? METHODon_user_command.
??? DATAl_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_eventsIMPLEMENTATION
?
*----------------------------------------------------------------------*
*????? ?CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*?????? ALV操作類(定義)
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
? PUBLICSECTION.
???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.
*取得要顯示的數據
? METHODgetdata.
???SELECT * INTO TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHODalv_full.
??? DATA:lr_functions TYPE REF TO cl_salv_functions,
?????????lr_events??? TYPE REF TOcl_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 ).
?
??? "注冊事件
??? SETHANDLER lcl_handle_events=>on_user_command FOR lr_events.
?
??? "顯示列表
???gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
?
*主方法,整合數據
? METHODmain.
??? DATA:lt_tab TYPE TABLE OF spfli.
?
??? "取得要顯示的數據
??? lt_tab = me->getdata( ).
?
??? me->alv_full( lt_tab ).
? ENDMETHOD.??????????????????? "main
ENDCLASS.??????????????????? "lcl_alvIMPLEMENTATION
?
*報表執行
START-OF-SELECTION.
?DATA? lr_alv?? TYPE REF TO lcl_alv.
? CREATEOBJECT lr_alv.
?lr_alv->main( ).
?
?
四、????? ALV的顯示樣式
通過類CL_SALV_DISPLAY_SETTINGS我們可以設置ALV的顯示樣式,主要包括ALV表頭名稱,列表顏色間隔顯示,水平線是否顯示,豎線是否顯示等。
1.首先我們要取得類CL_SALV_DISPLAY_SETTINGS的實例,根據類CL_SALV_TABLE的方法get_display_settings可以取得顯示樣式的實例。
lr_display = gr_table->get_display_settings().
2然后通過類CL_SALV_DISPLAY_SETTINGS的方法設置顯示屬性。
lr_display = gr_table->get_display_settings().
???lr_display->set_striped_pattern( 'X' ). "設置顏色間隔顯示
???lr_display->set_list_header( 'Xin''s ALV' ). "設置ALV的抬頭
???lr_display->set_horizontal_lines( '' ).? "設置水平線是否顯示
???lr_display->set_vertical_lines( '' ).??? "設置垂直線是否顯示
下面是效果圖
?下面是程序的所有代碼:
REPORT?y_xin_002.
?
*變量定義
TYPES ty_spfli TYPE spfli OCCURS 0.
DATA: gr_table???? TYPE REF TO cl_salv_table.
?
?
*----------------------------------------------------------------------*
*?????? CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*?????? ALV操作類(定義)
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
? PUBLICSECTION.
???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.
*取得要顯示的數據
? METHODgetdata.
???SELECT * INTO TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHODalv_full.
??? DATA:lr_functions TYPE REF TO cl_salv_functions,
????????? lr_display?? TYPE REF TO cl_salv_display_settings.
??? databoolean type c.
?
???"創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
???????).
?????CATCH cx_salv_msg.
???ENDTRY.
?
??? "顯示ALV的標準功能
??? lr_functions = gr_table->get_functions().
???lr_functions->set_all( 'X' ).
?
??? "設置ALV的顯示樣式
???lr_display = gr_table->get_display_settings( ).
???lr_display->set_striped_pattern( 'X' ). "設置顏色間隔顯示
???lr_display->set_list_header( 'Xin''s ALV' ). "設置ALV的抬頭
???lr_display->set_horizontal_lines( '' ).? "設置水平線是否顯示
???lr_display->set_vertical_lines( '' ).??? "設置垂直線是否顯示
?
??? "顯示列表
??? gr_table->display().
?ENDMETHOD.???????????????????"alv_full
?
*主方法,整合數據
? METHODmain.
??? DATA:lt_tab TYPE TABLE OF spfli.
?
???"取得要顯示的數據
???lt_tab = me->getdata( ).
?
???me->alv_full( lt_tab ).
?ENDMETHOD.???????????????????"main
ENDCLASS.??????????????????? "lcl_alvIMPLEMENTATION
?
*報表執行
START-OF-SELECTION.
? DATA? lr_alv??TYPE REF TO lcl_alv.
? CREATEOBJECT lr_alv.
?lr_alv->main( ).
?
五、????? ALV的欄位屬性
ALV的欄位屬性是SAP提供的ALV功能的比較重要的一個,詳細的功能包括異常狀態圖標、圖標、符號、復選框、按鈕、熱點、超鏈接、單元格類型、單元格顏色、某一欄位顏色、某一行顏色,欄位隱藏等等。ALV的欄位功能主要是通過CL_SALV_COLUMN_TABLE和CL_SALV_COLUMNS_TABLE這兩個類的實現的。
?1.?????首先我們要取得類CL_SALV_COLUMNS_TABLE的實例。
DATA? lr_columnsTYPE REF TO cl_salv_columns_table.
lr_columns = gr_table->get_columns( ).
2然后通過類CL_SALV_COLUMNS_TABLE的方法get_column(value)取得指定的欄位的CL_SALV_COLUMN_TABLE的實例,取指定的欄位的實例之后,你就可以對這個欄位的相關屬性進行設置。
DATA? lr_columnTYPE REF TO cl_salv_column_table
lr_column? ?= lr_columns->get_column('MANDT' ).
?2.?????取得指定的欄位的實例之后,在這個實例的基礎上進行相關的屬性設置。
a)???????? 異常狀態圖標
lr_columns->set_exception_column('EXCEPTION' ).
?????? lr_column?= lr_columns->get_column( 'EXCEPTION' ).
lr_column->set_short_text( 'except' ).
b)????圖標
lr_column ?= lr_columns->get_column( 'ICON').
??????lr_column->set_icon( 'X' ).
lr_column->set_long_text( 'ICON' ).
c)????符號
lr_column ?= lr_columns->get_column('SYMBOL' ).
??????lr_column->set_symbol( 'X' ).
lr_column->set_long_text( 'SYMBOL' ).
d)?????復選框
lr_column ?= lr_columns->get_column('CHECKBOX' ).
??????lr_column->set_cell_type( if_salv_c_cell_type=>checkbox ).
lr_column->set_long_text( 'CHECKBOX' ).
e)?????熱點
lr_column ?= lr_columns->get_column('HOTSPOT' ).
??????lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
lr_column->set_long_text( 'HOTSPOT' ).
f)???欄位不可見
????? lr_column? ?=lr_columns->get_column( 'MANDT' ).
?? lr_column->set_visible( '' ).
g)? 超鏈接[likai1]?
lr_columns->set_hyperlink_entry_column('T_HYPERLINK' ).
???????lr_column ?= lr_columns->get_column( 'HYPERLINK' ).
???????lr_column->set_cell_type( if_salv_c_cell_type=>link ).
???????lr_column->set_long_text( 'HYPERLINK' ).
??????? lr_hyperlinks =lr_functional_settings->get_hyperlinks( ).
??????? LOOPAT gt_hyperlink INTO wa_hyperlink.
?????????lr_hyperlinks->add_hyperlink(
???????????handle??? = wa_hyperlink-handle
???????????hyperlink = wa_hyperlink-hyperlink ).
ENDLOOP.
h)??欄位顏色
lr_column ?= lr_columns->get_column('FLTIME' ).
???????ls_color-col = 6.
???????ls_color-int = 0.
???????ls_color-inv = 0.
?lr_column->set_color( ls_color ).
i)???行顏色和單元格顏色
lr_columns->set_color_column('T_COLOR' ).
j)?設置欄位顯示長度最優化
lr_columns->set_optimize( 'X' ).
k)?設置標題欄是否可見
lr_columns->set_headers_visible( 'X' )
?注:上面的所有欄位屬性設置都要需要在相應的內表字段設置相關的值,設置是否可見除外。
?下面是效果圖
?
下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
INCLUDE <icon>.
INCLUDE <symbol>.
?
TYPES: BEGIN OF gs_spfli,
???????exception?? TYPE char1,
???????mandt?????? TYPE spfli-mandt,
???????carrid????? TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
???????countryto?? TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime????? TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
???????period????? TYPE spfli-period,
??????? icon???????TYPE icon_d,
???????symbol????? TYPE icon_d,
???????checkbox??? TYPE char1,
???????hotspot???? TYPE icon_d,
???????hyperlink?? TYPE char255,
???????t_hyperlink TYPE salv_t_int4_column,
???????t_color???? TYPE lvc_t_scol,
???????t_celltype? TYPE salv_t_int4_column,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
DATA: gr_table???? TYPE REF TOcl_salv_table.
?
*----------------------------------------------------------------------*
*??????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,
????????????column_setting, "設置字段屬性
????????????main.?????????? "主方法
? PRIVATE SECTION.
??? DATA: BEGIN OF wa_hyperlink,
???????????handle TYPE salv_de_hyperlink_handle,
???????????hyperlink TYPE service_rl,
?????????END OF wa_hyperlink.
??? DATA gt_hyperlink LIKE TABLE OFwa_hyperlink.
ENDCLASS.???????????????????"lcl_alv DEFINITION
?
*----------------------------------------------------------------------*
*??????CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*??????ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? FIELD-SYMBOLS <fs_spfli>TYPE gs_spfli.
??? DATA: lwa_hyperlink TYPE LINE OFsalv_t_int4_column,
?????????lt_hyperlink LIKE TABLE OF lwa_hyperlink,
?????????l_tabix TYPE sy-tabix,
?????????ls_color TYPE lvc_s_scol,
?????????lt_color TYPE lvc_t_scol,
?????????ls_celltype TYPE salv_s_int4_column,
?????????lt_celltype TYPE salv_t_int4_column.
?
??? DEFINE add_color.
????? clear ls_color.
????? ls_color-fname =&1.
????? ls_color-color-col =&2.
????? ls_color-color-int =1.
????? ls_color-color-inv =0.
????? ls_color-nokeycol ='X'.
????? append ls_color tolt_color.
??? END-OF-DEFINITION.
?
??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?
??? "循環,為EXCEPTION等欄位賦值
??? LOOP AT lt_tab ASSIGNING<fs_spfli>.
????? l_tabix = sy-tabix.
?????<fs_spfli>-exception = '3'.
?????<fs_spfli>-icon????? = icon_okay.
?????<fs_spfli>-symbol??? = sym_document.
?????<fs_spfli>-checkbox? = 'X'.
?????<fs_spfli>-hotspot?? = icon_overview.
?
????? REFRESHlt_hyperlink.
????? lwa_hyperlink-value= l_tabix.
?????lwa_hyperlink-columnname = 'HYPERLINK'.
????? APPEND lwa_hyperlinkTO lt_hyperlink.
?????<fs_spfli>-t_hyperlink = lt_hyperlink.
?????<fs_spfli>-hyperlink? = 'www.sina.com.cn'.
????? wa_hyperlink-handle= l_tabix.
?????wa_hyperlink-hyperlink = 'www.sina.com.cn'.
????? APPEND wa_hyperlinkTO gt_hyperlink.
?
????? REFRESH lt_color.
????? IF<fs_spfli>-distance >= 5000.
??????? CLEARls_color.
???????ls_color-fname = 'DISTANCE'.
???????ls_color-color-col = 5.
???????ls_color-color-int = 1.
???????ls_color-color-inv = 0.
??????? APPENDls_color TO lt_color.
????? ENDIF.
?
????? CLEAR ls_color.
????? ls_color-fname ='COUNTRYFR'.
????? ls_color-color-col =5.
????? ls_color-color-int =1.
????? ls_color-color-inv =0.
????? APPEND ls_color TOlt_color.
?
????? IF<fs_spfli>-countryfr IS NOT INITIAL.
???????add_color 'EXCEPTION' 4.
???????add_color 'MANDT' 4.
???????add_color 'CARRID' 4.
???????add_color 'CONNID' 4.
???????add_color 'COUNTRYFR' 4.
???????add_color 'CITYFROM' 4.
???????add_color 'AIRPFROM' 4.
???????add_color 'COUNTRYTO' 4.
???????add_color 'CITYTO' 4.
???????add_color 'AIRPTO' 4.
???????add_color 'FLTIME' 4.
???????add_color 'DEPTIME' 4.
???????add_color 'ARRTIME' 4.
???????add_color 'DISTANCE' 4.
???????add_color 'DISTID' 4.
???????add_color 'FLTYPE' 4.
???????add_color 'PERIOD' 4.
???????add_color 'ICON' 4.
???????add_color 'SYMBOL' 4.
???????add_color 'CHECKBOX' 4.
???????add_color 'HOTSPOT' 4.
???????add_color 'HYPERLINK' 4.
????? ENDIF.
?????<fs_spfli>-t_color = lt_color.
??? ENDLOOP.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA: lr_functions TYPE REF TOcl_salv_functions.
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCH cx_salv_msg.
??? ENDTRY.
?
??? "顯示ALV的標準功能
??? lr_functions =gr_table->get_functions( ).
??? lr_functions->set_all( 'X' ).
?
??? "設置欄位屬性
??? me->column_setting( ).
?
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
?
*設置字段屬性
? METHOD column_setting.
??? DATA: lr_columns TYPE REF TOcl_salv_columns_table,
?????????lr_column? TYPE REF TO cl_salv_column_table,
?????????lr_functional_settings TYPE REF TO cl_salv_functional_settings,
?????????lr_hyperlinks TYPE REF TO cl_salv_hyperlinks.
??? DATA: ls_color TYPE lvc_s_colo.
?
??? lr_columns =gr_table->get_columns( ).
??? lr_columns->set_optimize( 'X').
???lr_columns->set_headers_visible( 'X' ).?? "設置標題欄是否可見
??? lr_functional_settings =gr_table->get_functional_settings( ).
?
??? TRY.
??????? "設置欄位不可見
???????lr_column? ?= lr_columns->get_column( 'MANDT' ).
???????lr_column->set_visible( '' ).
???????lr_column ?= lr_columns->get_column( 'PERIOD' ).
???????lr_column->set_visible( '' ).
???????lr_column ?= lr_columns->get_column( 'FLTYPE' ).
???????lr_column->set_visible( '' ).
???????lr_column ?= lr_columns->get_column( 'DISTID' ).
???????lr_column->set_visible( '' ).
???????lr_column ?= lr_columns->get_column( 'DEPTIME' ).
???????lr_column->set_visible( '' ).
???????lr_column ?= lr_columns->get_column( 'ARRTIME' ).
???????lr_column->set_visible( '' ).
??????? "設置異常欄位
???????lr_columns->set_exception_column( 'EXCEPTION' ).
???????lr_column ?= lr_columns->get_column( 'EXCEPTION' ).
???????lr_column->set_short_text( 'except' ).
???????lr_column->set_medium_text( 'exception' ).
???????lr_column->set_long_text( 'my exception' ).
??????? "設置圖標欄位
???????lr_column ?= lr_columns->get_column( 'ICON' ).
???????lr_column->set_icon( 'X' ).
???????lr_column->set_long_text( 'ICON' ).
??????? "設置符號欄位
???????lr_column ?= lr_columns->get_column( 'SYMBOL' ).
??????? lr_column->set_symbol('X' ).
???????lr_column->set_long_text( 'SYMBOL' ).
??????? "設置復選框欄位
???????lr_column ?= lr_columns->get_column( 'CHECKBOX' ).
???????lr_column->set_cell_type( if_salv_c_cell_type=>checkbox ).
???????lr_column->set_long_text( 'CHECKBOX' ).
??????? "設置熱點
???????lr_column ?= lr_columns->get_column( 'HOTSPOT' ).
???????lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
???????lr_column->set_long_text( 'HOTSPOT' ).
??????? "設置超鏈接
???????lr_columns->set_hyperlink_entry_column( 'T_HYPERLINK').
???????lr_column ?= lr_columns->get_column( 'HYPERLINK' ).
???????lr_column->set_cell_type( if_salv_c_cell_type=>link ).
???????lr_column->set_long_text( 'HYPERLINK' ).
???????lr_hyperlinks = lr_functional_settings->get_hyperlinks( ).
??????? LOOP ATgt_hyperlink INTO wa_hyperlink.
?????????lr_hyperlinks->add_hyperlink(
???????????handle??? = wa_hyperlink-handle
???????????hyperlink = wa_hyperlink-hyperlink ).
??????? ENDLOOP.
??????? "設置欄位顏色
???????lr_column ?= lr_columns->get_column( 'FLTIME' ).
???????ls_color-col = 6.
???????ls_color-int = 0.
???????ls_color-inv = 0.
???????lr_column->set_color( ls_color ).
??????? "設置行顏色
???????lr_columns->set_color_column( 'T_COLOR' ).
????? CATCHcx_salv_not_found.
????? CATCHcx_salv_data_error.
????? CATCHcx_salv_existing.
??? ENDTRY.
?
?ENDMETHOD.???????????????????"column_setting
?
*主方法,整合數據
? METHOD main.
??? DATA: lt_tab TYPE ty_spfli.
?
??? "取得要顯示的數據
??? lt_tab = me->getdata( ).
?
??? me->alv_full( lt_tab ).
?ENDMETHOD.???????????????????"main
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
?
*報表執行
START-OF-SELECTION.
? DATA? lr_alv?? TYPE REF TOlcl_alv.
? CREATE OBJECT lr_alv.
? lr_alv->main( ).
六、????? ALV的彈出窗口形式
前面的例子ALV列表都是直接輸出在主窗口中,下面我們實現在彈出窗口中實現ALV。在彈出窗口中實現ALV也很簡單,只要在實現類CL_SALV_TABLE的一個方法SET_SCREEN_POPUP就可以了。
gr_table->set_screen_popup(
????? start_column = 1
?????end_column?? = 120
?????start_line?? = 1
?????end_line???? = 20 ).
方法SET_SCREEN_POPUP的是彈出窗口的顯示范圍。
下面是效果圖
?
下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES: BEGIN OF gs_spfli,
???????mandt?????? TYPE spfli-mandt,
???????carrid????? TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
???????countryto?? TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime????? TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
???????period????? TYPE spfli-period,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
DATA: gr_table???? TYPE REFTO cl_salv_table.
?
*設置屏幕
SELECTION-SCREEN PUSHBUTTON 2(20) btnUSER-COMMAND clk.
?
INITIALIZATION.
? btn = '點擊顯示彈出alv窗口'.
?
*----------------------------------------------------------------------*
*?????? CLASSlcl_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 CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA: lr_functions TYPE REFTO cl_salv_functions.
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
?
??? "顯示ALV的標準功能
??? lr_functions =gr_table->get_functions( ).
??? lr_functions->set_all('X' ).
?
??? "彈出窗口設置
???gr_table->set_screen_popup(
????? start_column = 1
?????end_column?? = 120
?????start_line?? = 1
?????end_line???? = 20 ).
?
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
?
*主方法,整合數據
? METHOD main.
??? DATA: lt_tab TYPE ty_spfli.
?
??? "取得要顯示的數據
??? lt_tab = me->getdata( ).
?
??? me->alv_full( lt_tab ).
?ENDMETHOD.???????????????????"main
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
*執行按鈕點擊動作
AT SELECTION-SCREEN.
? CASE sy-ucomm.
??? WHEN 'CLK'.
????? DATA?lr_alv?? TYPE REF TO lcl_alv.
????? CREATE OBJECTlr_alv.
????? lr_alv->main().
? ENDCASE.
七、????? ALV的選擇功能
在ALV的輸出結果中,要對它的某一行、某一列或者某一單元格進行選定,我們通常的做法是把鼠標直接點擊那一行或者是列就可以了,如果選擇多行或多列,在選擇的條件按住‘CTRL’鍵就可以了。這是手動選擇的方法,但是在實際情況中,有時候需要用程序來對輸出結果進行選擇。
?首先我們要取得類CL_SALV_SELECTIONS的實例。
DATA? lr_selectionsTYPE REF TO cl_salv_selections.
lr_selections = gr_table->get_selections( ).
2.??????設置選擇模式。
lr_selections->set_selection_mode(if_salv_c_selection_mode=>row_column ).
3.??????選擇行
DATA lt_row? TYPE salv_t_row.
APPEND 3 TO lt_row.
??? APPEND 4 TO lt_row.
lr_selections->set_selected_rows( lt_row ).
4.??????選擇列
DATA? lt_columnTYPE salv_t_column.
APPEND 3 TO lt_row.
??? APPEND 4 TO lt_row.
lr_selections->set_selected_rows( lt_row ).
5.??????選擇一個單元格
DATA? ls_cell TYPEsalv_s_cell.
ls_cell-row = 7.
??? ls_cell-columnname ='CITYFROM'.
lr_selections->set_current_cell( ls_cell )
6.??????選擇多個單元格
DATA ?lt_cell?TYPE salv_t_cell,
????????ls_cell? TYPE salv_s_cell.
ls_cell-row = 5.
??? ls_cell-columnname ='CITYFROM'.
??? APPEND ls_cell TO lt_cell.
??? ls_cell-row = 6.
?? ?ls_cell-columnname ='CITYFROM'.
?? APPEND ls_cell TO lt_cell.
???lr_selections->set_selected_cells( lt_cell ).
?下面是效果圖
下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES: BEGIN OF gs_spfli,
???????mandt?????? TYPE spfli-mandt,
???????carrid????? TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
???????countryto?? TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime????? TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
???????period????? TYPE spfli-period,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
DATA: gr_table???? TYPE REFTO cl_salv_table.
?
*----------------------------------------------------------------------*
*??????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 CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA: lr_functions?TYPE REF TO cl_salv_functions,
?????????lr_selections TYPE REF TO cl_salv_selections,
?????????lt_column???? TYPE salv_t_column,
?????????lt_row??????? TYPE salv_t_row,
?????????lt_cell?????? TYPE salv_t_cell,
?????????ls_cell?????? TYPE salv_s_cell.
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
?
??? "顯示ALV的標準功能
??? lr_functions =gr_table->get_functions( ).
??? lr_functions->set_all('X' ).
?
??? "取得類CL_SALV_SELECTIONS的實例
??? lr_selections =gr_table->get_selections( ).
??? "設置選擇模式
???lr_selections->set_selection_mode(if_salv_c_selection_mode=>row_column ).
??? "選擇列
??? APPEND 'FLTIME' TOlt_column.
??? APPEND 'DISTANCE' TOlt_column.
???lr_selections->set_selected_columns( lt_column ).
??? "選擇行
??? APPEND 3 TO lt_row.
??? APPEND 4 TO lt_row.
???lr_selections->set_selected_rows( lt_row ).
*??? "選擇多個單元格
*???ls_cell-row = 5.
*???ls_cell-columnname = 'CITYFROM'.
*??? APPENDls_cell TO lt_cell.
*???ls_cell-row = 6.
*???ls_cell-columnname = 'CITYFROM'.
*??? APPENDls_cell TO lt_cell.
*???lr_selections->set_selected_cells( lt_cell ).
??? "選擇一個單元格
??? ls_cell-row = 7.
??? ls_cell-columnname ='CITYFROM'.
???lr_selections->set_current_cell( ls_cell ).
?
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
?
*主方法,整合數據
? METHOD main.
??? DATA: lt_tab TYPE ty_spfli.
?
??? "取得要顯示的數據
??? lt_tab = me->getdata( ).
?
??? me->alv_full( lt_tab ).
?ENDMETHOD.???????????????????"main
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
*執行動作
START-OF-SELECTION.
? DATA? lr_alv?? TYPE REFTO lcl_alv.
? CREATE OBJECT lr_alv.
? lr_alv->main( ).
八、????? ALV的布局功能
在ALV的輸出結果中,我們可以利用ALV提供的標準功能(過濾,排序,匯總)對輸出結果正行操作。比如說我們對一個結果進行了排序和過濾等的動作,下次再運行這個報表的時候可以選擇一個功能直接運行這些動作。這就需要布局(Layout)的功能了。
首先我們設置布局的功能按鈕。
ls_key-report = sy-repid.
??? lr_layout =gr_table->get_layout( ).
??? lr_layout->set_key(ls_key ).
???lr_layout->set_save_restriction( l_restrict ).
??? lr_layout->set_default('X' ).
??? IF p_lay IS NOT INITIAL.
?????lr_layout->set_initial_layout( p_lay ).
ENDIF.
2.??????設置前臺選項頁面。
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.
PARAMETERS: p_lay LIKE disvariant-variant.
SELECTION-SCREEN SKIP.
PARAMETERS: p_save1 RADIOBUTTON GROUP rgDEFAULT 'X',
???????????p_save2 RADIOBUTTON GROUP rg,
???????????p_save3 RADIOBUTTON GROUP rg.
SELECTION-SCREEN END OF BLOCK blk.
3.??????設置前臺布局選項功能搜索幫助
DATA: ls_layout TYPE salv_s_layout_info,
??????????ls_key??? TYPE salv_s_layout_key,
??????????l_restrict TYPE salv_de_layout_restriction.
??? l_restrict = get_restrict().
??? ls_key-report = sy-repid.
??? ls_layout =cl_salv_layout_service=>f4_layouts(
??? s_key??? =ls_key
?? ?restrict = l_restrict ).
layout = ls_layout-layout.
下面是效果圖
?
下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES: BEGIN OF gs_spfli,
???????mandt?????? TYPE spfli-mandt,
???????carrid????? TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
???????countryto?? TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime????? TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
??????? period?????TYPE spfli-period,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
*選擇屏幕
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.
PARAMETERS: p_lay LIKE disvariant-variant.
SELECTION-SCREEN SKIP.
PARAMETERS: p_save1 RADIOBUTTON GROUP rgDEFAULT 'X',
???????????p_save2 RADIOBUTTON GROUP rg,
???????????p_save3 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.
??? CLASS-METHODS:f4_layout?????? "布局選項的搜索幫助
???????????????????EXPORTING value(layout)?? TYPE disvariant-variant,
??????????????????get_restrict??? "取得約束選項的值
????????????????????RETURNING value(restrict) TYPE salv_de_layout_restriction.
? PRIVATE SECTION.
??? DATA: gr_table TYPE REF TOcl_salv_table.
ENDCLASS.???????????????????"lcl_alv DEFINITION
?
*----------------------------------------------------------------------*
*??????CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*??????ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA: lr_functions?TYPE REF TO cl_salv_functions_list,
?????????lr_selections TYPE REF TO cl_salv_selections,
?????????lr_layout???? TYPE REF TO cl_salv_layout,
?????????ls_key??????? TYPE salv_s_layout_key,
?????????l_restrict??? TYPE salv_de_layout_restriction.
?
??? l_restrict =lcl_alv=>get_restrict( ).
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
??? "設置布局功能按鈕
??? ls_key-report = sy-repid.
??? lr_layout =gr_table->get_layout( ).
??? lr_layout->set_key(ls_key ).
???lr_layout->set_save_restriction( l_restrict ).
??? lr_layout->set_default('X' ).
??? IF p_lay IS NOT INITIAL.
?????lr_layout->set_initial_layout( p_lay ).
??? ENDIF.
??? "顯示ALV的標準功能
??? lr_functions =gr_table->get_functions( ).
??? lr_functions->set_all('X' ).
??? "
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
?
*前臺布局選項搜索幫助
? METHOD f4_layout.
??? DATA: ls_layout TYPEsalv_s_layout_info,
?????????ls_key??? TYPE salv_s_layout_key,
?????????l_restrict TYPE salv_de_layout_restriction.
?
??? l_restrict = get_restrict().
?
??? ls_key-report = sy-repid.
?
??? ls_layout =cl_salv_layout_service=>f4_layouts(
?????s_key??? = ls_key
????? restrict =l_restrict ).
?
??? layout = ls_layout-layout.
?ENDMETHOD.???????????????????????????????????????????????"f4_layout
?
*取得約束選項的值
? METHOD get_restrict.
??? CASE 'X'.
????? WHEN p_save1.
???????restrict = if_salv_c_layout=>restrict_none.
????? WHEN p_save2.
???????restrict = if_salv_c_layout=>restrict_user_dependant.
????? WHEN p_save3.
???????restrict = if_salv_c_layout=>restrict_user_independant.
??? ENDCASE.
? ENDMETHOD.???????????????????"constructor
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
*&---------------------------------------------------------------------*
*&?????Form? f_main
*&---------------------------------------------------------------------*
*??????整合數據,執行
*----------------------------------------------------------------------*
FORM f_main.
? DATA: lt_tab TYPE ty_spfli,
???????lr_alv TYPE REF TO lcl_alv.
?
? CREATE OBJECT lr_alv.
?
? "取得要顯示的數據
? lt_tab = lr_alv->getdata( ).
?
? lr_alv->alv_full( lt_tab ).
ENDFORM.???????????????????"f_main
?
*布局搜索幫助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lay.
? CALL METHOD lcl_alv=>f4_layout
??? IMPORTING
????? layout = p_lay.
?
*執行動作
START-OF-SELECTION.
? PERFORM f_main.
九、?????ALV的事件
SAP的一個類cl_salv_events_table提供了幾個常用的事件,包括鏈接點擊,雙擊,功能觸發之前和觸發之后,頁眉頁腳(其中頁眉頁腳暫時測試不成功,以后再試)。跟其他事件相比,類CL_SALV_EVENTS_TABLE提供了這幾個常用的事件已經和ALV結合在一起,所以我們只要實現這幾個事件的處理方法就可以了。
?首先我們要定義好事件的處理方法。
CLASS-METHODS: on_user_command FOR EVENTadded_function OF cl_salv_events_table
?????????????????????IMPORTING e_salv_function,
??????????????????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,
??????????????????on_before_salv_function FOR EVENT before_salv_function OF cl_salv_events_table
??????????????????????IMPORTING e_salv_function,
??????????????????on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events_table
??????????????????????IMPORTING e_salv_function.
2.??????實現事件的處理方法。
*單擊新增功能按鈕事件處理方法
? METHODon_user_command.
???CONCATENATE 'Function Code is '
???????????????e_salv_function
??????????INTO g_string SEPARATED BY space.
???MESSAGE i000(0k) WITH g_string.
?ENDMETHOD.???????????????????"on_user_command
?
*雙擊事件處理方法
? METHODon_double_click.
???g_string = row.
???CONCATENATE 'DOUBLE CLICK'
???????????????'ROW'
???????????????g_string
???????????????'COLUMN'
???????????????column
??????????INTO g_string SEPARATED BY space.
???MESSAGE i000(0k) WITH g_string.
?ENDMETHOD.???????????????????"on_double_click
?
*單擊事件處理方法
? METHODon_link_click.
???g_string = row.
???CONCATENATE 'LICK CLICK'
???????????????'ROW'
???????????????g_string
???????????????'COLUMN'
???????????????column
??????????INTO g_string SEPARATED BY space.
???MESSAGE i000(0k) WITH g_string.
?ENDMETHOD.???????????????????"on_link_click
?
*觸發事件之前
? METHODon_before_salv_function.
???CONCATENATE 'Before Function '
???????????????e_salv_function
??????????INTO g_string SEPARATED BY space.
???MESSAGE i000(0k) WITH g_string.
?ENDMETHOD.???????????????????"on_before_salv_function
?
*觸發事件之后
? METHODon_after_salv_function.
???CONCATENATE 'After Function '
???????????????e_salv_function
??????????INTO g_string SEPARATED BY space.
???MESSAGE i000(0k) WITH g_string.
?ENDMETHOD.???????????????????"on_after_salv_function
3.??????取得ALV事件的實例
lr_events = gr_table->get_event( ).
4.??????注冊事件的處理方法
SET HANDLER lcl_handle_events=>on_user_commandFOR lr_events.
??? SET HANDLERlcl_handle_events=>on_double_click FOR lr_events.
??? SET HANDLERlcl_handle_events=>on_link_click FOR lr_events.
??? SET HANDLERlcl_handle_events=>on_before_salv_function FOR lr_events.
??? SET HANDLER lcl_handle_events=>on_after_salv_functionFOR lr_events.
下面是效果圖
下面是程序的所有代碼:
REPORT? y_xin_002.
?
INCLUDE <icon>.
?
*變量定義
TYPES: BEGIN OF gs_spfli,
???????mandt?????? TYPE spfli-mandt,
???????carrid????? TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
??????? countryto??TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime????? TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
???????period????? TYPE spfli-period,
???????hotspot???? TYPE icon_d,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
*----------------------------------------------------------------------*
*??????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_table
???????????????????IMPORTING e_salv_function,
??????????????????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,
??????????????????on_before_salv_functionFOR EVENT before_salv_function OF cl_salv_events_table
???????????????????IMPORTING e_salv_function,
??????????????????on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events_table
???????????????????IMPORTING e_salv_function.
? PRIVATE SECTION.
??? CLASS-DATA: g_string TYPEstring.
ENDCLASS.???????????????????"lcl_handle_events DEFINITION
?
*----------------------------------------------------------------------*
*??????CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*??????事件操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
?
*單擊新增功能按鈕事件處理方法
? METHOD on_user_command.
??? CONCATENATE 'Function Codeis '
???????????????e_salv_function
??????????INTO g_string SEPARATED BY space.
??? MESSAGE i000(0k) WITHg_string.
?ENDMETHOD.???????????????????"on_user_command
?
*雙擊事件處理方法
? METHOD on_double_click.
??? g_string = row.
??? CONCATENATE 'DOUBLE CLICK'
???????????????'ROW'
???????????????g_string
???????????????'COLUMN'
???????????????column
??????????INTO g_string SEPARATED BY space.
??? MESSAGE i000(0k) WITHg_string.
?ENDMETHOD.???????????????????"on_double_click
?
*單擊事件處理方法
? METHOD on_link_click.
??? g_string = row.
??? CONCATENATE 'LICK CLICK'
???????????????'ROW'
???????????????g_string
???????????????'COLUMN'
???????????????column
??????????INTO g_string SEPARATED BY space.
??? MESSAGE i000(0k) WITHg_string.
?ENDMETHOD.???????????????????"on_link_click
?
*觸發事件之前
? METHOD on_before_salv_function.
??? CONCATENATE 'Before Function'
???????????????e_salv_function
??????????INTO g_string SEPARATED BY space.
??? MESSAGE i000(0k) WITHg_string.
?ENDMETHOD.???????????????????"on_before_salv_function
?
*觸發事件之后
? METHOD on_after_salv_function.
??? CONCATENATE 'After Function'
???????????????e_salv_function
??????????INTO g_string SEPARATED BY space.
??? MESSAGE i000(0k) WITHg_string.
?ENDMETHOD.???????????????????"on_after_salv_function
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.
? PRIVATE SECTION.
??? DATA: gr_table TYPE REF TOcl_salv_table.
ENDCLASS.???????????????????"lcl_alv DEFINITION
?
*----------------------------------------------------------------------*
*??????CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*??????ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?
??? FIELD-SYMBOLS<fs_spfli> TYPE gs_spfli.
??? LOOP AT lt_tab ASSIGNING<fs_spfli>.
?????<fs_spfli>-hotspot = icon_overview.
??? ENDLOOP.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA: lr_functions?TYPE REF TO cl_salv_functions_list,
?????????lr_events???? TYPE REF TO cl_salv_events_table,
?????????lr_columns??? TYPE REF TO cl_salv_columns_table,
?????????lr_column???? TYPE REF TO cl_salv_column_table,
?????????lr_content??? TYPE REF TO cl_salv_form_element.
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
??? "設置GUI Status
??? gr_table->set_screen_status(
????? report =sy-repid
????? pfstatus ='SALV_STANDARD'
????? set_functions =gr_table->c_functions_all
??? ).
??? "設置熱點
??? lr_columns =gr_table->get_columns( ).
??? TRY.
???????lr_column ?= lr_columns->get_column( 'HOTSPOT' ).
???????lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
???????lr_column->set_long_text( 'HOTSPOT' ).
????? CATCHcx_salv_not_found.
??? ENDTRY.
??? "注冊事件
??? lr_events =gr_table->get_event( ).
??? SET HANDLERlcl_handle_events=>on_user_command FOR lr_events.
??? SET HANDLERlcl_handle_events=>on_double_click FOR lr_events.
??? SET HANDLERlcl_handle_events=>on_link_click FOR lr_events.
??? SET HANDLERlcl_handle_events=>on_before_salv_function FOR lr_events.
??? SET HANDLERlcl_handle_events=>on_after_salv_function FOR lr_events.
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
*&---------------------------------------------------------------------*
*&?????Form? f_main
*&---------------------------------------------------------------------*
*??????整合數據,執行
*----------------------------------------------------------------------*
FORM f_main.
? DATA: lt_tab TYPE ty_spfli,
???????lr_alv TYPE REF TO lcl_alv.
?
? CREATE OBJECT lr_alv.
?
? "取得要顯示的數據
? lt_tab = lr_alv->getdata( ).
?
? lr_alv->alv_full( lt_tab ).
ENDFORM.???????????????????"f_main
?
*執行動作
START-OF-SELECTION.
? PERFORM f_main.
十、????? ALV的頁眉頁腳
除了可以通過類CL_SALV_EVENTS_TABLE的事件設置ALV的頁眉頁腳之外,還可以通過類CL_SALV_TABLE的方法SET_TOP_OF_LIST,SET_TOP_OF_LIST_PRINT,
SET_END_OF_LIST,SET_END_OF_LIST_PRINT這四個方法。頁眉頁腳的顯示可以設置顯示和打印時不一樣,打印時的頁眉頁腳通過方法SET_TOP_OF_LIST_PRINT和SET_END_OF_LIST_PRINT。
聲明設置頁眉頁腳所需要的Layout的實例和變量。
DATA:lr_grid?????? TYPE REF TOcl_salv_form_layout_grid,
??????lr_grid2????? TYPE REF TO cl_salv_form_layout_grid,
??????lr_text?????? TYPE REF TO cl_salv_form_text,
??????lr_action???? TYPE REF TO cl_salv_form_action_info,
??????lr_header???? TYPE REF TO cl_salv_form_header_info,
??lr_label????? TYPE REF TO cl_salv_form_label.
2.??????添加頁眉頁腳所需要的文本到Layout里。
?? lr_header = lr_grid->create_header_information(
????? row = 1
????? column = 1
????? text = 'HeaderInformation'
??? ).
??? lr_label = lr_grid->create_label(
????? row = 2
????? column = 1
????? text = 'Label'
??? ).
??? lr_action =lr_grid->create_action_information(
????? row = 3
????? column = 1
????? text = 'ActionInformation'
??? ).
??? lr_text =lr_grid->create_text(
????? text = 'text'
????? row = 4
????? column = 1
??? ).
???gr_table->set_top_of_list( lr_grid ).
??? lr_text =lr_grid2->create_text(
????? text = 'end ofpage'
????? row = 1
????? column = 1
??? ).
3.??????使用方法SET_TOP_OF_LIST設置頁眉
gr_table->set_top_of_list( lr_grid ).
下面是效果圖
?
下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES: BEGIN OF gs_spfli,
???????mandt?????? TYPE spfli-mandt,
??????? carrid?????TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
???????countryto?? TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime? ????TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
???????period????? TYPE spfli-period,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
*----------------------------------------------------------------------*
*??????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.
? PRIVATE SECTION.
??? DATA: gr_table TYPE REF TOcl_salv_table.
ENDCLASS.???????????????????"lcl_alv DEFINITION
?
*----------------------------------------------------------------------*
*?????? CLASSlcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*?????? ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA: lr_functions?TYPE REF TO cl_salv_functions_list,
?????????lr_grid?????? TYPE REF TOcl_salv_form_layout_grid,
?????????lr_grid2????? TYPE REF TO cl_salv_form_layout_grid,
?????????lr_text?????? TYPE REF TO cl_salv_form_text,
?????????lr_action???? TYPE REF TO cl_salv_form_action_info,
?????????lr_header???? TYPE REF TO cl_salv_form_header_info,
?????????lr_label????? TYPEREF TO cl_salv_form_label.
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
??? "ALV標準功能
??? lr_functions =gr_table->get_functions( ).
??? lr_functions->set_all('X' ).
??? "頁眉頁腳
??? CREATE OBJECT:lr_grid,lr_grid2.
??? lr_header =lr_grid->create_header_information(
????? row = 1
????? column = 1
????? text = 'HeaderInformation'
??? ).
??? lr_label =lr_grid->create_label(
????? row = 2
????? column = 1
????? text = 'Label'
??? ).
??? lr_action =lr_grid->create_action_information(
????? row = 3
????? column = 1
????? text = 'ActionInformation'
??? ).
??? lr_text =lr_grid->create_text(
????? text = 'text'
????? row = 4
????? column = 1
??? ).
???gr_table->set_top_of_list( lr_grid ).
??? lr_text =lr_grid2->create_text(
????? text = 'end ofpage'
????? row = 1
????? column = 1
??? ).
???gr_table->set_end_of_list( lr_grid2 ).
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
*&---------------------------------------------------------------------*
*&?????Form? f_main
*&---------------------------------------------------------------------*
*??????整合數據,執行
*----------------------------------------------------------------------*
FORM f_main.
? DATA: lt_tab TYPE ty_spfli,
???????lr_alv TYPE REF TO lcl_alv.
?
? CREATE OBJECT lr_alv.
?
? "取得要顯示的數據
? lt_tab = lr_alv->getdata( ).
?
? lr_alv->alv_full( lt_tab ).
ENDFORM.???????????????????"f_main
?
*執行動作
START-OF-SELECTION.
? PERFORM f_main.
十一、???????ALV的聚合,排序,過濾
在ALV提供的標準工具欄上我們可以實現輸出結果的聚合(最大值,最小值,匯總,平均數),排序,過濾功能,同樣在程序里也可以達到這些功能。
聲明聚合,排序,過濾所需要的變量。
DATA: lr_aggregations TYPE REF TOcl_salv_aggregations,
??????lr_filters????? ?TYPE REF TO cl_salv_filters,
lr_sorts?????????type ref to cl_salv_sorts.
2.??????匯總
?? lr_aggregations->add_aggregation(
?????????columnname = 'DISTANCE'
?????????aggregation = if_salv_c_aggregation=>total
??????? ).
3.????最小值
lr_aggregations->add_aggregation(
?????????columnname = 'FLTIME'
?????????aggregation = if_salv_c_aggregation=>minimum
??? ).
4.??過濾
lr_filters->add_filter(
?????????columnname = 'CITYFROM'
?????????sign = 'I'
?????????option = 'NE'
?????????low = 'ROM'
?????????high = ''
).
5.??????排序
lr_sorts->add_sort(
?????????columnname = 'CITYFROM'
?????????sequence = if_salv_c_sort=>sort_down
?????????subtotal = 'X'
?????????obligatory = 'X'
).
?下面是效果圖
?
?下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES: BEGIN OF gs_spfli,
???????mandt?????? TYPE spfli-mandt,
???????carrid????? TYPE spfli-carrid,
???????connid????? TYPE spfli-connid,
???????countryfr?? TYPE spfli-countryfr,
???????cityfrom??? TYPE spfli-cityfrom,
???????airpfrom??? TYPE spfli-airpfrom,
???????countryto?? TYPE spfli-countryto,
???????cityto????? TYPE spfli-cityto,
???????airpto????? TYPE spfli-airpto,
???????fltime????? TYPE spfli-fltime,
???????deptime???? TYPE spfli-deptime,
???????arrtime???? TYPE spfli-arrtime,
???????distance??? TYPE spfli-distance,
???????distid????? TYPE spfli-distid,
???????fltype????? TYPE spfli-fltype,
???????period????? TYPEspfli-period,
END OF gs_spfli.
TYPES? ty_spfli TYPE gs_spfli OCCURS 0.
?
*----------------------------------------------------------------------*
*??????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.
? PRIVATE SECTION.
??? DATA: gr_table TYPE REF TOcl_salv_table.
ENDCLASS.???????????????????"lcl_alv DEFINITION
?
*----------------------------------------------------------------------*
*??????CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*??????ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.
?ENDMETHOD.???????????????????"getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? DATA:lr_functions??? TYPE REF TO cl_salv_functions_list,
?????????lr_aggregations TYPE REF TO cl_salv_aggregations,
?????????lr_filters????? TYPE REF TO cl_salv_filters,
?????????lr_sorts??????? type ref to cl_salv_sorts.
?
??? "創建實例
??? TRY.
???????cl_salv_table=>factory(
?????????IMPORTING
???????????r_salv_table = gr_table
?????????CHANGING
???????????t_table????? = lt_tab
??????? ).
????? CATCHcx_salv_msg.
??? ENDTRY.
??? "ALV標準功能
??? lr_functions =gr_table->get_functions( ).
??? lr_functions->set_all('X' ).
?
??? lr_aggregations =gr_table->get_aggregations( ).
???lr_filters????? = gr_table->get_filters( ).
???lr_sorts??????? = gr_table->get_sorts( ).
??? TRY.
???????"匯總
???????lr_aggregations->add_aggregation(
?????????columnname = 'DISTANCE'
?????????aggregation = if_salv_c_aggregation=>total
??????? ).
???????"最小值
???????lr_aggregations->add_aggregation(
?????????columnname = 'FLTIME'
?????????aggregation = if_salv_c_aggregation=>minimum
??????? ).
???????"過濾
???????lr_filters->add_filter(
?????????columnname = 'CITYFROM'
?????????sign = 'I'
?????????option = 'NE'
?????????low = 'ROM'
?????????high = ''
??????? ).
???????"排序
???????lr_sorts->add_sort(
?????????columnname = 'CITYFROM'
?????????sequence = if_salv_c_sort=>sort_down
?????????subtotal = 'X'
?????????obligatory = 'X'
??????? ).
????? CATCHcx_salv_data_error.
????? CATCHcx_salv_existing.
????? CATCH cx_salv_not_found.
??? ENDTRY.
?
??? "顯示列表
??? gr_table->display( ).
?ENDMETHOD.???????????????????"alv_full
ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION
?
?
*&---------------------------------------------------------------------*
*&?????Form? f_main
*&---------------------------------------------------------------------*
*??????整合數據,執行
*----------------------------------------------------------------------*
FORM f_main.
? DATA: lt_tab TYPE ty_spfli,
???????lr_alv TYPE REF TO lcl_alv.
?
? CREATE OBJECT lr_alv.
?
? "取得要顯示的數據
? lt_tab = lr_alv->getdata( ).
?
? lr_alv->alv_full( lt_tab ).
ENDFORM.???????????????????"f_main
?
*執行動作
START-OF-SELECTION.
? PERFORM f_main.
?
?[likai1]這他媽的什么玩藝兒啊?
總結
- 上一篇: SAP 解决长时间不操作掉线问题
- 下一篇: ABAP实例:如何生成年月的输入帮助