ABAP 数据字典 DDIC 详解:从 Domain 到透明表、搜索帮助与锁对象


文章封面

ABAP 数据字典 DDIC 详解:从 Domain 到透明表、搜索帮助与锁对象

ABAP 数据字典,也叫 ABAP Dictionary 或 DDIC,是 SAP ABAP 开发中的核心基础设施。它不是简单的“建表工具”,而是 SAP 系统中集中定义、管理和复用数据结构、数据类型、业务语义、输入校验、搜索帮助、锁机制和数据库技术属性的元数据中心。

可以把它理解成:ABAP 数据字典负责说明 SAP 系统中的数据“长什么样、业务上是什么意思、怎么存、怎么校验、怎么显示、怎么关联”。

在传统 SAP GUI 中,最常用的入口是事务码 SE11。相关事务码还包括 SE12SE14SE16SE16NSE54SM30SE80

一、为什么需要 ABAP 数据字典

在普通程序里,我们可以直接定义变量:

DATA lv_name TYPE c LENGTH 40.

但 SAP 是企业级系统,同一个字段往往会出现在很多地方。例如客户编号可能出现在客户主数据、销售订单、发票、报表选择屏幕、ALV 展示、自定义表和接口结构中。

如果每个地方都单独定义,容易出现长度不一致、描述不一致、校验逻辑不一致、搜索帮助不一致等问题。DDIC 的价值就在于把这些定义集中管理。

例如客户编号 KUNNR 可以统一定义为:

长度:10
类型:CHAR
转换例程:ALPHA
业务含义:客户编号
字段标签:Customer Number / 客户编号

以后程序、表字段、屏幕、接口都引用同一套定义,系统的一致性会好很多。

二、Domain:域,定义技术属性

Domain 主要定义字段的技术属性。它回答的是:这个字段底层是什么数据类型?长度多少?有没有小数位?允许哪些固定值?有没有转换例程?

常见数据类型包括:

CHAR   字符
NUMC   数字字符
DATS   日期,格式 YYYYMMDD
TIMS   时间,格式 HHMMSS
DEC    压缩数字
CURR   金额
QUAN   数量
INT4   整数
CLNT   客户端字段
LANG   语言字段

例如可以定义一个订单状态域:

Domain: ZD_SO_STATUS
Data Type: CHAR
Length: 1
Fixed Values:
  N = New
  R = Released
  C = Closed

如果字段有固定值或取值范围,也通常在 Domain 中维护。

三、Data Element:数据元素,定义业务语义

Data Element 主要定义字段的业务语义。它回答的是:这个字段业务上是什么意思?屏幕上显示什么标签?是否有字段文档?是否有搜索帮助?

Data Element 通常引用一个 Domain。

例如:

Data Element: KUNNR
Domain: KUNNR
Short Text: Customer Number
Field Label:
  Short: Customer
  Medium: Customer
  Long: Customer Number
  Heading: Customer

Domain 和 Data Element 的区别非常重要:

对象作用示例
Domain技术属性CHAR 10,ALPHA 转换
Data Element业务语义客户编号、供应商编号、员工编号

同一个 Domain 可以被多个 Data Element 使用。技术长度相同,并不代表业务含义相同。

四、透明表:Transparent Table

透明表是 ABAP Dictionary 中最常用的对象。透明表在 ABAP 层定义后,会在底层数据库中生成对应的真实数据库表。

常见 SAP 标准表包括:

MARA   物料主数据
MAKT   物料描述
KNA1   客户主数据
LFA1   供应商主数据
VBAK   销售订单抬头
VBAP   销售订单行项目
BKPF   会计凭证抬头
BSEG   会计凭证明细

自定义表通常以 ZY 开头,例如:

ZMM_MAT_LOG
ZSD_ORDER_EXT
ZFI_PAYMENT_CFG

透明表字段通常包括字段名、是否主键、数据元素、数据类型、长度和描述。多数业务表会包含 MANDT 字段,用来表示 SAP Client。典型主键可能是:

MANDT
MATNR

这表示某个 Client 下的某个物料编号。

五、Structure:结构

Structure 和透明表类似,也由字段组成。区别是结构通常只作为类型存在,不一定对应底层数据库物理表。

