日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OO实现ALV

發(fā)布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OO实现ALV 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、????? 最簡單的ALV顯示

以前都是通過函數(shù)“REUSE_ALV_GRID_DISPLAY”來顯示列表,這種方式是面向過程的,現(xiàn)在有另外一種面向?qū)ο蠡姆绞絹盹@示列表,函數(shù)REUSE_ALV_GRID_DISPLAY可以做到的它也能夠做到。它主要是通過一個類CL_SALV_TABLE來實現(xiàn)的.

下面讓我們來實現(xiàn)最簡單的ALV列表。

1取得要顯示的數(shù)據(jù)。

SELECT * INTO TABLE lt_tab FROM spfli

2.調(diào)用類CL_SALV_TABLE的靜態(tài)方法Factory()創(chuàng)建類的實例。

TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = lr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

?3.取得實例之后再調(diào)用方法Display()顯示列表.

??????lr_table->display( ).

?處理過程完成,最后讓我們看一下顯示結(jié)果。

?

下面是報表的所有源代碼:

REPORT? y_xin_002.

?

*變量定義

TYPES ty_spfli TYPE spfli OCCURS 0.

?

*----------------------------------------------------------------------*

*??????CLASS lcl_alv DEFINITION

*----------------------------------------------------------------------*

*??????ALV操作類(定義)

*----------------------------------------------------------------------*

CLASS lcl_alv DEFINITION.

? PUBLIC SECTION.

??? METHODS:getdata???????? "取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHOD getdata.

??? SELECT * INTO TABLE lt_tabFROM spfli.

? ENDMETHOD.???????????????????"getdata

?

*ALV處理方法

? METHOD alv_process.

??? "創(chuàng)建實例

??? 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

?

*主方法,整合數(shù)據(jù)

? METHOD main.

??? DATA: lt_tab TYPE TABLE OFspfli.

?

??? "取得要顯示的數(shù)據(jù)

??? lt_tab = me->getdata( ).

??? "處理數(shù)據(jù)

??? me->alv_process( lt_tab).

? ENDMETHOD.???????????????????"main

ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION

?

*報表執(zhí)行

start-of-selection.

? data? lr_alv?? type refto lcl_alv.

? create object lr_alv.

? lr_alv->main( ).

關(guān)于ALV的最全文檔可以參考SAP Help

http://help.sap.com/saphelp_nw70/helpdata/EN/5e/88d440e14f8431e10000000a1550b0/content.htm

?

二、????? ALV顯示的三種形式

一般的ALV有三種顯示形式,分別為

一、普通的List

?二、全屏的Grid

?三、在自定義屏幕的顯示的Grid

跟以往實現(xiàn)這三種ALV顯示方式相比,以往的三種顯示方式分別是調(diào)用不同的Function和Class,實現(xiàn)方式復(fù)雜。現(xiàn)在這三種顯示方式可以通過一個類(CL_SALV_TABLE)來實現(xiàn),而且通過這個類和它的子類可以更加容易的實現(xiàn)ALV的功能,比如:排序,總計,過濾,頁眉頁腳,單擊雙擊事件等。

下面讓我們一步一步地來實現(xiàn)這三種顯示形式。

1.首先我們先創(chuàng)建選擇屏幕,屏幕有三個選項,三個選項分別為三種顯示方式。

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取得要顯示的數(shù)據(jù)。

SELECT * INTO TABLE lt_tab FROM spfli

3.判斷選擇屏幕的選項創(chuàng)建不同的實例。

?? 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.當(dāng)用戶選擇第一個選項,列表輸出為全屏的網(wǎng)格列表,執(zhí)行方法alv_full( )。

METHOD alv_full.

???"創(chuàng)建實例

??? 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.當(dāng)用戶選擇第二個選項,列表輸出為普通的列表,執(zhí)行方法alv_list( ).alv_list方法跟alv_full方法不同的是在創(chuàng)建實例的時候多了一個選項list_display = ‘X’.

