创建元数据扩展
学习目标
使用 CDS 元数据扩展扩展视图。
元数据扩展

在最后一部分中,您已了解如何使用 CDS 视图扩展将全新的元素添加到 CDS 视图的元素列表中。但是,当您想要向现有元素添加注释或覆盖注释值时,创建 CDS 视图扩展不是正确的方法。要添加和覆盖注释,必须创建 CDS 元数据扩展。CDS 元数据扩展的定义以关键字 ANNOTATE VIEW 开头,后跟目标实体的名称。
让我们看一个示例:左侧的 CDS 视图实体 /DMO/C_AgencyTP 定义元素 AgencyID 等。
右侧的 CDS 元数据扩展在其元素列表中重复此元素名称 AgencyID,即在花括号对内,并在其前面添加注释 @EnduserText.label: 'Customer Text'。
元数据扩展存在以下限制:
无法在元数据扩展中定义新元素。您只能处理目标实体的现有元素并向其添加注释。
元数据扩展并非支持所有注释。允许的注释列表主要包含与 UI 开发、分析和搜索功能相关的框架特定注释。
作为创建 CDS 元数据扩展的前提条件,目标实体的所有者已通过将 @Metadata.allowExtensions: true 添加到定义显式允许此操作。
在元数据扩展中,必须为注释 @Metadata.layer 指定值。通过此注释,可以为同一 CDS 实体创建多个元数据扩展。它用于控制优先级,以防不同元数据扩展的注释值相互冲突。下面,我们来详细了解一下。

当同一 CDS 实体有多个元数据扩展时,语法检查可确保它们包含注释 @Metadata.layer 的不同值。换句话说,由于目前支持五个不同的值,因此最多可以为同一基础实体定义五个元数据扩展。优先级如下:
#CUSTOMER 覆盖所有其他层。
#PARTNER 覆盖除 #CUSTOMER 之外的所有其他层。
#行业#覆盖#本地化#和#核心#。
#LOCALIZATION 仅覆盖 #CORE 和
#CORE 的优先级最低。可以在任何其他元数据扩展中覆盖层 #CORE 上的元数据。
注意
在 ABAP RESTful 应用程序编程模型中,最好将 UI 相关元数据置于层 #CORE 的元数据扩展中。这为行业解决方案、合作伙伴和客户提供了根据自身需求调整(覆盖)UI 配置的优雅方式。
元数据扩展创建

