OO實現ALV TABLE 二:ALV顯示的三種形式

一般的ALV有三種顯示形式,分別爲<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

一、普通的List

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

 

二、全屏的Grid

 

 

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

 

跟以往實現這三種ALV顯示方式相比,以往的三種顯示方式分別是調用不同的FunctionClass,實現方式複雜。現在這三種顯示方式可以通過一個類(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。執行屏幕的時候會執行它的PBOPAI,也就是會執行module status_0100user_command_0100Status_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( ).

 

發佈了30 篇原創文章 · 獲贊 1 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章