欢迎光临
我们一直在努力

SAP-ABAP:SAP 简单报表输出开发系列(共6篇)第一篇:SAP 报表开发基础入门:ALV 报表核心框架搭建指南

SAP 简单报表输出开发系列(共6篇)

第一篇:SAP 报表开发基础入门:ALV 报表核心框架搭建指南

在SAP业务应用中,报表开发是最常见、最基础的任务之一。无论是财务的科目余额表,还是物料的库存清单,最终都需要以清晰的表格形式呈现给用户。而ALV(ABAP List Viewer) 正是SAP标准报表输出的核心工具。本文面向SAP开发新手,从零开始梳理一个简单报表的完整开发流程,详解数据抽取、结构定义、ALV实例初始化三大核心步骤,并附可直接复用的基础代码模板,帮助你快速跑出第一个可正常输出的标准ALV报表。


一、ALV 报表开发全景图

一个最简单的ALV报表开发,只需要完成以下三个步骤:

步骤任务关键事务码/技术
1. 数据抽取 从数据库表中查询需要展示的数据 SELECT,INTO TABLE
2. 结构定义 定义内表的结构(行类型),用于存储查询结果 TYPES,DATA
3. ALV 初始化 调用ALV函数,传递数据并显示 REUSE_ALV_GRID_DISPLAY

如果把这套流程固化,你就能在10分钟内搭建一个新的报表框架。


二、步骤一:定义数据结构(内表与工作区)

在编写任何逻辑之前,先定义好数据容器。通常情况下,我们会定义两种数据对象:

  • 工作区:用于暂存单行数据。
  • 内表:用于存储多行数据。

方式一:直接参照数据库表结构

DATA: ls_mara TYPE mara, " 工作区
lt_mara TYPE TABLE OF mara. " 内表

方式二:自定义结构(只选取需要的字段)

TYPES: BEGIN OF ty_mara,
matnr TYPE mara-matnr, " 物料号
maktx TYPE makt-maktx, " 物料描述(来自另一张表)
mtart TYPE mara-mtart, " 物料类型
END OF ty_mara.

DATA: ls_out TYPE ty_mara,
lt_out TYPE TABLE OF ty_mara.

建议:报表通常只需要部分字段,且可能涉及多表关联,推荐使用自定义结构,既清晰又高效。


三、步骤二:数据抽取(填充内表)

数据抽取的核心是从数据库表中读取数据并填充到内表中。最常用的方式是:

SELECT matnr mtart
FROM mara
INTO TABLE lt_mara
UP TO 100 ROWS.

如果需要进行多表关联,可以使用JOIN或者先读取主表,再使用FOR ALL ENTRIES读取关联表。例如,同时获取物料描述:

" 1. 读取物料主数据
SELECT matnr mtart
FROM mara
INTO TABLE lt_mara
UP TO 100 ROWS.

" 2. 根据物料号批量读取描述
IF lt_mara IS NOT INITIAL.
SELECT matnr maktx
FROM makt
INTO TABLE @DATA(lt_makt)
FOR ALL ENTRIES IN @lt_mara
WHERE matnr = @lt_mara-matnr
AND spras = @sy-langu.
ENDIF.

然后通过READ TABLE或者LOOP将描述合并到输出内表中。对于简单报表,也可以直接在SQL中使用LEFT JOIN完成。


四、步骤三:ALV 实例初始化与显示

数据准备就绪后,调用标准函数REUSE_ALV_GRID_DISPLAY即可将内表以表格形式展示。

4.1 最简单调用(全自动字段生成)

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_structure_name = 'MARA' " 参照数据字典结构,自动生成列标题
TABLES
t_outtab = lt_mara
EXCEPTIONS
program_error = 1
OTHERS = 2.

优点:无需手动定义字段目录(Field Catalog),极速开发。
缺点:无法自定义列标题、排序、汇总等。

4.2 自定义字段目录(推荐)

为了更好的控制报表展示,我们需要生成一个字段目录内表lt_fieldcat,告诉ALV每个字段如何显示。

DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
ls_fieldcat LIKE LINE OF lt_fieldcat.

" 定义物料号列
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-tabname = 'LT_MARA'.
ls_fieldcat-seltext_l = '物料号'.
ls_fieldcat-outputlen = '18'.
APPEND ls_fieldcat TO lt_fieldcat.

" 定义物料类型列
ls_fieldcat-fieldname = 'MTART'.
ls_fieldcat-tabname = 'LT_MARA'.
ls_fieldcat-seltext_l = '物料类型'.
APPEND ls_fieldcat TO lt_fieldcat.

" 调用ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = lt_fieldcat
TABLES
t_outtab = lt_mara
EXCEPTIONS
program_error = 1.

