OO实现ALV TABLE 二: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.
? "創建容器實例
? IF cl_salv_table=>is_offline( ) = ''.
??? CREATE OBJECT lr_container
????? EXPORTING
??????? container_name = 'CONTAINER'.
? ENDIF.
? "創建類LCL_ALV實例
? CREATE OBJECT lr_alv2.
? "取得列表數據
? lt_tab = lr_alv2->getdata( ).
? "創建ALV實例
? TRY.
????? cl_salv_table=>factory(
??????? EXPORTING
????????? r_container??? = lr_container
????????? container_name = 'CONTAINER'
??????? IMPORTING
????????? r_salv_table?? = gr_table
??????? CHANGING
????????? t_table??????? = lt_tab
????? ).
??? CATCH cx_salv_msg.
? ENDTRY.
? "顯示ALV列表
? gr_table->display( ).
? "釋放內存
? FREE lt_tab.
?
下面是程序的所有代碼:
REPORT? y_xin_002.
?
*變量定義
TYPES ty_spfli TYPE spfli OCCURS 0.
DATA: gr_table???? TYPE REF TO cl_salv_table.
?
*選擇屏幕設計
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.
PARAMETERS: p_full RADIOBUTTON GROUP rg,
??????????? p_list RADIOBUTTON GROUP rg,
??????????? p_grid RADIOBUTTON GROUP rg.
SELECTION-SCREEN END OF BLOCK blk.
?
*----------------------------------------------------------------------*
*?????? CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*?????? ALV操作類(定義)
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
? PUBLIC SECTION.
??? METHODS: getdata???????? "取得要顯示的數據
?????????????? RETURNING value(lt_tab) TYPE ty_spfli,
???????????? alv_full??????? "全屏Grid列表處理方法
?????????????? IMPORTING value(lt_tab) TYPE ty_spfli,
???????????? alv_list??????? "普通List處理方法
?????????????? IMPORTING value(lt_tab) TYPE ty_spfli,
???????????? alv_grid??????? "在自定義屏幕上顯示的列表
?????????????? IMPORTING value(lt_tab) TYPE ty_spfli,
???????????? main.?????????? "主方法
ENDCLASS.??????????????????? "lcl_alv DEFINITION
?
?
*----------------------------------------------------------------------*
*?????? CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*?????? ALV操作類(實現)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要顯示的數據
? METHOD getdata.
??? SELECT * INTO TABLE lt_tab FROM spfli.
? ENDMETHOD.??????????????????? "getdata
?
*輸出全屏網格列表的方法
? METHOD alv_full.
??? "創建實例
??? TRY.
??????? cl_salv_table=>factory(
????????? IMPORTING
???????? ???r_salv_table = gr_table
????????? CHANGING
??????????? t_table????? = lt_tab
??????? ).
????? CATCH cx_salv_msg.
??? ENDTRY.
?
??? "顯示列表
??? gr_table->display( ).
? ENDMETHOD.??????????????????? "alv_full
?
*輸出全屏普通列表的方法
? METHOD alv_list.
??? "創建實例
??? TRY.
??????? cl_salv_table=>factory(
????????? EXPORTING
??????????? list_display = 'X'
????????? IMPORTING
??????????? r_salv_table = gr_table
????????? CHANGING
??????????? t_table????? = lt_tab
??????? ).
????? CATCH cx_salv_msg.
??? ENDTRY.
?
??? "顯示列表
? ??gr_table->display( ).
? ENDMETHOD.??????????????????? "alv_list
?
*輸出在自定義屏幕上的列表
? METHOD alv_grid.
??? CALL SCREEN '0100'.
? ENDMETHOD.??????????????????? "alv_grid
?
*主方法,整合數據
? METHOD main.
??? DATA: lt_tab TYPE TABLE OF spfli.
?
??? "取得要顯示的數據
??? lt_tab = me->getdata( ).
?
??? "判斷選擇屏幕的選擇條件調用不同的方法
??? CASE 'X'.
????? WHEN p_full.
??????? me->alv_full( lt_tab ).
????? WHEN p_list.
??????? me->alv_list( lt_tab ).
????? WHEN p_grid.
??????? me->alv_grid( lt_tab ).
??? ENDCASE.
? ENDMETHOD.??????????????????? "main
ENDCLASS.??????????????????? "lcl_alv IMPLEMENTATION
?
*----------------------------------------------------------------------*
*? MODULE status_0100
*----------------------------------------------------------------------*
*? PBO 屏幕輸出前執行
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
? "定義變量
? DATA: lr_container TYPE REF TO cl_gui_custom_container,
??????? lr_alv2?????? TYPE REF TO lcl_alv,
??????? lt_tab?????? TYPE TABLE OF spfli.
? "創建容器實例
? IF cl_salv_table=>is_offline( ) = ''.
??? CREATE OBJECT lr_container
????? EXPORTING
??????? container_name = 'CONTAINER'.
? ENDIF.
? "創建類LCL_ALV實例
? CREATE OBJECT lr_alv2.
? "取得列表數據
? lt_tab = lr_alv2->getdata( ).
? "創建ALV實例
? TRY.
????? cl_salv_table=>factory(
??????? EXPORTING
????????? r_container??? = lr_container
????????? container_name = 'CONTAINER'
??????? IMPORTING
????????? r_salv_table?? = gr_table
??????? CHANGING
????????? t_table??????? = lt_tab
????? ).
??? CATCH cx_salv_msg.
? ENDTRY.
? "顯示ALV列表
??gr_table->display( ).
? "釋放內存
? FREE lt_tab.
ENDMODULE.??????????????????? "status_0100
?
*----------------------------------------------------------------------*
*? MODULE user_command_0100
*----------------------------------------------------------------------*
*? PAI 屏幕輸出后的動作
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
ENDMODULE.??????????????????? "user_command_0100
?
*報表執行
START-OF-SELECTION.
? DATA? lr_alv?? TYPE REF TO lcl_alv.
? CREATE OBJECT lr_alv.
? lr_alv->main( ).與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的OO实现ALV TABLE 二:ALV显示的三种形式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OO实现ALV TABLE 三:ALV的
- 下一篇: OO实现ALV TABLE 一:最简单的