创建元数据扩展

学习目标

  • 使用 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 元数据扩展,请执行以下操作:

  1. 在项目浏览器中,找到要扩展的 CDS 实体的数据定义。

  2. 右键单击数据定义并选择 新建 元数据扩展 。

  3. 如有必要,调整包,然后输入新对象的名称和描述。然后选择 下一步 。

  4. 输入传输请求,然后选择 下一步 。

  5. 从模板列表中选择 注释视图 ,然后选择 完成 。

注意

还有一个*"注释实体"*模板。此模板使用关键字 ANNOTATE ENTITY 而不是 ANNOTATE VIEWANNOTATE 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),并将允许此操作的所有注释提取到最低层的新元数据扩展中。为数据定义和元数据扩展使用相同的名称。提取后,使用快速修复以允许扩展视图实体。

步骤

  1. 打开含员工数据参数的视图实体的定义,并确保其处于活动状态。

  2. Ctrl + Shift + A

  3. 在搜索字段中,输入 Z##_C_ ,其中 ## 是您的组编号。

  4. 从匹配项目清单中,选择条目 Z##_C_EmployeeQueryP 并选择确定

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

  6. 使用重构工具,将所有可用注释提取到新的元数据扩展中。

  7. Eclipse 菜单中选择源代码提取元数据扩展

  8. 扩展实体字段中,输入 Z##_C,按 **Ctrl + 空格**键,然后选择要扩展的 CDS 视图实体的名称 (Z##_C_EmployeeQueryP) 。

  9. 将该名称从扩展实体字段复制到名称字段。

  10. 输入描述(例如**员工查询(元数据)**),然后选择下一步

  11. 确认传输请求,然后选择下一步

  12. 选择右侧的全部展开并分析可以提取的注释。

  13. 选择右侧的全选和底部的完成

  14. 使用代码完整化将元数据扩展的层设置为优先级最低的值。

  15. @Metadata.layer 注释中,移除占位符 layer

  16. 按 **Ctrl + 空格**键调用代码完成。

  17. 从建议清单中选择值 #CORE,因为此层的优先级最低。

  18. 使用快速修复调整注释视图实体,以便允许元数据扩展。

  19. 将光标放在以 annotate view 开头的代码行中,然后按 Ctrl + 1 调用快速修复。或者,您可以选择此代码行旁边的带有灯泡的错误图标。

  20. 从可用快速修复列表中,选择将注释 'Metadata.allowExtensions' 添加到基础视图

  21. 激活元数据扩展和带注释的视图实体。

  22. Ctrl + Shift + F3 激活所有非活动开发对象。

  23. 选择全选确定

  24. 选择全选激活

  25. 在活动注释工具中打开注释视图实体,并验证某些注释现在是否来自元数据扩展。

  26. 右键单击源代码中的任意位置,然后选择打开方式活动注释

结果

对于某些注释, 来源数据源 列应包含您的元数据扩展。

任务 2: 创建元数据扩展

根据适当的模板,为与之前相同的视图实体创建第二个元数据扩展(建议名称:Z##_EMPLOYEE_QUERYP2)。选择具有最高优先级的元数据层,覆盖 P_DATE 参数的标签并为 AssistantName 视图元素添加标签。

步骤

  1. 在项目浏览器中,找到您在上一个任务中扩展的视图实体的定义。

  2. 例如,展开包 **ZS4D430_##**的核心数据服务数据定义子节点。

  3. 对于此视图实体,基于 使用参数的注释视图 模板创建新的 CDS 元数据扩展。

  4. 右键单击数据定义名称以打开上下文菜单,然后选择 新建 元数据扩展

  5. 将值从扩展实体字段复制到名称字段,并添加字符 2 以将其与现有元数据扩展区分开来。

  6. 输入描述(例如**员工查询(最终元数据)**),然后选择下一步

  7. 确认传输请求,然后选择下一步

  8. 从可用模板列表中选择 带参数的注释视图 ,然后选择 完成

  9. 使用代码完整化将元数据扩展的层设置为具有最高优先级的值。

  10. @Metadata.layer 注释中,移除占位符 layer

  11. 按 **Ctrl + 空格**键调用代码完成。

  12. 从建议清单中选择值 #CUSTOMER,因为此层具有最高优先级。

  13. 将占位符 parameter_name 替换为 p_date ,然后为此参数添加新标签,例如** 货币换算日期** 。

  14. 如下调整代码:

@Metadata.layer: #CUSTOMER
annotate view Z##_C_EmployeeQueryP
with parameters
@EndUserText.label: 'Currency Conversion Date'
p_date
{
element_name;
}
  1. 将占位符 element_name 替换为 AssistantName,然后为此视图元素添加标签,例如**部门助理**。

  2. 如下调整代码:

@Metadata.layer: #CUSTOMER
annotate view Z##_C_EmployeeQueryP
with parameters
@EndUserText.label: 'Currency Conversion Date'
p_date
{
@EndUserText.label: 'Department Assistant'
AssistantName;
}
  1. 激活新的元数据扩展。

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

  3. 在活动注释工具中打开注释的视图实体,并验证 p_date 参数的标签是否来自新的元数据扩展。

  4. 右键单击源代码中的任意位置,然后选择打开方式活动注释