一、最简单的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 ).
CATCH cx_salv_msg.
ENDTRY.
3.取得实例之后再调用方法Display()显示列表.
lr_table->display( ).
下面是报表的所有源代码:
REPORTy_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 TO cl_salv_table.
ENDCLASS. "lcl_alv DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
* ALV操作类(实现)
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.
*取得要显示的数据======================================================
METHOD getdata.
SELECT * INTO TABLE lt_tab FROM 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. "main
DATA: lt_tab TYPE TABLE OF spfli.
lt_tab = me->getdata( ). "取得要显示的数据
me->alv_process( lt_tab ). "处理数据
ENDMETHOD.
ENDCLASS. "lcl_alv IMPLEMENTATION
*报表执行==============================================================
start-of-selection.
data lr_alv type ref to lcl_alv.
create object lr_alv.
lr_alv->main( ).
二、ALV显示的三种形式
一般的ALV有三种显示形式,分别为
1、普通的List
2、全屏的Grid
3、在自定义屏幕的显示的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_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.
CREATE OBJECT lr_alv2. "创建类LCL_ALV实例LCL_ALV2
lt_tab = lr_alv2->getdata( ). "取得列表数据
TRY.
cl_salv_table=>factory( "创建ALV实例
EXPORTING
r_container = lr_container
container_name = 'CONTAINER'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab).
CATCH cx_salv_msg.
ENDTRY.
gr_table->display( ). "显示ALV列表
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.
CREATE OBJECT lr_alv2. "创建类LCL_ALV实例
lt_tab = lr_alv2->getdata( ). "取得列表数据
TRY.
cl_salv_table=>factory( "创建ALV实例
EXPORTING
r_container = lr_container
container_name = 'CONTAINER'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = lt_tab).
CATCH cx_salv_msg.
ENDTRY.
gr_table->display( ). "显示ALV列表
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( ).