本文尝试总结了ALV报表技术的演变过程,帮助开发者更好地选用合适的技术,开发ALV报表。
ALV是ABAP List Viewer的缩写,因为其最初的设计仅为了ABAP中的报表的数据显示,但随着其不断的发展,ALV已经演变成了一个更加广泛的概念,在7.1之后,ALV已经支持Java。
SAP系统中有海量的数据,使用ABAP语言开发报表、显示数据,大概经历了以下几个阶段:
- 第一阶段:使用WRITE,POSITION, FORMAT等关键字控制报表的输出。这一阶段,并无标准的排序,过滤,计算等数据处理功能,这些功能需要单独的开发。
- 第二阶段:ALV报表的引入。通过container,使用CL_GUI_ALV_GRID等标准class来完成ALV报表;与此同时,标准系统提供了一系列的ALV相关的函数,例如以REUSE_***开头的一系列function module,可在一定程度上,省去了手动绘制container的步骤。
- 第三阶段:在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的一部分,并不会占用整个屏幕。(在SE3*: BCALV_GRID* 的程序中,提供了标准的实例代码,例如在BCALV_GRID_02中,提供了dialog container的用法。)
在此,给出一个最简单的示例代码
(前提是,已经手动创建screen 100并创建了ALV container)-
PROGRAM SIMPLE_ALV_CALL.
DATA: ok_code LIKE sy-ucomm.
DATA: go_container TYPE REF TO cl_gui_custom_container,
go_grid TYPE REF TO cl_gui_alv_grid.
DATA: gt_saplane TYPE TABLE OF saplane.
**********************************************************************
* event handler
**********************************************************************
CLASS lcl_grid_handle DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
on_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING es_row_no e_column.
ENDCLASS.
CLASS lcl_grid_handle IMPLEMENTATION.
METHOD on_double_click.
MESSAGE es_row_no-row_id && e_column-fieldname TYPE 'I'.
ENDMETHOD.
ENDCLASS.
**********************************************************************
START-OF-SELECTION.
**********************************************************************
SELECT * FROM saplane INTO TABLE gt_saplane UP TO 100 ROWS.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
* PBO
*----------------------------------------------------------------------*
MODULE pbo OUTPUT.
SET PF-STATUS 'STANDARD'.
SET TITLEBAR 'TITLE'.
IF go_container IS NOT BOUND.
CREATE OBJECT go_container
EXPORTING
container_name = 'CONTAINER1'
EXCEPTIONS
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container
EXCEPTIONS
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* SET HANDLER lcl_grid_handle=>on_double_click FOR ALL INSTANCES.
SET HANDLER lcl_grid_handle=>on_double_click FOR go_grid. " set event handler
go_grid->set_table_for_first_display(
EXPORTING
i_structure_name = 'SAPLANE'
CHANGING
it_outtab = gt_saplane
EXCEPTIONS
OTHERS = 5 ).
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
* PAI
*----------------------------------------------------------------------*
MODULE pai INPUT.
CASE ok_code.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN OTHERS.
* do nothing
ENDCASE.
CLEAR ok_code.
ENDMODULE.
在第二阶段,如果报表仅仅需要一个屏幕来显示数据,则可使用REUSE系列的function
module,可省略手动创建容器的步骤,直接利用ALV全屏显示数据。其主要的函数如下:
r.No | Function Module & Description |
---|---|
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)
SAP Enjoy Demo Center: [Tx: DWDM] 提供了ALV常用功能的模板代码。
ALV package SALV_OM_OBJECTS 中提供了很多示例程序
Package S_ITSP_TEST 中也有很多可参考的ALV程序和Screen设计