扩展字典对象

学习目标

  • 使用附加结构扩展字典对象。

附加结构

您已经了解 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**)结尾。

步骤

  1. 打开员工数据数据库表的定义。

  2. Ctrl + Shift + A,输入数据库表定义的名称,然后选择确定

  3. 调整扩展类别,以允许扩展包含字符型和数字字段。

  4. 将注释 @ABAPCatalog.enhancement.category 的值从 #NOT_EXTENSIBLE 更改为 #EXTENSIBLE_CHARACTER_NUMERIC

  5. 为附加字段定义必填后缀(建议值:ZEM)。

  6. 添加注释 @ABAPCatalog.enhancement.fieldSuffix

  7. 如下调整代码:

@AbapCatalog.enhancement.category    : #EXTENSIBLE_CHARACTER_NUMERIC
@AbapCatalog.enhancement.fieldSuffix : 'ZEM'
  1. 激活数据库表。

  2. Ctrl + F3 激活开发对象。

任务 2: 创建附加结构

创建附加结构(建议名称:Z##_S_EXT_EMPLOYEE,其中 ## 为组编号)以扩展员工数据的数据库表(建议名称为 Z##EMPLOY)。添加员工头衔字段(建议名称:ZZTITLE_ZEM)和员工所在国家/地区字段(建议名称:ZZCOUNTRY_ZEM)。键入含数据元素 /DMO/TITLELAND1 的新字段。

步骤

  1. 使用快速修复为此表创建附加结构(建议名称:Z##_S_EXT_EMPLOYEE,其中 ## 是您的组编号)。

  2. 将光标置于数据库表的名称上,然后按 Ctrl + 1 调用快速修复。

  3. 从可用快速修复列表中,选择 为 .... 创建附加结构

  4. 名称下输入 Z##_S_EXT_EMPLOYEE,在描述下输入**员工(附加结构)**,然后选择下一步

  5. 将附加结构分配到传输请求,然后选择完成

  6. 在附加结构的组件列表中,定义以数据元素 /DMO/TITLE 作为组件类型的新组件(建议名称:zztitle)。

  7. 如下调整代码:

extend type z##employ with z##_s_ext_employee {
zztitle_zem : /dmo/title;
}
  1. 定义第二个组件(建议名称:zzcountry_zem),其中数据元素 LAND1 作为其组件类型。

  2. 如下调整代码:

extend type z##employ with z##_s_ext_employee {
zztitle_zem   : /dmo/title;
zzcountry_zem : land1;
}
  1. 激活附加结构。

  2. Ctrl + F3 激活开发对象。

  3. 显示扩展数据库表的工具提示描述,以确认表包含新字段。

  4. 在以 extend type 开头的代码行中,将光标放在 z##employ 上,然后按 F2

任务 3: 填充扩展字段

在员工表中,填写扩展字段。为此,创建 ABAP 类 /LRN/CL_S4D430_CHECK_AND_FILL 的副本,并调整常量 c_versionc_employ_table 的值。然后激活类并将其作为控制台应用执行。

步骤

  1. 创建 ABAP 类 /LRN/CL_S4D430_CHECK_AND_FILL 的副本,将其命名为 Z##_S4D430_CHECK_AND_FILL 并将其放置在包 ZS4D430_## 中。

注意

如果您在之前的练习中创建了 /LRN/CL_S4D430_CHECK_AND_FILL 的副本,请跳过此步骤。

  1. 在项目浏览器视图中,找到 /LRN/S4D430_EXERCISE 包中的 ABAP 类,然后右键单击以打开上下文菜单。

  2. 从上下文菜单中,选择复制

  3. 输入包名称、副本名称和描述。然后选择下一步

  4. 将新对象分配到传输请求,然后选择完成

  5. 将常量 c_version 的值更改为 lcl_generator=>with_extensions

提示

您可以在当前定义前添加注释符号,并从第二个定义备选项中移除注释符号。

  1. 如下调整代码:

* 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.
  1. 如有必要,将 c_employ_table 常量的值更改为数据库表的名称。

注意

在此版本的代码中不需要 c_depment_table 常量。

  1. 向下滚动到以 CONSTANTS c_employ_table 开头的代码行。

  2. 如果 VALUE 后的文字仍包含 ##,请将其替换为您的组编号。

  3. 激活 ABAP 类并将其作为控制台应用执行。如果控制台输出包含错误,调整员工数据库表的定义,直到与数据库表定义 /LRN/EMPLOY_EXT 兼容。

  4. Ctrl + F3 激活开发对象。

  5. F9 将 ABAP 类作为控制台应用执行。

  6. 确保控制台输出包含数据库表 的文本 已填充表 ...