? METHOD alv_list.

???"創(chuàng)建實例

??? 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.當(dāng)用戶選擇第三個選項,列表在自定義屏幕上輸出網(wǎng)格列表,執(zhí)行方法alv_grid( ).方法alv_grid()調(diào)用了屏幕100。執(zhí)行屏幕的時候會執(zhí)行它的PBO和PAI,也就是會執(zhí)行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.

? "創(chuàng)建容器實例

? IFcl_salv_table=>is_offline( ) = ''.

???CREATE OBJECT lr_container

?????EXPORTING

???????container_name = 'CONTAINER'.

? ENDIF.

? "創(chuàng)建類LCL_ALV實例

? CREATEOBJECT lr_alv2.

? "取得列表數(shù)據(jù)

? lt_tab= lr_alv2->getdata( ).

? "創(chuàng)建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( ).

? "釋放內(nèi)存

? FREElt_tab.

下面是程序的所有代碼:

REPORT?y_xin_002.

?

*變量定義

TYPES ty_spfli TYPE spfli OCCURS 0.

DATA: gr_table???? TYPE REF TO cl_salv_table.

?

*選擇屏幕設(shè)計

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???????? "取得要顯示的數(shù)據(jù)

??????????????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操作類實現(xiàn)

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHODgetdata.

???SELECT * INTO TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

??METHOD alv_full.

???"創(chuàng)建實例

??? 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.

???"創(chuàng)建實例

??? 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

?

*主方法整合數(shù)據(jù)

? METHODmain.

??? DATA:lt_tab TYPE TABLE OF spfli.

?

???"取得要顯示的數(shù)據(jù)

??? lt_tab= me->getdata( ).

?

???"判斷選擇屏幕的選擇條件調(diào)用不同的方法

??? 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 屏幕輸出前執(zhí)行

*----------------------------------------------------------------------*

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.

? "創(chuàng)建容器實例

? IFcl_salv_table=>is_offline( ) = ''.

??? CREATEOBJECT lr_container

?????EXPORTING

???????container_name = 'CONTAINER'.

? ENDIF.

? "創(chuàng)建類LCL_ALV實例

? CREATE OBJECT lr_alv2.

? "取得列表數(shù)據(jù)

? lt_tab= lr_alv2->getdata( ).

? "創(chuàng)建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( ).

? "釋放內(nèi)存

? FREElt_tab.

ENDMODULE.??????????????????? "status_0100

?

*----------------------------------------------------------------------*

*? MODULE user_command_0100

*----------------------------------------------------------------------*

*? PAI 屏幕輸出后的動作

*----------------------------------------------------------------------*

MODULE user_command_0100 INPUT.

ENDMODULE.??????????????????? "user_command_0100

?

*報表執(zhí)行

START-OF-SELECTION.

?DATA? lr_alv?? TYPE REF TO lcl_alv.

? CREATEOBJECT lr_alv.

?lr_alv->main( ).

三、????? ALV的功能設(shè)計

細心的讀者肯定已經(jīng)注意前面的兩個例子少了點什么,少了ALV提供的標(biāo)準(zhǔn)功能,比如排序,過濾,匯總,等,以及用戶可以在ALV的功能欄上加上自己自定義的功能按鈕。

?ALV的標(biāo)準(zhǔn)功能可以通過類CL_SALV_FUNCTIONS和CL_SALV_FUNCTION來設(shè)計,通過這兩個類你可以對ALV提供的標(biāo)準(zhǔn)功能可見或不可見。也可以自己創(chuàng)建GUI STATUS設(shè)置自己的ALV功能,通過GUI STATUS來設(shè)置ALV的功能是通過類CL_SALV_TABLE的方法SET_SCREEN_STATUS來實現(xiàn)的。

1.首先我們要取得類CL_SALV_FUNCTIONS的實例,根據(jù)類CL_SALV_TABLE的方法get_functions可以取得功能實例。

