扩展字典对象
学习目标
使用附加结构扩展字典对象。
附加结构

您已经了解 ABAP 字典中的数据库表定义对应于数据库中的物理表。对字典对象的更改在激活期间 (ALTER TABLE) 或通过数据库调整过程传输到数据库对象。
附加结构是一种技术,可将字段添加到数据库表中,而无需实际更改 ABAP 字典中的表定义。

让我们考虑一个由软件提供商(例如 SAP)定义的数据库表。客户或合作伙伴想要向此数据库表添加字段。
它们会创建附加结构,而不是将字段添加到字典中的数据库表定义。附加结构是由客户或合作伙伴拥有和维护的单独字典对象。从技术角度讲,它是 ABAP 字典中的结构类型。但是,它链接到数据库表定义并定义相关数据库表的附加字段。激活附加结构后,其组件将作为字段添加到数据库上的 表中。
可以说,数据库中的表是由两个字典对象定义的:数据库表定义和附加结构。
注意
一个附加结构仅属于一个数据库表。但是,一个数据库表可以有多个附加结构。
在 ABAP Cloud 中,仅当软件提供者发布了扩展的表定义时,才能创建附加。

但是,如果软件提供商提供新版本数据库表定义会怎样?
让我们考虑,在未来版本中,数据库表将包含附加字段。解决方案很简单:在升级期间,只需使用 ALTER TABLE 语句将新字段添加到数据库表的字段目录中。对于 ABAP 环境,数据库和字典中的不同字段顺序不是问题。

以下是附加结构的示例。
左侧的代码显示数据库表 /DMO/AGENCY 的定义。右侧的代码显示附加结构 Z00_EXT_AGENCY 的定义。通过在关键字 EXTEND TYPE 后面提及数据库表在附加结构中建立两个字典对象之间的链接。
附加结构具有一个组件 zzcategory。将其添加到数据库表 /DMO/AGENCY 的字段清单。
附加结构的组件以 "ZZ" 开头的原因如下。以 "ZZ" 或 "YY" 开头的表字段和结构组件位于客户命名空间中。SAP 确保 SAP 提供的表永远不会包含客户命名空间中的字段。通过选择客户命名空间中的字段名称,如果 SAP 向目标表添加新字段,客户可以避免字段名称冲突。

附加技术不仅适用于数据库表定义。还可以使用附加结构将组件添加到结构类型。
在此示例中,右侧的附加结构使用字段 ZZCATEGORYZAG 扩展字典结构 /DMO/S_EXT_INCL_AGENCY。
字典对象的可扩展性控制

为避免稍后发生冲突,数据库表定义或结构类型的所有者可以限制可扩展性甚至不允许。
软件提供者使用注释 @ABAPCatalog.enhancement 的以下子注释控制可扩展性:
类别
定义增强类别。可以指定以下值:
#NOT_CLASSIFIED - 未分类
#NOT_EXTENSIBLE - 无法增强
#EXTENSIBLE_CHARACTER - 可增强(字符型)
#EXTENSIBLE_CHARACTER_NUMERIC - 可以增强(字符型或数字)
#EXTENSIBLE_ANY - 可增强(深度 - 仅用于结构)
fieldSuffix
定义 3 个字符的元素后缀。此后缀将用于客户或合作伙伴创建的扩展的所有字段。目的是避免字段命名冲突。
quotaMaximumFields
定义客户和合作伙伴可附加到相应对象的最大字段数。换句话说,它为客户和合作伙伴扩展保留字段计数。
quotaMaximumBytes
定义客户和合作伙伴可附加到相应对象的最大字节容量。换句话说,它为客户和合作伙伴扩展保留字节容量。
注意
有关可扩展性注释的完整文档,请参阅 ABAP 关键字文档。

SAP 通常使用扩展控制来强制使用扩展 Include。
扩展包含文件是包含在一个或多个数据库表定义中的特定结构类型。如果客户或合作伙伴想要向表中添加字段,则必须为此扩展包含文件创建附加结构,而不是为数据库表创建直接附加。
主要优势如下:
软件提供者可以在多个数据库表定义和结构类型中使用相同的扩展 include。这可确保以一致的方式将附加字段添加到多个表中。
软件提供者可以决定仅发布扩展 include,而不发布数据库表定义本身。