结构常用于:

  • 程序工作区
  • ALV 输出结构
  • BAPI 参数
  • 屏幕字段
  • 接口传输
  • Include 字段复用

例如:

DATA ls_mara TYPE mara.
DATA ls_output TYPE zstr_sales_report.

数据库表本身也可以作为结构类型使用。

六、Table Type:表类型

Table Type 用来定义内表类型。它说明内表每一行是什么结构,表类别是 Standard、Sorted 还是 Hashed,以及键字段是什么。

例如:

Table Type: ZTT_MARA
Line Type: MARA
Table Category: Standard Table
Key: MATNR

ABAP 中可以这样使用:

DATA lt_mara TYPE ztt_mara.

如果多个程序、函数模块或接口都要复用同一种内表类型,将它定义为 DDIC Table Type 会更清晰。

七、View:视图

DDIC 中可以定义视图,用于从一个或多个表中读取数据。常见视图类型有:

Database View       数据库视图
Projection View     投影视图
Maintenance View    维护视图
Help View           帮助视图

Database View 常用于把多个表 Join 后读取;Projection View 用于暴露表的一部分字段;Maintenance View 常配合 SM30 维护配置数据;Help View 常用于搜索帮助。

八、Search Help:搜索帮助

Search Help 用于提供 F4 输入帮助。例如用户在物料字段按 F4,系统弹出可选择的物料列表。

搜索帮助可以定义:

  • 从哪个表或视图取值
  • 显示哪些字段
  • 哪些字段作为输入条件
  • 哪个字段返回给屏幕
  • 是否通过出口函数增强逻辑

搜索帮助分为:

Elementary Search Help   基本搜索帮助
Collective Search Help   集合搜索帮助

集合搜索帮助可以组合多个基本搜索方式,例如客户可以按客户编号、客户名称、城市、税号等方式搜索。

九、Lock Object:锁对象

SAP 是多用户系统,多个用户可能同时修改同一笔业务数据。为了避免并发冲突,需要使用锁机制。

DDIC 中通过 Lock Object 定义锁逻辑。创建锁对象后,系统会自动生成两个函数模块:

ENQUEUE_EZORDER
DEQUEUE_EZORDER

使用示例:

CALL FUNCTION 'ENQUEUE_EZORDER'
  EXPORTING
    mode_zorder = 'E'
    mandt       = sy-mandt
    order_id    = lv_order_id.

IF sy-subrc <> 0.
  MESSAGE 'Order is locked by another user' TYPE 'E'.
ENDIF.

" 修改数据逻辑

CALL FUNCTION 'DEQUEUE_EZORDER'
  EXPORTING
    mandt    = sy-mandt
    order_id = lv_order_id.

常见锁模式包括 E 排他锁、S 共享锁和 X 非累计排他锁。

十、DDIC 对象之间的关系

DDIC 对象之间通常可以这样理解:

Domain
  ↓
Data Element
  ↓
Table Field / Structure Field
  ↓
Table / Structure / View / Program

例如:

Domain: ZD_ORDER_STATUS
  技术定义:CHAR 1,固定值 N/R/C

Data Element: ZDE_ORDER_STATUS
  业务含义:订单状态

Table Field: ZORDER-STATUS
  表字段:订单状态

程序中可以直接复用:

DATA lv_status TYPE zde_order_status.

十一、表的技术设置

创建透明表时,除了字段,还要维护 Technical Settings。

Data Class

Data Class 表示数据类别:

Data Class含义
APPL0主数据,例如客户、物料
APPL1交易数据,例如订单、凭证
APPL2组织和配置数据

Size Category

Size Category 表示预计数据量大小,SAP 会据此决定底层数据库相关技术属性。

Buffering

表缓冲适合读多写少、数据变化不频繁的小型配置表。不适合交易大表、高频写入表、财务凭证表、库存数量表,以及对实时一致性要求高的表。

十二、Delivery Class:交付类

Delivery Class 决定表数据的传输和维护特性。常见值包括:

Delivery Class含义
A应用表,主数据或交易数据
CCustomizing 表,配置表
L临时数据表
G客户表,SAP 不修改
E控制表,SAP 和客户有独立命名范围
S系统表
W系统表,内容可传输