lr_functions = gr_table->get_functions( ).

???lr_functions->set_all( 'X' ).

2根據(jù)類CL_SALV_TABLE的方法設(shè)置功能欄。

gr_table->set_screen_status(

???pfstatus????? =? 'SALV_STANDARD'

??? report??????? =?sy-repid

???set_functions = gr_table->c_functions_all ).

3.自定義功能的實現(xiàn)。ALV的自定義功能的實現(xiàn)動作要通過類的事件來處理。

????????首先定義事件的操作類

??? 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

????????實現(xiàn)事件的操作類

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

*----------------------------------------------------------------------*

*?????? 事件處理類實現(xiàn)

*----------------------------------------------------------------------*

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???????? "取得要顯示的數(shù)據(jù)

??????????????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操作類實現(xiàn)

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHODgetdata.

???SELECT * INTO TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? METHODalv_full.

??? DATA:lr_functions TYPE REF TO cl_salv_functions,

?????????lr_events??? TYPE REF TOcl_salv_events.

?

???"創(chuàng)建實例

??? 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( ).

?

??? "設(shè)置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

?

*主方法整合數(shù)據(jù)

? METHODmain.

??? DATA:lt_tab TYPE TABLE OF spfli.

?

??? "取得要顯示的數(shù)據(jù)

??? lt_tab = me->getdata( ).

?

??? me->alv_full( lt_tab ).

? ENDMETHOD.??????????????????? "main

ENDCLASS.??????????????????? "lcl_alvIMPLEMENTATION

?

*報表執(zhí)行

START-OF-SELECTION.

?DATA? lr_alv?? TYPE REF TO lcl_alv.

? CREATEOBJECT lr_alv.

?lr_alv->main( ).

?

?

四、????? ALV的顯示樣式

通過類CL_SALV_DISPLAY_SETTINGS我們可以設(shè)置ALV的顯示樣式,主要包括ALV表頭名稱,列表顏色間隔顯示,水平線是否顯示,豎線是否顯示等。

1.首先我們要取得類CL_SALV_DISPLAY_SETTINGS的實例,根據(jù)類CL_SALV_TABLE的方法get_display_settings可以取得顯示樣式的實例。

lr_display = gr_table->get_display_settings().

2然后通過類CL_SALV_DISPLAY_SETTINGS的方法設(shè)置顯示屬性。

lr_display = gr_table->get_display_settings().

???lr_display->set_striped_pattern( 'X' ). "設(shè)置顏色間隔顯示

???lr_display->set_list_header( 'Xin''s ALV' ). "設(shè)置ALV的抬頭

???lr_display->set_horizontal_lines( '' ).? "設(shè)置水平線是否顯示

???lr_display->set_vertical_lines( '' ).??? "設(shè)置垂直線是否顯示

下面是效果圖

?下面是程序的所有代碼:

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???????? "取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHODgetdata.

???SELECT * INTO TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? METHODalv_full.

??? DATA:lr_functions TYPE REF TO cl_salv_functions,

????????? lr_display?? TYPE REF TO cl_salv_display_settings.

??? databoolean type c.

?

???"創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

???????).

?????CATCH cx_salv_msg.

???ENDTRY.

?

??? "顯示ALV的標(biāo)準(zhǔn)功能

??? lr_functions = gr_table->get_functions().

???lr_functions->set_all( 'X' ).

?

??? "設(shè)置ALV的顯示樣式

???lr_display = gr_table->get_display_settings( ).

???lr_display->set_striped_pattern( 'X' ). "設(shè)置顏色間隔顯示

???lr_display->set_list_header( 'Xin''s ALV' ). "設(shè)置ALV的抬頭

???lr_display->set_horizontal_lines( '' ).? "設(shè)置水平線是否顯示

???lr_display->set_vertical_lines( '' ).??? "設(shè)置垂直線是否顯示

?

