定义 CDS 视图之间的关联

学习目标

  • 定义关联。

  • 公开关联。

CDS 视图中的关联

在上一课中,您了解到外键相关性表示数据库表之间的关系。同样,关联表示 CDS 实体之间的关系。

关联比外键依赖性更灵活。外键相关性始终将外键表链接到检查表。关联可以将任何关联源链接到任何关联目标。特别是,CDS 实体之间通常存在两个关联,其中两个数据库表之间存在一个外键相关性。让我们看一个示例:

数据库表 EMPLOYEE 的定义包含字段 DEPMENT_ID 的外键相关性,使用数据库表 DEPMENT 作为检查表。R_EmployeeR_Department 是从这两个数据库表中读取的 CDS 视图。在 CDS 级别,外键相关性对应于以 R_Employee 作为源、将 R_Department 作为目标的关联(关系)。它将每个员工链接到各自的部门。但是,在相反的方向上也可以有关联(关系),将一个部门链接到在该部门工作的所有员工。

关联在用作关联源的 CDS 实体的数据定义中定义。在我们的示例中,这是 CDS 视图 R_Employee 的定义。关联在视图的数据源后的 FROM 子句中定义。一个 CDS 视图定义可以包含任意数量的关联。

注意

SAP S/4HANA 的数据模型包含具有超过一百个关联的视图。

一个关联定义由以下部分组成:

关联目标

与关键字的关联后跟关联目标的名称,在我们的示例中为 CDS 视图 R_Department。关联目标应始终为 CDS 实体。可以(但不建议)CDS 视图中的关联使用数据库表作为目标。

关联名称

关联名称位于 AS 附加之后,用作关联的标识符。建议将下划线 (_) 用作 CDS 关联名称的第一个字符。在此示例中,关联名称为 _Department。

注意

从技术角度来看,定义关联名称是可选的。如果没有关联名称,关联目标的名称将用作关联的标识符。这可能会使读取代码变得困难,并使同一目标无法有多个关联。因此,强烈建议为所有关联定义关联名称。

关联条件

关联条件以关键字 ON 开头。通常,它将关联源的视图元素与关联目标的视图元素进行比较,但也可以使用其他条件。在建议的格式中,关联源的视图元素位于左侧,以 $projection. 作为前缀,关联目标的视图元素位于右侧,关联名称作为前缀。

注意

由于无需在 CDS 视图的元素清单中包含客户端字段,因此客户端字段也不会出现在关联条件中。

提示

定义关联时,利用代码完整化(Strg + 空格)插入关键字、关联目标名称和视图元素。

关联的基数

关联的基数指定关联源中一个数据集的关联目标中可能的数据集数。

在 ABAP CDS 中,基数紧接在关键字关联后的一对方括号中指定。

基数指定为 [min..max] 或仅 [max]。如果省略最小值,则使用最小值 = 0

最小值的允许值为 0 和所有正整数。最小值的最常见值为 0 和 1。

最大值的允许值是正整数,星号 (*) 表示无限制的最大数量。最大值最常见的值为 1 和 *。

注意

如果未指定基数,则使用缺省基数 [0..1]

语法检查对基数的最大值执行合理性检查。为此,将 ON 条件与关联目标的键值进行比较。如果 ON 条件完全限定主键,则需要基数 0..11..1

在此示例中,关联 _Department 的基数 0..* 导致语法警告,因为关联目标 (R_Department) 在 ON 条件中只有一个关键字段 (Id)。

此示例显示相反方向的 关联。在此,关联 _Employee 的基数 1..1 导致语法警告,因为 ON 条件中关联目标 R_Employee 的关键字段 EmployeeID 不合格。

提示

在复杂数据模型中,即使基数与 ON 条件不匹配,也可能发生基数正确的情况。在这种情况下,您只需忽略警告或使用伪注释将其禁止。

公开关联

定义新关联时,编辑器会显示未使用关联的警告。有两种方法可以使用关联:您可以使用此关联定义路径表达式(请参阅稍后)或公开该关联。

通过将关联名称添加到 CDS 视图的元素列表来公开关联。这使关联对视图的使用者可见。

注意

公开关联时,关联源的所有元素(在 ON 条件中使用)都必须是字段列表的一部分。在 ON 条件中使用 $projection 前缀时,将自动满足此前提条件。

数据预览中公开的关联

如果 CDS 视图定义包含公开关联,则可以在数据预览工具中按以下方式评估这些关联:

  1. 在数据预览中打开 CDS 视图。

  2. 选择其中一个显示的行,然后单击抬头工具栏中视图名称旁边的箭头。

提示

或者,您可以右键单击条目并选择关注关联

  1. 从可用关联列表中选择关联。

如何定义和公开 关联

播放视频,了解如何定义和公开关联。

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

定义具有关联的 CDS 视图

为部门以及部门和员工之间的关联定义基本 CDS 视图实体。

模板:

  • /LRN/R_EMPLOYEE_ANN(数据定义)

解决方案:

  • /LRN/R_DEPARTMENT_REL(数据定义)

  • /LRN/R_EMPLOYEE_REL(数据定义)

前提条件

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

任务 1: 定义部门数据的 CDS 视图实体

