视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
OO实现ALV TABLE 二:ALV显示的三种形式
2025-10-02 15:05:47 责编:小OO
文档
一般的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( ).下载本文

显示全文
专题