??? "顯示列表

??? gr_table->display().

?ENDMETHOD.???????????????????"alv_full

?

*主方法整合數(shù)據(jù)

? METHODmain.

??? DATA:lt_tab TYPE TABLE OF spfli.

?

???"取得要顯示的數(shù)據(jù)

???lt_tab = me->getdata( ).

?

???me->alv_full( lt_tab ).

?ENDMETHOD.???????????????????"main

ENDCLASS.??????????????????? "lcl_alvIMPLEMENTATION

?

*報表執(zhí)行

START-OF-SELECTION.

? DATA? lr_alv??TYPE REF TO lcl_alv.

? CREATEOBJECT lr_alv.

?lr_alv->main( ).

?

五、????? ALV的欄位屬性

ALV的欄位屬性是SAP提供的ALV功能的比較重要的一個,詳細的功能包括異常狀態(tài)圖標(biāo)、圖標(biāo)、符號、復(fù)選框、按鈕、熱點、超鏈接、單元格類型、單元格顏色、某一欄位顏色、某一行顏色,欄位隱藏等等。ALV的欄位功能主要是通過CL_SALV_COLUMN_TABLE和CL_SALV_COLUMNS_TABLE這兩個類的實現(xiàn)的。

?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的實例,取指定的欄位的實例之后,你就可以對這個欄位的相關(guān)屬性進行設(shè)置。

DATA? lr_columnTYPE REF TO cl_salv_column_table

lr_column? ?= lr_columns->get_column('MANDT' ).

?2.?????取得指定的欄位的實例之后,在這個實例的基礎(chǔ)上進行相關(guān)的屬性設(shè)置。

a)???????? 異常狀態(tài)圖標(biāo)

lr_columns->set_exception_column('EXCEPTION' ).

?????? lr_column?= lr_columns->get_column( 'EXCEPTION' ).

lr_column->set_short_text( 'except' ).

b)????圖標(biāo)

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)?????復(fù)選框

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)?設(shè)置欄位顯示長度最優(yōu)化

lr_columns->set_optimize( 'X' ).

k)?設(shè)置標(biāo)題欄是否可見

lr_columns->set_headers_visible( 'X' )

?注:上面的所有欄位屬性設(shè)置都要需要在相應(yīng)的內(nèi)表字段設(shè)置相關(guān)的值,設(shè)置是否可見除外。

?下面是效果圖

?

下面是程序的所有代碼:

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???????? "取得要顯示的數(shù)據(jù)

??????????????RETURNING value(lt_tab) TYPE ty_spfli,

????????????alv_full??????? "全屏Grid列表處理方法

??????????????IMPORTING value(lt_tab) TYPE ty_spfli,

????????????column_setting, "設(shè)置字段屬性

????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? 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.

?

??? "循環(huán),為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

?

*輸出全屏網(wǎng)格列表的方法

? METHOD alv_full.

??? DATA: lr_functions TYPE REF TOcl_salv_functions.

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCH cx_salv_msg.

??? ENDTRY.

?

??? "顯示ALV的標(biāo)準(zhǔn)功能

??? lr_functions =gr_table->get_functions( ).

??? lr_functions->set_all( 'X' ).

?

??? "設(shè)置欄位屬性

??? me->column_setting( ).

?

??? "顯示列表

??? gr_table->display( ).

?ENDMETHOD.???????????????????"alv_full

?

*設(shè)置字段屬性

? 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' ).?? "設(shè)置標(biāo)題欄是否可見

??? lr_functional_settings =gr_table->get_functional_settings( ).

?

??? TRY.

??????? "設(shè)置欄位不可見

???????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( '' ).

??????? "設(shè)置異常欄位

???????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' ).

??????? "設(shè)置圖標(biāo)欄位

???????lr_column ?= lr_columns->get_column( 'ICON' ).

???????lr_column->set_icon( 'X' ).

???????lr_column->set_long_text( 'ICON' ).