注意:lt_fieldcat中的字段名必须与内表lt_mara的行结构字段名完全一致(大小写不敏感,但建议大写)。


五、完整示例代码(可直接复制运行)

以下是一个完整的采购订单抬头简单报表示例,包含数据查询和ALV显示。

REPORT z_alv_demo.

*&———————————————————————*
*& 内表与工作区定义
*&———————————————————————*
TYPES: BEGIN OF ty_ekko,
ebeln TYPE ekko-ebeln, " 采购订单号
bsart TYPE ekko-bsart, " 订单类型
aedat TYPE ekko-aedat, " 创建日期
ernam TYPE ekko-ernam, " 创建人
END OF ty_ekko.

DATA: lt_ekko TYPE TABLE OF ty_ekko,
ls_ekko LIKE LINE OF lt_ekko.

*&———————————————————————*
*& 选择屏幕(可选)
*&———————————————————————*
SELECT-OPTIONS: s_ebeln FOR ekko-ebeln. " 允许用户输入订单号范围

*&———————————————————————*
*& 数据抽取
*&———————————————————————*
START-OF-SELECTION.
SELECT ebeln bsart aedat ernam
FROM ekko
INTO TABLE lt_ekko
WHERE ebeln IN s_ebeln.

IF sy-subrc <> 0.
MESSAGE '没有找到符合条件的数据' TYPE 'W'.
RETURN.
ENDIF.

*&———————————————————————*
*& ALV显示
*&———————————————————————*
PERFORM f_display_alv.

*&———————————————————————*
*& 子程序:显示ALV报表
*&———————————————————————*
FORM f_display_alv.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv,
ls_fieldcat LIKE LINE OF lt_fieldcat.

" 采购订单号列
ls_fieldcat-fieldname = 'EBELN'.
ls_fieldcat-tabname = 'LT_EKKO'.
ls_fieldcat-seltext_l = '采购订单号'.
APPEND ls_fieldcat TO lt_fieldcat.

" 订单类型列
ls_fieldcat-fieldname = 'BSART'.
ls_fieldcat-tabname = 'LT_EKKO'.
ls_fieldcat-seltext_l = '订单类型'.
APPEND ls_fieldcat TO lt_fieldcat.

" 创建日期列
ls_fieldcat-fieldname = 'AEDAT'.
ls_fieldcat-tabname = 'LT_EKKO'.
ls_fieldcat-seltext_l = '创建日期'.
APPEND ls_fieldcat TO lt_fieldcat.

" 创建人列
ls_fieldcat-fieldname = 'ERNAM'.
ls_fieldcat-tabname = 'LT_EKKO'.
ls_fieldcat-seltext_l = '创建人'.
APPEND ls_fieldcat TO lt_fieldcat.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = lt_fieldcat
TABLES
t_outtab = lt_ekko
EXCEPTIONS
program_error = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE 'ALV显示错误' TYPE 'E'.
ENDIF.
ENDFORM.

将上述代码复制到SE38,激活并执行,即可看到采购订单列表。


六、常见问题与调试技巧

6.1 内表为空,ALV不显示

检查SELECT是否返回数据,可以在ALV调用前添加WRITE: lines( lt_ekko ).确认。

6.2 ALV报错“Field catalog inconsistent”

  • 字段名拼写错误或大小写不一致。
  • tabname没有指定或与调用时t_outtab的参数名不匹配(t_outtab的名字可以是任意,但tabname要与之一致,通常使用内表名'LT_EKKO')。

6.3 如何调整列宽

在字段目录中设置outputlen。

ls_fieldcat-outputlen = 20.

6.4 如何让ALV自动优化列宽

不设置outputlen,或者设置ls_fieldcat-col_opt = 'X'。


七、小结与下篇预告

本文从零开始搭建了一个标准的ALV报表框架,你只需替换数据查询和字段定义,就能快速生成一个简单的报表。后续的系列文章将进一步深入:

  • 筛选优化:自定义选择屏幕、索引、SQL性能。
  • 样式定制:颜色、汇总、下拉框。
  • 异常处理:消息提示、空数据兼容。
  • 多格式输出:Excel、PDF导出。
  • 权限管控:权限对象配置、性能测试。

掌握这些技能后,你将能够轻松应对日常开发中90%的报表需求。

📌 下篇预告:《SAP 报表数据筛选优化:选择屏幕自定义与查询效率提升》

作者:你的SAP学习伙伴
版本记录:2026年5月

💬 你在第一次写ALV报表时遇到过什么难题?欢迎留言交流。

赞(0)
未经允许不得转载:171主机测评 » SAP-ABAP:SAP 简单报表输出开发系列(共6篇)第一篇:SAP 报表开发基础入门:ALV 报表核心框架搭建指南
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址