CDS 元数据扩展是自己的开发对象。它们未在 CDS 数据定义中定义。
要定义 CDS 元数据扩展,请执行以下操作:
在项目浏览器中,找到要扩展的 CDS 实体的数据定义。
右键单击数据定义并选择 新建 元数据扩展 。
如有必要,调整包,然后输入新对象的名称和描述。然后选择 下一步 。
输入传输请求,然后选择 下一步 。
从模板列表中选择 注释视图 ,然后选择 完成 。
注意
还有一个*"注释实体"*模板。此模板使用关键字
ANNOTATE ENTITY而不是ANNOTATE VIEW。ANNOTATE ENTITY可用于任何类型的 CDS 实体,但可用注释集较小。我们建议您在为 CDS 视图创建元数据扩展而不是为其他 CDS 对象之一创建元数据扩展时使用ANNOTATE VIEW。
创建 CDS 元数据扩展
想要扩展其中一个视图实体的元数据。在第一步中,将现有注释外包到 CDS 元数据扩展。然后,创建第二个元数据扩展以添加更多注释并覆盖现有注释。
模板:
不适用
解决方案:
/LRN/C_EMPLOYEE_MDX(数据定义)
/LRN/C_EMPLOYEE_MDX(元数据扩展)
/LRN/C_EMPLOYEE_MDX2(元数据扩展)
前提条件
在本练习中,您需要具有员工数据参数的视图实体(建议名称为 Z##_C_EmployeeQueryP)。如果尚未完成相关练习,请创建数据定义 /LRN/C_EMPLOYEE_EXT 的副本。
任务 1: 提取元数据扩展
使用员工数据的参数调整视图实体的定义(建议名称为 Z##_C_EmployeeQueryP),并将允许此操作的所有注释提取到最低层的新元数据扩展中。为数据定义和元数据扩展使用相同的名称。提取后,使用快速修复以允许扩展视图实体。
步骤
打开含员工数据参数的视图实体的定义,并确保其处于活动状态。
按
Ctrl + Shift + A。在搜索字段中,输入
Z##_C_,其中##是您的组编号。从匹配项目清单中,选择条目 Z##_C_EmployeeQueryP 并选择确定。
按
Ctrl + F3激活开发对象。使用重构工具,将所有可用注释提取到新的元数据扩展中。
从 Eclipse 菜单中选择源代码→提取元数据扩展。
在扩展实体字段中,输入
Z##_C,按 **Ctrl + 空格**键,然后选择要扩展的 CDS 视图实体的名称 (Z##_C_EmployeeQueryP) 。将该名称从扩展实体字段复制到名称字段。
输入描述(例如**
员工查询(元数据)**),然后选择下一步。确认传输请求,然后选择下一步。
选择右侧的全部展开并分析可以提取的注释。
选择右侧的全选和底部的完成。
使用代码完整化将元数据扩展的层设置为优先级最低的值。
在 @Metadata.layer 注释中,移除占位符
layer。按 **
Ctrl + 空格**键调用代码完成。从建议清单中选择值 #CORE,因为此层的优先级最低。
使用快速修复调整注释视图实体,以便允许元数据扩展。
将光标放在以
annotate view开头的代码行中,然后按Ctrl + 1调用快速修复。或者,您可以选择此代码行旁边的带有灯泡的错误图标。从可用快速修复列表中,选择将注释 'Metadata.allowExtensions' 添加到基础视图。
激活元数据扩展和带注释的视图实体。
按
Ctrl + Shift + F3激活所有非活动开发对象。选择全选和确定。
选择全选并激活。
在活动注释工具中打开注释视图实体,并验证某些注释现在是否来自元数据扩展。
右键单击源代码中的任意位置,然后选择打开方式→活动注释。
结果
对于某些注释, 来源数据源 列应包含您的元数据扩展。
任务 2: 创建元数据扩展
根据适当的模板,为与之前相同的视图实体创建第二个元数据扩展(建议名称:Z##_EMPLOYEE_QUERYP2)。选择具有最高优先级的元数据层,覆盖 P_DATE 参数的标签并为 AssistantName 视图元素添加标签。
步骤
在项目浏览器中,找到您在上一个任务中扩展的视图实体的定义。
例如,展开包 **
ZS4D430_##**的核心数据服务→数据定义子节点。对于此视图实体,基于 使用参数的注释视图 模板创建新的 CDS 元数据扩展。
右键单击数据定义名称以打开上下文菜单,然后选择 新建 元数据扩展 。
将值从扩展实体字段复制到名称字段,并添加字符
2以将其与现有元数据扩展区分开来。输入描述(例如**
员工查询(最终元数据)**),然后选择下一步。确认传输请求,然后选择下一步。
从可用模板列表中选择 带参数的注释视图 ,然后选择 完成 。
使用代码完整化将元数据扩展的层设置为具有最高优先级的值。
在 @Metadata.layer 注释中,移除占位符
layer。按 **
Ctrl + 空格**键调用代码完成。从建议清单中选择值 #CUSTOMER,因为此层具有最高优先级。
将占位符
parameter_name替换为p_date,然后为此参数添加新标签,例如**, 货币换算日期** 。如下调整代码:
@Metadata.layer: #CUSTOMER
annotate view Z##_C_EmployeeQueryP
with parameters
@EndUserText.label: 'Currency Conversion Date'
p_date
{
element_name;
}
将占位符
element_name替换为AssistantName,然后为此视图元素添加标签,例如**部门助理**。如下调整代码:
@Metadata.layer: #CUSTOMER
annotate view Z##_C_EmployeeQueryP
with parameters
@EndUserText.label: 'Currency Conversion Date'
p_date
{
@EndUserText.label: 'Department Assistant'
AssistantName;
}
激活新的元数据扩展。
按
Ctrl + F3激活开发对象。在活动注释工具中打开注释的视图实体,并验证
p_date参数的标签是否来自新的元数据扩展。右键单击源代码中的任意位置,然后选择打开方式→活动注释。