??????? "設(shè)置符號欄位

???????lr_column ?= lr_columns->get_column( 'SYMBOL' ).

??????? lr_column->set_symbol('X' ).

???????lr_column->set_long_text( 'SYMBOL' ).

??????? "設(shè)置復(fù)選框欄位

???????lr_column ?= lr_columns->get_column( 'CHECKBOX' ).

???????lr_column->set_cell_type( if_salv_c_cell_type=>checkbox ).

???????lr_column->set_long_text( 'CHECKBOX' ).

??????? "設(shè)置熱點

???????lr_column ?= lr_columns->get_column( 'HOTSPOT' ).

???????lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

???????lr_column->set_long_text( 'HOTSPOT' ).

??????? "設(shè)置超鏈接

???????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.

??????? "設(shè)置欄位顏色

???????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 ).

??????? "設(shè)置行顏色

???????lr_columns->set_color_column( 'T_COLOR' ).

????? CATCHcx_salv_not_found.

????? CATCHcx_salv_data_error.

????? CATCHcx_salv_existing.

??? ENDTRY.

?

?ENDMETHOD.???????????????????"column_setting

?

*主方法,整合數(shù)據(jù)

? METHOD main.

??? DATA: lt_tab TYPE ty_spfli.

?

??? "取得要顯示的數(shù)據(jù)

??? lt_tab = me->getdata( ).

?

??? me->alv_full( lt_tab ).

?ENDMETHOD.???????????????????"main

ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION

?

?

*報表執(zhí)行

START-OF-SELECTION.

? DATA? lr_alv?? TYPE REF TOlcl_alv.

? CREATE OBJECT lr_alv.

? lr_alv->main( ).

六、????? ALV的彈出窗口形式

前面的例子ALV列表都是直接輸出在主窗口中,下面我們實現(xiàn)在彈出窗口中實現(xiàn)ALV。在彈出窗口中實現(xiàn)ALV也很簡單,只要在實現(xiàn)類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.

?

*設(shè)置屏幕

SELECTION-SCREEN PUSHBUTTON 2(20) btnUSER-COMMAND clk.

?

INITIALIZATION.

? btn = '點擊顯示彈出alv窗口'.

?

*----------------------------------------------------------------------*

*?????? CLASSlcl_alv DEFINITION

*----------------------------------------------------------------------*

*??????ALV操作類(定義)

*----------------------------------------------------------------------*

CLASS lcl_alv DEFINITION.

? PUBLIC SECTION.

??? METHODS:getdata???????? "取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHOD getdata.

??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? METHOD alv_full.

??? DATA: lr_functions TYPE REFTO cl_salv_functions.

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

?

??? "顯示ALV的標(biāo)準(zhǔn)功能

??? lr_functions =gr_table->get_functions( ).

??? lr_functions->set_all('X' ).

?

??? "彈出窗口設(shè)置

???gr_table->set_screen_popup(

????? start_column = 1

?????end_column?? = 120

?????start_line?? = 1

?????end_line???? = 20 ).

?

??? "顯示列表

??? gr_table->display( ).

?ENDMETHOD.???????????????????"alv_full

?

*主方法,整合數(shù)據(jù)

? METHOD main.

??? DATA: lt_tab TYPE ty_spfli.

?

??? "取得要顯示的數(shù)據(jù)

??? lt_tab = me->getdata( ).

?

??? me->alv_full( lt_tab ).

?ENDMETHOD.???????????????????"main

ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION

?

*執(zhí)行按鈕點擊動作

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的輸出結(jié)果中,要對它的某一行、某一列或者某一單元格進行選定,我們通常的做法是把鼠標(biāo)直接點擊那一行或者是列就可以了,如果選擇多行或多列,在選擇的條件按住‘CTRL’鍵就可以了。這是手動選擇的方法,但是在實際情況中,有時候需要用程序來對輸出結(jié)果進行選擇。

