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

ABAP 数据字典 DDIC 详解:从 Domain 到透明表、搜索帮助与锁对象
ABAP 数据字典,也叫 ABAP Dictionary 或 DDIC,是 SAP ABAP 开发中的核心基础设施。它不是简单的“建表工具”,而是 SAP 系统中集中定义、管理和复用数据结构、数据类型、业务语义、输入校验、搜索帮助、锁机制和数据库技术属性的元数据中心。
可以把它理解成:ABAP 数据字典负责说明 SAP 系统中的数据“长什么样、业务上是什么意思、怎么存、怎么校验、怎么显示、怎么关联”。
在传统 SAP GUI 中,最常用的入口是事务码 SE11。相关事务码还包括 SE12、SE14、SE16、SE16N、SE54、SM30 和 SE80。
一、为什么需要 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 会计凭证明细
自定义表通常以 Z 或 Y 开头,例如:
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 | 应用表,主数据或交易数据 |
| C | Customizing 表,配置表 |
| L | 临时数据表 |
| G | 客户表,SAP 不修改 |
| E | 控制表,SAP 和客户有独立命名范围 |
| S | 系统表 |
| W | 系统表,内容可传输 |
自定义配置表常用 C,业务数据表常用 A。
十三、外键、Check Table 和 Value Table
DDIC 可以定义外键,用于字段级校验和关系描述。
例如:
ZSO_HEADER-KUNNR -> KNA1-KUNNR
表示订单头表中的客户编号必须存在于客户主数据表中。
需要区分两个概念:
| 概念 | 定义位置 | 作用 |
|---|---|---|
| Value Table | Domain | 表示该 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 用于给标准表或结构追加自定义字段,常见字段名前缀为 ZZ 或 YY,避免与 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,通常可以按下面步骤进行:
- 创建 Domain,例如
ZD_SO_STATUS,定义订单状态的技术属性和固定值。 - 创建 Data Element,例如
ZDE_SO_STATUS,定义订单状态的业务语义和字段标签。 - 创建透明表
ZSO_HEADER,维护字段、主键和描述。 - 维护技术设置,例如 Data Class、Size Category 和 Buffering。
- 定义外键,例如
KUNNR到KNA1-KUNNR。 - 保存并激活。
- 使用
SE16N或 ABAPSELECT测试访问。
示例读取:
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 才能统一管理类型一致性、权限、传输、激活、多语言文本、程序引用和数据库独立性。
二十、常见设计原则
自定义对象一般以 Z 或 Y 开头。字段命名应清晰,避免无意义缩写。
应优先复用标准数据元素,例如:
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 数据模型,会顺畅很多。