自定义配置表常用 C,业务数据表常用 A

十三、外键、Check Table 和 Value Table

DDIC 可以定义外键,用于字段级校验和关系描述。

例如:

ZSO_HEADER-KUNNR -> KNA1-KUNNR

表示订单头表中的客户编号必须存在于客户主数据表中。

需要区分两个概念:

概念定义位置作用
Value TableDomain表示该 Domain 的值理论上来自哪个基础表
Check Table具体表字段外键表示该字段实际校验时要检查哪个表

真正起输入校验作用的是 Check Table / Foreign Key,而不是单独的 Value Table。

十四、转换例程 Conversion Routine

转换例程用于处理内部格式和外部显示格式之间的转换。最常见的是 ALPHA

例如用户输入客户编号:

12345

系统内部保存可能是:

0000012345

ABAP 中可以使用函数模块:

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = lv_input
  IMPORTING
    output = lv_output.

也可以使用新语法:

lv_kunnr = |{ lv_input ALPHA = IN }|.
lv_text  = |{ lv_kunnr ALPHA = OUT }|.

如果自定义字段本质上就是客户、供应商、物料、公司代码等标准业务对象,应优先复用标准数据元素,这样可以继承长度、字段标签、搜索帮助和转换例程。

十五、Append Structure 和 Include Structure

SAP 标准表不能随便直接修改,但可以通过增强方式追加字段。

Append Structure 用于给标准表或结构追加自定义字段,常见字段名前缀为 ZZYY,避免与 SAP 标准字段冲突。

Include Structure 用于复用一组字段。例如多个表都有审计字段:

CREATED_BY
CREATED_ON
CHANGED_BY
CHANGED_ON

可以定义一个结构 ZSTR_AUDIT,然后 Include 到多个表中。

十六、激活 Activation

DDIC 对象创建或修改后必须激活。激活会检查定义一致性,生成运行时对象,必要时调整数据库对象,并让 ABAP 程序可以引用该对象。

未激活时,程序可能出现:

Type ZXXX is unknown
Table ZXXX does not exist
Dictionary object is inactive

十七、创建自定义表的典型步骤

假设要创建订单头表 ZSO_HEADER,通常可以按下面步骤进行:

  1. 创建 Domain,例如 ZD_SO_STATUS,定义订单状态的技术属性和固定值。
  2. 创建 Data Element,例如 ZDE_SO_STATUS,定义订单状态的业务语义和字段标签。
  3. 创建透明表 ZSO_HEADER,维护字段、主键和描述。
  4. 维护技术设置,例如 Data Class、Size Category 和 Buffering。
  5. 定义外键,例如 KUNNRKNA1-KUNNR
  6. 保存并激活。
  7. 使用 SE16N 或 ABAP SELECT 测试访问。

示例读取:

SELECT SINGLE *
  FROM zso_header
  INTO @DATA(ls_header)
  WHERE vbeln = @lv_vbeln.

十八、DDIC 在 ABAP 程序中的使用

常见写法如下:

DATA ls_mara TYPE mara.
DATA lt_mara TYPE STANDARD TABLE OF mara.
DATA lv_kunnr TYPE kunnr.
DATA lv_matnr TYPE matnr.

读取透明表:

SELECT matnr, ersda, ernam
  FROM mara
  INTO TABLE @DATA(lt_mara)
  UP TO 100 ROWS.

如果输出结构需要跨程序复用,可以创建 DDIC 结构,例如 ZSTR_MATERIAL_OUTPUT

十九、DDIC 与数据库的关系

ABAP Dictionary 是逻辑定义层,底层数据库是真实存储层。

ABAP Dictionary Table
        ↓ 激活
Database Table

开发者通常不直接在数据库中建 SAP 业务表,而是在 SE11 或 ADT 中定义 DDIC 对象。这样 SAP 才能统一管理类型一致性、权限、传输、激活、多语言文本、程序引用和数据库独立性。

二十、常见设计原则

自定义对象一般以 ZY 开头。字段命名应清晰,避免无意义缩写。

应优先复用标准数据元素,例如:

KUNNR    客户编号
MATNR    物料编号
BUKRS    公司代码
WERKS_D  工厂
VKORG    销售组织

