本文尝试总结了ALV报表技术的演变过程,帮助开发者更好地选用合适的技术,开发ALV报表。

ALV是ABAP List Viewer的缩写,因为其最初的设计仅为了ABAP中的报表的数据显示,但随着其不断的发展,ALV已经演变成了一个更加广泛的概念,在7.1之后,ALV已经支持Java。

SAP系统中有海量的数据,使用ABAP语言开发报表、显示数据,大概经历了以下几个阶段:

  1. 第一阶段:使用WRITE,POSITION, FORMAT等关键字控制报表的输出。这一阶段,并无标准的排序,过滤,计算等数据处理功能,这些功能需要单独的开发。
  2. 第二阶段:ALV报表的引入。通过container,使用CL_GUI_ALV_GRID等标准class来完成ALV报表;与此同时,标准系统提供了一系列的ALV相关的函数,例如以REUSE_***开头的一系列function module,可在一定程度上,省去了手动绘制container的步骤。
  3. 第三阶段:在NetWwaver 2004中, 引入了SALV模型,使用完全ABAP OO的概念,封装了REUSE_***相关的function module和传统的CL_GUI_ALV_GRID等class的功能, 让ALV报表变得更加易用。

ALV报表可有以下几种显示类型,简单的2D数据表,树状结构,层级表。

\"在这里插入图片描述\"

在第二阶段,ALV报表技术,主要以CL_GUI_ALV_GRID为核心,并可使用CL_GUI_CUSTOM_CONTAINER创建容器,用来盛放ALV,使用这种方式,可让ALV报表变成screen的一部分,并不会占用整个屏幕。示例代码如下
(前提是,已经手动创建screen 100并创建了ALV container)-

PROGRAM SIMPLE_ALV_CALL.

DATA: OK_CODE LIKE SY-UCOMM,
G_GRID TYPE REF TO CL_GUI_ALV_GRID,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
GT_SFLIGHT TYPE TABLE OF SFLIGHT. “output table

CALL SCREEN 100.
*************************************************************
MODULE PAI INPUT.
CASE OK_CODE.
    WHEN ‘EXIT’.
    LEAVE PROGRAM.
ENDCASE.

CLEAR OK_CODE.
ENDMODULE.

MODULE PBO OUTPUT.
SET PF-STATUS ‘MAIN100’.
* create controls
IF G_CUSTOM_CONTAINER IS INITIAL.
    CREATE   G_CUSTOM_CONTAINER
          EXPORTING CONTAINER_NAME = ‘MYCONTAINER’.
    CREATE   G_GRID
         EXPORTING I_PARENT = G_CUSTOM_CONTAINER.
*——————————
* ALV specific part starts here
*——————————
* data selection
SELECT * FROM SFLIGHT INTO TABLE GT_SFLIGHT.
* display output table in ALV instance
CALL METHOD G_GRID->SET_TABLE_FOR_FIRST_DISPLAY
         EXPORTING I_STRUCTURE_NAME = ‘SFLIGHT’
        CHANGING IT_OUTTAB = GT_SFLIGHT.
ENDIF.
ENDMODULE.

在第二阶段,如果报表仅仅需要一个屏幕来显示数据,则可使用REUSE系列的function
module,可省略手动创建容器的步骤,直接利用ALV全屏显示数据。其主要的函数如下:

r.No Function Module & De ion
1 REUSE_ALV_LIST_DISPLAY : Display an ALV list
2 REUSE_ALV_GRID_DISPLAY : Display an ALV grid
3 REUSE_ALV_COMMENTARY_WRITE : Output list header information
4 REUSE_ALV_VARIANT_F4 : Display variant selection dialog box
5 REUSE_ALV_VARIANT_EXISTENCE : Checks whether a variant exists
6 REUSE_ALV_FIELDCATALOG_MERGE : Create field catalog from dictionary structure or internal table
demos 示例程序:SE38 - BCALV_TEST_FULLSCREEN*

下面展示了,利用REUSE相关的函数,实现ALV显示的一个demo:

DATA: it_spfli TYPE TABLE OF spfli.
SELECT * FROM spfli INTO TABLE it_spfli.
CALL FUNCTION \'REUSE_ALV_GRID_DISPLAY\'
  EXPORTING
    i_structure_name = \'SPFLI\'
  TABLES
    t_outtab         = it_spfli.

在第三阶段,形成了以下面class为核心的SALV, 其集成了第二阶段的ALV技术,并完全使用ABAP OO的开发思想进行了封装。
可使用工厂方法CL_SALV_TABLE=>FACTORY来创建ALV的实例,并完成相关的报表输入,输出控制。使得报表的开发工作变得更为简单。

Simple 2D table display CL_SALV_TABLE
Hierarchical ALV display CL_SALV_HIERSEQ_TABLE
Tree ALV using class CL_SALV_TREE
demo 示例程序:SE38 - SALV_DEMO*

下面给出了一个简单的demo程序:

 DATA: gr_table TYPE REF TO cl_salv_table.
 DATA: it_spfli TYPE TABLE OF spfli.

 START-OF-SELECTION.

   SELECT * INTO TABLE it_spfli FROM spfli.

   cl_salv_table=>factory( IMPORTING r_salv_table = gr_table 
                           CHANGING  t_table = it_spfli ).

   gr_table->display( ).

通过以上介绍,可对ALV的发展过程有一个全局的认知,在面对不同的业务需求时,可选用相关的技术,并进一步查找资料完成需求。

SAP ALV的官方文档:SAP List Viewer (ALV)

收藏 打印