定义部门数据的 CDS 视图实体(建议名称:Z##_R_Department,其中 ## 是您的组编号)。让新的 CDS 视图实体从您在上一练习中创建的数据库表中读取所有字段(建议名称为:Z##DEPMENT)。

注意

如果尚未完成上一练习,则可以让 CDS 视图实体读取数据库表 /LRN/DEPMENT_REL。

步骤

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

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

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

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

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

  6. 描述字段中输入**部门(实体)**,然后选择下一步

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

警告

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

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

  2. 应用源代码格式设置。

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

  4. 激活数据定义。

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

任务 2: 定义关联

在员工数据的基本 CDS 视图实体(建议名称为 Z##_R_Employee)中,使用部门数据的新 CDS 视图实体定义并公开关联作为目标(建议关联名称:_Department)。选择与 DEPARTMENT_ID 表字段的外键关系中使用的基数相匹配的基数。

步骤

  1. 打开员工数据的基本数据定义(建议名称为 Z##_R_EMPLOYEE)。

  2. Ctrl + Shift + A

  3. 输入 Z##_R_

  4. 从匹配项目清单中选择 Z##_R_EMPLOYEE(数据定义),然后选择下一步

  5. 为具有关联名称 _Department 的部门数据定义与 CDS 视图实体的关联。

  6. 如下调整代码:

define view entity Z##_R_Employee
as select from z##employ
association to Z##_R_Department as _Department
  1. 在两个视图实体中使用部门标识字段定义 ON 条件。

提示

使用$projection.

前缀处理源视图实体的元素,并使用 the_Department.

前缀处理目标视图实体的元素。

  1. 如下调整代码:

define view entity Z##_R_Employee
as select from z##employ
association to Z##_R_Department as _Department
on $projection.DepartmentId = _Department.Id
  1. 添加与 DEPARTMENT_ID 表字段的外键关系基数匹配的基数。

注意

外键关系的基数为 0..*,1。第一部分指定每个部门的员工数。第二部分表示每个员工的部门数量。

  1. 如下调整代码:

define view entity Z##_R_Employee
as select from z##employ
association[1..1] to Z##_R_Department as _Department
on $projection.DepartmentId = _Department.Id
  1. 公开关联。

  2. 在元素列表的末尾,添加逗号和关联名称。

  3. 如下调整代码:

last_changed_at       as LastChangedAt,
_Department
}
  1. 激活 CDS 数据定义。

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

任务 3: 定义更多关联

在部门数据的基本 CDS 视图实体中,定义并公开三个关联:所有员工的关联(建议关联名称:_Employee)、部门主管的关联(建议名称:_Head)以及部门助理的关联(建议名称:_Assistant)。根据基础数据库表中的相应外键关系选择基数。

步骤

  1. 返回到部门数据的数据定义。定义协会**_员工**以处理分配到此部门的所有员工。

注意

请注意,一个部门可以有任意数量的员工,包括零。

  1. 如下调整代码:

define view entity Z##_R_Department
as select from z##depment
association [0..*] to Z##_R_Employee as _Employee
on $projection.Id = _Employee.DepartmentId
  1. 定义关联以处理部门主管的详细信息。根据基础数据库表之间的外键关系基数设置基数。

注意

在我们的模型中,部门不必有部门负责人。

  1. 如下调整代码:

define view entity Z##_R_Department
as select from z##depment
association [0..*] to Z##_R_Employee as _Employee
on $projection.Id = _Employee.DepartmentId
association [0..1] to Z##_R_Employee as _Head
on $projection.HeadId = _Head.EmployeeId
  1. 定义关联以处理部门助理的详细信息。根据基础数据库表之间的外键关系基数设置基数。

注意

在我们的模型中,没有部门助理就无法存在部门。

  1. 如下调整代码:

define view entity Z##_R_Department
as select from z##depment
association [0..*] to Z##_R_Employee as _Employee
on $projection.Id = _Employee.DepartmentId
association [0..1] to Z##_R_Employee as _Head
on $projection.HeadId = _Head.EmployeeId
association [1..1] to Z##_R_Employee as _Assistant
on $projection.AssistantId = _Assistant.EmployeeId
  1. 公开关联。

  2. 在元素列表的末尾,添加一个逗号和三个关联名称(以逗号分隔)。

  3. 如下调整代码:

last_changed_at       as LastChangedAt,
_Employee,
_Head,
_Assistant
}
  1. 激活 CDS 数据定义。

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

任务 4: 分析和使用关联

分析部门数据的 CDS 视图的技术实施,并在数据预览工具中使用导航关联。

步骤

  1. 显示用于在数据库中创建视图实体技术表示的 SQL 语句。

  2. 右键单击数据定义源代码中的任意位置,然后选择显示 SQL CREATE 语句

  3. 打开部门数据的 CDS 视图的数据预览

  4. 右键单击数据定义源代码中的任意位置,然后选择打开方式数据预览。或者,将光标置于数据定义源代码中的任意位置,然后按 F8

  5. 显示负责销售和分销部门的所有员工。

  6. 右键单击标识列中值为 SALE 的行中的任意位置,然后选择关注关联。或者,将光标置于行中的任意位置,然后按 Ctrl + G

  7. 选择 _Employee → Z##_R_Employee [0..]* 。

  8. 返回部门清单并显示管理部门的助理。

  9. 在数据预览标签上方显示的导航路径(有时称为"导航痕迹导航")中,选择 Z##_R_DEPARTMENT 返回到部门清单。

  10. 右键单击标识列中值为 ADMIN 的行中的任意位置,然后选择关注关联。或者,将光标置于行中的任意位置,然后按 Ctrl + G

  11. 选择 _Assistant → Z##_R_Employee [1..1]

  12. 在不返回到部门列表的情况下,导航至部门,此人在此工作并从那里工作到部门主管。

  13. 右键单击显示的单行中的任意位置,然后选择关注关联

  14. 选择*_Department → Z##_R_Department [1..1]* 。

  15. 右键单击显示的单行中的任意位置,然后选择关注关联

  16. 选择 _Head → Z##_R_Employee [0..1]