配置表和业务数据表要分开。配置表通常使用 Delivery Class C,业务数据表通常使用 Delivery Class A

主键上线后很难修改,设计时要考虑是否包含 MANDT、是否需要组织维度、是否使用流水号、是否需要时间维度,以及是否方便查询。

大表经常按非主键字段查询时,可以考虑二级索引。但索引不是越多越好,索引会影响写入性能。

二十一、常见错误

常见 DDIC 设计错误包括:

  • 字段长度设计太短,后期扩展困难。
  • 没有复用标准数据元素,导致转换例程或搜索帮助缺失。
  • 交易大表错误开启全表缓冲。
  • 没有维护技术设置导致激活警告或错误。
  • 修改表结构前没有评估已有数据转换风险。

例如客户编号如果没有正确处理 ALPHA 转换,可能导致查询不到数据:

lv_kunnr = '12345'.

SELECT SINGLE *
  FROM kna1
  WHERE kunnr = @lv_kunnr
  INTO @DATA(ls_kna1).

如果数据库内部实际保存为 0000012345,直接用 12345 查询就可能匹配失败。

二十二、DDIC 与 CDS 的关系

在较新的 ABAP 和 S/4HANA 系统中,CDS View 非常重要。CDS 可以通过代码定义数据模型、注解、关联、权限和 OData 暴露。

示例:

@AbapCatalog.sqlViewName: 'ZV_MAT'
@EndUserText.label: 'Material Basic Data'
define view ZCDS_Material
  as select from mara
{
  key matnr,
      mtart,
      matkl
}

CDS 很强大,但 DDIC 仍然是底层基础。透明表、数据元素、域、搜索帮助和锁对象依然是 ABAP 开发中必须掌握的内容。

总结

ABAP 数据字典是 ABAP 程序、SAP 业务对象和底层数据库之间的桥梁。

最核心的理解是:

Domain 定义技术属性
Data Element 定义业务语义
Table / Structure 使用字段
Search Help 提供 F4 帮助
Foreign Key 提供关系和校验
Lock Object 提供并发控制
Technical Settings 决定底层数据库行为

初学 DDIC 时,建议按这个顺序学习:Domain 和 Data Element、透明表、主键和 MANDT、技术设置、外键和 Check Table、搜索帮助、锁对象、表维护生成器、Append/Include 结构,以及 DDIC 在 ABAP 程序中的使用。

掌握 DDIC 后,再学习 ABAP Open SQL、ALV、BAPI、CDS 和 Fiori 数据模型,会顺畅很多。

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
MCP自动发表文章
下一篇:没有了
评论列表

发表评论

评论内容
昵称:
验证码:
验证码
关联文章

ABAP 数据字典 DDIC 详解 Domain 透明搜索帮助对象
ABAP基础语法:变量、系统变量、数据类型结构体变量详解
SAP PP PP-PI 详解一辆自行车一批果汁
SAP ABAP 数据类型和常量基础
ASP.NET Core 标记帮助程序(TagHelper)数据列表支持,循环数据
ABAP 基础语法教程:运算、字符串、判断循环
SAP S/4HANA FICO 入门 38:字段状态、数据查看 LSMW 录屏
SAP S/4HANA MM模块培训 05 - 组织配置采购订单收货
SAP S/4HANA MM模块培训 01 - ERP基础工厂产品组配置
SAP S/4HANA MM模块培训 02 - 企业结构配置:库存地点业务范围分配
API接口主从数据(Master-Detail),数据的两种处理方式
公共数据字典选择组件SelectCommonDict
SAP S/4HANA OMS2物料类型字段详解:每个字段的意义常用配置
物料组为什么在“后勤-常规”中定义开始?理解 SAP S/4HANA 的四层数据逻辑
搭配Serilog一起使用的日志搜索分析方案
TS有两个对象,便利B对象的属性,如果A对象有这个属性,就把B的值更新A对象
C# XML 序列化反序列化详解及实战示例
SAP 常用事务代码速查:ECC S/4HANA T-Code 命名规律及模块清单
使用.NET 6开发TodoList应用(15)——实现查询搜索
用 SQL Server 应用解决并发重复提交