让我们看一个间接扩展的示例:
右侧的附加结构不会直接扩展数据库表 /DMO/AGENCY。而是扩展结构类型 /DMO/S_EXT_INCL_AGENCY。由于结构用作数据库表 /DMO/AGENCY 中的包含结构,因此添加到结构的任何字段也添加到数据库表中。
附加结构创建
创建附加结构
播放视频,了解如何创建附加结构。
视频:本节含 SAP 官方视频(视频 ID
1_hc7gpe26),需在 learning.sap.com 在线观看。
如何扩展数据库表定义
播放视频,了解如何扩展数据库表定义。
视频:本节含 SAP 官方视频(视频 ID
1_gjm6mbef),需在 learning.sap.com 在线观看。
扩展数据库表定义
您想要使用附加字段扩展数据库表。创建 APPEND 结构,而不是直接编辑数据库表定义。
注意
在本练习中,扩展员工数据的自有数据库表(建议名称为 Z##EMPLOY,其中##是您的组编号)。这样做是为了简单起见。要激励使用附加技术,您必须假装数据库表位于不同的命名空间中,并且您无权对其进行直接更改。
模板:
不适用
解决方案:
/LRN/S_EXT_EMPLOYEE(结构类型)
前提条件
在本练习中,您需要对在上一练习中创建的员工数据使用数据库表定义(建议名称为 Z##EMPLOY,其中 ## 是您的组编号)。如果尚未创建该数据库表,请立即将其创建为数据库表定义 /LRN/EMPLOY_REL 的副本。
任务 1: 启用可扩展性
调整员工数据数据库表的可扩展性设置(建议名称为 Z**##EMPLOY,其中 ## 是您的组编号)。允许使用扁平数据类型(类似字符和数字字段)的字段进行扩展。强制附加字段的名称以相同的字母(建议值:ZEM**)结尾。
步骤
打开员工数据数据库表的定义。
按
Ctrl + Shift + A,输入数据库表定义的名称,然后选择确定。调整扩展类别,以允许扩展包含字符型和数字字段。
将注释 @ABAPCatalog.enhancement.category 的值从
#NOT_EXTENSIBLE更改为#EXTENSIBLE_CHARACTER_NUMERIC。为附加字段定义必填后缀(建议值:
ZEM)。添加注释 @ABAPCatalog.enhancement.fieldSuffix。
如下调整代码:
@AbapCatalog.enhancement.category : #EXTENSIBLE_CHARACTER_NUMERIC
@AbapCatalog.enhancement.fieldSuffix : 'ZEM'
激活数据库表。
按
Ctrl + F3激活开发对象。
任务 2: 创建附加结构
创建附加结构(建议名称:Z##_S_EXT_EMPLOYEE,其中 ## 为组编号)以扩展员工数据的数据库表(建议名称为 Z##EMPLOY)。添加员工头衔字段(建议名称:ZZTITLE_ZEM)和员工所在国家/地区字段(建议名称:ZZCOUNTRY_ZEM)。键入含数据元素 /DMO/TITLE 和 LAND1 的新字段。
步骤
使用快速修复为此表创建附加结构(建议名称:
Z##_S_EXT_EMPLOYEE,其中##是您的组编号)。将光标置于数据库表的名称上,然后按
Ctrl + 1调用快速修复。从可用快速修复列表中,选择 为 .... 创建附加结构
在名称下输入
Z##_S_EXT_EMPLOYEE,在描述下输入**员工(附加结构)**,然后选择下一步。将附加结构分配到传输请求,然后选择完成。
在附加结构的组件列表中,定义以数据元素
/DMO/TITLE作为组件类型的新组件(建议名称:zztitle)。如下调整代码:
extend type z##employ with z##_s_ext_employee {
zztitle_zem : /dmo/title;
}
定义第二个组件(建议名称:
zzcountry_zem),其中数据元素LAND1作为其组件类型。如下调整代码:
extend type z##employ with z##_s_ext_employee {
zztitle_zem : /dmo/title;
zzcountry_zem : land1;
}
激活附加结构。
按
Ctrl + F3激活开发对象。显示扩展数据库表的工具提示描述,以确认表包含新字段。
在以
extend type开头的代码行中,将光标放在z##employ上,然后按F2。
任务 3: 填充扩展字段
在员工表中,填写扩展字段。为此,创建 ABAP 类 /LRN/CL_S4D430_CHECK_AND_FILL 的副本,并调整常量 c_version 和 c_employ_table 的值。然后激活类并将其作为控制台应用执行。
步骤
创建 ABAP 类
/LRN/CL_S4D430_CHECK_AND_FILL的副本,将其命名为Z##_S4D430_CHECK_AND_FILL并将其放置在包ZS4D430_##中。
注意
如果您在之前的练习中创建了 /LRN/CL_S4D430_CHECK_AND_FILL 的副本,请跳过此步骤。
在项目浏览器视图中,找到
/LRN/S4D430_EXERCISE包中的 ABAP 类,然后右键单击以打开上下文菜单。从上下文菜单中,选择复制。
输入包名称、副本名称和描述。然后选择下一步。
将新对象分配到传输请求,然后选择完成。
将常量
c_version的值更改为lcl_generator=>with_extensions。
提示
您可以在当前定义前添加注释符号,并从第二个定义备选项中移除注释符号。
如下调整代码:
* CONSTANTS c_version TYPE t_version VALUE lcl_generator=>employee_table_only.
* CONSTANTS c_version TYPE t_version VALUE lcl_generator=>with_relationships.
CONSTANTS c_version TYPE t_version VALUE lcl_generator=>with_extensions.
如有必要,将
c_employ_table常量的值更改为数据库表的名称。
注意
在此版本的代码中不需要 c_depment_table 常量。
向下滚动到以
CONSTANTS c_employ_table开头的代码行。如果 VALUE 后的文字仍包含
##,请将其替换为您的组编号。激活 ABAP 类并将其作为控制台应用执行。如果控制台输出包含错误,调整员工数据库表的定义,直到与数据库表定义
/LRN/EMPLOY_EXT兼容。按
Ctrl + F3激活开发对象。按
F9将 ABAP 类作为控制台应用执行。确保控制台输出包含数据库表 的文本 已填充表 ... 。