SAP ALV 的前世今生

本文尝试总结了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的一部分,并不会占用整个屏幕。(在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.NoFunction Module & Description
1REUSE_ALV_LIST_DISPLAY : Display an ALV list
2REUSE_ALV_GRID_DISPLAY : Display an ALV grid
3REUSE_ALV_COMMENTARY_WRITE : Output list header information
4REUSE_ALV_VARIANT_F4 : Display variant selection dialog box
5REUSE_ALV_VARIANT_EXISTENCE : Checks whether a variant exists
6REUSE_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 displayCL_SALV_TABLE
Hierarchical ALV displayCL_SALV_HIERSEQ_TABLE
Tree ALV using classCL_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设计

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值