?首先我們要取得類CL_SALV_SELECTIONS的實例。

DATA? lr_selectionsTYPE REF TO cl_salv_selections.

lr_selections = gr_table->get_selections( ).

2.??????設(shè)置選擇模式。

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???????? "取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHOD getdata.

??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? 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.

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

?

??? "顯示ALV的標(biāo)準(zhǔn)功能

??? lr_functions =gr_table->get_functions( ).

??? lr_functions->set_all('X' ).

?

??? "取得類CL_SALV_SELECTIONS的實例

??? lr_selections =gr_table->get_selections( ).

??? "設(shè)置選擇模式

???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

?

*主方法,整合數(shù)據(jù)

? METHOD main.

??? DATA: lt_tab TYPE ty_spfli.

?

??? "取得要顯示的數(shù)據(jù)

??? lt_tab = me->getdata( ).

?

??? me->alv_full( lt_tab ).

?ENDMETHOD.???????????????????"main

ENDCLASS.???????????????????"lcl_alv IMPLEMENTATION

?

*執(zhí)行動作

START-OF-SELECTION.

? DATA? lr_alv?? TYPE REFTO lcl_alv.

? CREATE OBJECT lr_alv.

? lr_alv->main( ).

八、????? ALV的布局功能

在ALV的輸出結(jié)果中,我們可以利用ALV提供的標(biāo)準(zhǔn)功能(過濾,排序,匯總)對輸出結(jié)果正行操作。比如說我們對一個結(jié)果進行了排序和過濾等的動作,下次再運行這個報表的時候可以選擇一個功能直接運行這些動作。這就需要布局(Layout)的功能了。

首先我們設(shè)置布局的功能按鈕。

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.??????設(shè)置前臺選項頁面。

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.??????設(shè)置前臺布局選項功能搜索幫助

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??????????????"取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHOD getdata.

??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? 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( ).

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

??? "設(shè)置布局功能按鈕

??? 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的標(biāo)準(zhǔn)功能

??? 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

*&---------------------------------------------------------------------*

*??????整合數(shù)據(jù),執(zhí)行

*----------------------------------------------------------------------*

FORM f_main.

? DATA: lt_tab TYPE ty_spfli,

???????lr_alv TYPE REF TO lcl_alv.

?

? CREATE OBJECT lr_alv.

?

? "取得要顯示的數(shù)據(jù)

? 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.

?

*執(zhí)行動作

START-OF-SELECTION.

? PERFORM f_main.

九、?????ALV的事件

SAP的一個類cl_salv_events_table提供了幾個常用的事件,包括鏈接點擊,雙擊,功能觸發(fā)之前和觸發(fā)之后,頁眉頁腳(其中頁眉頁腳暫時測試不成功,以后再試)。跟其他事件相比,類CL_SALV_EVENTS_TABLE提供了這幾個常用的事件已經(jīng)和ALV結(jié)合在一起,所以我們只要實現(xiàn)這幾個事件的處理方法就可以了。

?首先我們要定義好事件的處理方法。

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.??????實現(xiàn)事件的處理方法。

*單擊新增功能按鈕事件處理方法

? 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

?

*觸發(fā)事件之前

? 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

?

*觸發(fā)事件之后

? 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

*----------------------------------------------------------------------*

*??????事件操作類(實現(xiàn))

*----------------------------------------------------------------------*

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

?

*觸發(fā)事件之前

? 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

?

*觸發(fā)事件之后

? 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??????????????"取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? 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

?

*輸出全屏網(wǎng)格列表的方法

? 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.

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

??? "設(shè)置GUI Status

??? gr_table->set_screen_status(

????? report =sy-repid

????? pfstatus ='SALV_STANDARD'

????? set_functions =gr_table->c_functions_all

??? ).

??? "設(shè)置熱點

??? 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

*&---------------------------------------------------------------------*

*??????整合數(shù)據(jù),執(zhí)行

*----------------------------------------------------------------------*

