基于视图构建视图

学习目标

  • 定义从其他视图读取的 CDS 视图。

  • 控制元素注释的传播。

视图视图 - 动机

定义 CDS 视图实体时,不仅可以从数据库表中读取,还可以使用其他 CDS 视图作为数据源。为什么要在视图之上构建视图?

  • 第一个原因类似于在类和方法中构建源代码时的推理:

  • 重用现有功能

  • 避免冗余

  • 支持错误分析和维护

  • 第二个参数更具技术性。在同一 CDS 视图中嵌套 SQL 表达式和 SQL 函数时,存在一些限制。嵌套视图是克服此类限制的常见技术。

  • 嵌套视图的最重要原因可能是数据模型分层。例如,在 ABAP RESTful 编程模型中,建议您在数据模型视图之上定义消耗视图。数据模型视图包含常规数据模型逻辑时,消耗视图会添加消耗特定逻辑和元数据。

传播的注释

如果 CDS 视图实体从其他视图实体中读取,则可以从源视图继承元数据。这称为注释传播

在此示例中,CDS 视图实体 C_Employee 使用 CDS 视图实体 R_Employee 作为数据源。缺省情况下,R_Employee 的元素注释传播到 C_Employee。因此,C_Employee 中再次不需要注释 @Semantics.amount.currencyCode

传播仅限于元素注释。实体和视图注释永远不会传播。

实体注释 @Metadata.ignorePropagatedAnnotations 允许您控制元素注释的传播。如果读取 CDS 视图实体中缺少元素注释,或者将其设置为值 false,则会继承元素注释。使用 @Metadata.ignorePropagatedAnnotations: true 时,将禁用元素注释的传播。

在我们的示例中,如果 CDS 视图实体 C_Employee 标注为 @Metadata.ignorePropagatedAnnotations: true,则不会传播元素 AnnualSalary@Semantics.amount.currencyCode 注释。语法检查显示错误,因为金额字段缺少必填注释 。

如何基于视图定义视图

播放视频,了解如何在视图顶部定义视图。

视频:本节含 SAP 官方视频(视频 ID 1_0n6fizwg),需在 learning.sap.com 在线观看。

在视图上定义视图

您想要将数据模型的基本定义与其特定用途(使用)分开。为此,在现有数据模型实体之上构建新的 CDS 视图实体。

模板:

  • 不适用

解决方案:

  • /LRN/C_EMPLOYEE_ANN(数据定义)

前提条件

在本练习中,您需要先前练习中创建和注释的员工数据的视图实体(建议名称为 Z##_R_Employee,其中 ## 是您的组编号)。如果尚未完成上一练习,请创建数据定义 /LRN/R_EMPLOYEE_ANN 的副本。

任务 1: 定义 CDS 视图实体

定义新的 CDS 视图实体,该实体从员工数据的 CDS 视图实体中读取(建议名称:Z##_C_Employee,其中 ## 是您的组编号)。使用将实体 Z##_R_Employee 的所有视图元素添加到新视图的元素列表并从基础视图中接管键值定义的模板。

步骤

  1. 在您自己的包中,创建新的数据定义(建议名称:Z##_C_EMPLOYEE,其中 ## 是您的组编号)。将现有视图实体指定为参考对象,然后选择定义视图实体模板以生成定义语句、某些标准注释和元素列表。

  2. 在项目浏览器视图中,右键单击现有数据定义 Z##_R_EMPLOYEE 以打开上下文菜单。

  3. 从上下文菜单中,选择新建数据定义

  4. 确认字段包含包的名称,并且参考对象字段包含数据定义的名称。

  5. 名称字段中,输入 CDS 视图实体的名称(Z##_C_Employee,其中 ## 是您的组编号)。

  6. 描述字段中输入**员工(消耗)**,然后选择下一步

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

警告

确保尚未选择完成。如果执行此操作,则无法选择要使用的模板。

  1. 模板列表中,选择定义视图实体,然后选择完成

  2. 调整 @ObjectModel.usageType 注释。使用与基本视图中相同的值。

  3. 如下调整代码:

@ObjectModel.usageType:{
serviceQuality: #D,
sizeCategory:   #M,
dataClass:      #MASTER
}
  1. 应用源代码格式设置。

  2. 从 eclipse 菜单中选择 源代码格式 。或者,选择 Shift + F1

任务 2: 传播注释

在新视图中启用元素注释的传播,并分析活动注释视图中的结果。然后再次禁用传播并直接指定必需元素注释。

步骤

  1. 在新数据定义中,启用元素注释的传播。

  2. 将注释 @Metadata.ignorePropagatedAnnotations 的值从 true 更改为 false

  3. 激活数据定义。

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

  5. 打开活动注释视图,然后分析视图元素 AnnualSalaryCurrencyCode 的元素注释值。

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

  7. 激活的注释 视图在编辑器视图下方显示为新标签。

  8. 活动注释视图的工具栏中,选择全部折叠

  9. 展开 Z##_C_EMPLOYEE年薪@语义金额

  10. 在新数据定义中,再次禁用元素注释的传播。

  11. 将注释 @Metadata.ignorePropagatedAnnotations 的值更改回 true

  12. 通过将必需元素注释直接添加到 AnnualSalary 视图元素来解决语法错误。

  13. 如下调整代码:

DepartmentId,
@Semantics.amount.currencyCode: 'CurrencyCode'
AnnualSalary,
CurrencyCode,
  1. 激活数据定义。

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