FORM f_main.

? DATA: lt_tab TYPE ty_spfli,

???????lr_alv TYPE REF TO lcl_alv.

?

? CREATE OBJECT lr_alv.

?

? "取得要顯示的數(shù)據(jù)

? lt_tab = lr_alv->getdata( ).

?

? lr_alv->alv_full( lt_tab ).

ENDFORM.???????????????????"f_main

?

*執(zhí)行動作

START-OF-SELECTION.

? PERFORM f_main.

十、????? ALV的頁眉頁腳

除了可以通過類CL_SALV_EVENTS_TABLE的事件設(shè)置ALV的頁眉頁腳之外,還可以通過類CL_SALV_TABLE的方法SET_TOP_OF_LIST,SET_TOP_OF_LIST_PRINT,

SET_END_OF_LIST,SET_END_OF_LIST_PRINT這四個方法。頁眉頁腳的顯示可以設(shè)置顯示和打印時不一樣,打印時的頁眉頁腳通過方法SET_TOP_OF_LIST_PRINT和SET_END_OF_LIST_PRINT。

聲明設(shè)置頁眉頁腳所需要的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設(shè)置頁眉

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??????????????"取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHOD getdata.

??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? 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.

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

??? "ALV標(biāo)準(zhǔn)功能

??? 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

*&---------------------------------------------------------------------*

*??????整合數(shù)據(jù),執(zhí)行

*----------------------------------------------------------------------*

FORM f_main.

? DATA: lt_tab TYPE ty_spfli,

???????lr_alv TYPE REF TO lcl_alv.

?

? CREATE OBJECT lr_alv.

?

? "取得要顯示的數(shù)據(jù)

? lt_tab = lr_alv->getdata( ).

?

? lr_alv->alv_full( lt_tab ).

ENDFORM.???????????????????"f_main

?

*執(zhí)行動作

START-OF-SELECTION.

? PERFORM f_main.

十一、???????ALV的聚合,排序,過濾

在ALV提供的標(biāo)準(zhǔn)工具欄上我們可以實現(xiàn)輸出結(jié)果的聚合(最大值,最小值,匯總,平均數(shù)),排序,過濾功能,同樣在程序里也可以達到這些功能。

聲明聚合,排序,過濾所需要的變量。

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??????????????"取得要顯示的數(shù)據(jù)

??????????????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操作類(實現(xiàn))

*----------------------------------------------------------------------*

CLASS lcl_alv IMPLEMENTATION.

*取得要顯示的數(shù)據(jù)

? METHOD getdata.

??? SELECT * INTO CORRESPONDINGFIELDS OF TABLE lt_tab FROM spfli.

?ENDMETHOD.???????????????????"getdata

?

*輸出全屏網(wǎng)格列表的方法

? 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.

?

??? "創(chuàng)建實例

??? TRY.

???????cl_salv_table=>factory(

?????????IMPORTING

???????????r_salv_table = gr_table

?????????CHANGING

???????????t_table????? = lt_tab

??????? ).

????? CATCHcx_salv_msg.

??? ENDTRY.

??? "ALV標(biāo)準(zhǔn)功能

??? 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

*&---------------------------------------------------------------------*

*??????整合數(shù)據(jù),執(zhí)行

*----------------------------------------------------------------------*

FORM f_main.

? DATA: lt_tab TYPE ty_spfli,

???????lr_alv TYPE REF TO lcl_alv.

?

? CREATE OBJECT lr_alv.

?

? "取得要顯示的數(shù)據(jù)

? lt_tab = lr_alv->getdata( ).

?

? lr_alv->alv_full( lt_tab ).

ENDFORM.???????????????????"f_main

?

*執(zhí)行動作

START-OF-SELECTION.

? PERFORM f_main.

?


?[likai1]這他媽的什么玩藝兒啊?

總結(jié)

以上是生活随笔為你收集整理的OO实现ALV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。