定义 CDS 视图之间的关联
学习目标
定义关联。
公开关联。
CDS 视图中的关联

在上一课中,您了解到外键相关性表示数据库表之间的关系。同样,关联表示 CDS 实体之间的关系。
关联比外键依赖性更灵活。外键相关性始终将外键表链接到检查表。关联可以将任何关联源链接到任何关联目标。特别是,CDS 实体之间通常存在两个关联,其中两个数据库表之间存在一个外键相关性。让我们看一个示例:
数据库表 EMPLOYEE 的定义包含字段 DEPMENT_ID 的外键相关性,使用数据库表 DEPMENT 作为检查表。R_Employee 和 R_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..1 或 1..1。
在此示例中,关联 _Department 的基数 0..* 导致语法警告,因为关联目标 (R_Department) 在 ON 条件中只有一个关键字段 (Id)。

此示例显示相反方向的 关联。在此,关联 _Employee 的基数 1..1 导致语法警告,因为 ON 条件中关联目标 R_Employee 的关键字段 EmployeeID 不合格。
提示
在复杂数据模型中,即使基数与 ON 条件不匹配,也可能发生基数正确的情况。在这种情况下,您只需忽略警告或使用伪注释将其禁止。
公开关联

定义新关联时,编辑器会显示未使用关联的警告。有两种方法可以使用关联:您可以使用此关联定义路径表达式(请参阅稍后)或公开该关联。
通过将关联名称添加到 CDS 视图的元素列表来公开关联。这使关联对视图的使用者可见。
注意
公开关联时,关联源的所有元素(在 ON 条件中使用)都必须是字段列表的一部分。在 ON 条件中使用 $projection 前缀时,将自动满足此前提条件。
数据预览中公开的关联

如果 CDS 视图定义包含公开关联,则可以在数据预览工具中按以下方式评估这些关联:
在数据预览中打开 CDS 视图。
选择其中一个显示的行,然后单击抬头工具栏中视图名称旁边的箭头。
提示
或者,您可以右键单击条目并选择关注关联。
从可用关联列表中选择关联。
如何定义和公开 关联
播放视频,了解如何定义和公开关联。
视频:本节含 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。
步骤
在您自己的包中,创建新的数据定义(建议名称:
Z##_R_DEPARTMENT,其中##是您的组编号)。将数据库表指定为参考对象,然后选择定义视图实体模板以生成定义语句、某些标准注释和元素列表。在项目浏览器视图中,右键单击数据库表定义
Z##DEPMENT以打开上下文菜单。从上下文菜单中,选择新建数据定义。
确认包字段包含包的名称,并且参考对象字段包含数据库表定义的名称。
在名称字段中,输入 CDS 视图实体的名称(
Z##_R_Department,其中 ## 是您的组编号)。在描述字段中输入**
部门(实体)**,然后选择下一步。确认传输请求,然后选择下一步。
警告
确保尚未选择完成。如果执行此操作,则无法选择要使用的模板。
从模板列表中,选择定义视图实体,然后选择完成。
应用源代码格式设置。
从 eclipse 菜单中选择 源代码→格式 。或者,选择
Shift + F1。激活数据定义。
按
Ctrl + F3激活开发对象。
任务 2: 定义关联
在员工数据的基本 CDS 视图实体(建议名称为 Z##_R_Employee)中,使用部门数据的新 CDS 视图实体定义并公开关联作为目标(建议关联名称:_Department)。选择与 DEPARTMENT_ID 表字段的外键关系中使用的基数相匹配的基数。
步骤
打开员工数据的基本数据定义(建议名称为
Z##_R_EMPLOYEE)。按
Ctrl + Shift + A。输入
Z##_R_。从匹配项目清单中选择
Z##_R_EMPLOYEE(数据定义),然后选择下一步。为具有关联名称
_Department的部门数据定义与 CDS 视图实体的关联。如下调整代码:
define view entity Z##_R_Employee
as select from z##employ
association to Z##_R_Department as _Department
在两个视图实体中使用部门标识字段定义 ON 条件。
提示
使用$projection.
前缀处理源视图实体的元素,并使用 the_Department.
前缀处理目标视图实体的元素。
如下调整代码:
define view entity Z##_R_Employee
as select from z##employ
association to Z##_R_Department as _Department
on $projection.DepartmentId = _Department.Id
添加与
DEPARTMENT_ID表字段的外键关系基数匹配的基数。
注意
外键关系的基数为 0..*,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
公开关联。
在元素列表的末尾,添加逗号和关联名称。
如下调整代码:
last_changed_at as LastChangedAt,
_Department
}
激活 CDS 数据定义。
按
Ctrl + F3激活开发对象。
任务 3: 定义更多关联
在部门数据的基本 CDS 视图实体中,定义并公开三个关联:所有员工的关联(建议关联名称:_Employee)、部门主管的关联(建议名称:_Head)以及部门助理的关联(建议名称:_Assistant)。根据基础数据库表中的相应外键关系选择基数。
步骤
返回到部门数据的数据定义。定义协会**
_员工**以处理分配到此部门的所有员工。
注意
请注意,一个部门可以有任意数量的员工,包括零。
如下调整代码:
define view entity Z##_R_Department
as select from z##depment
association [0..*] to Z##_R_Employee as _Employee
on $projection.Id = _Employee.DepartmentId
定义关联以处理部门主管的详细信息。根据基础数据库表之间的外键关系基数设置基数。
注意
在我们的模型中,部门不必有部门负责人。
如下调整代码:
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
定义关联以处理部门助理的详细信息。根据基础数据库表之间的外键关系基数设置基数。
注意
在我们的模型中,没有部门助理就无法存在部门。
如下调整代码:
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
公开关联。
在元素列表的末尾,添加一个逗号和三个关联名称(以逗号分隔)。
如下调整代码:
last_changed_at as LastChangedAt,
_Employee,
_Head,
_Assistant
}
激活 CDS 数据定义。
按
Ctrl + F3激活开发对象。
任务 4: 分析和使用关联
分析部门数据的 CDS 视图的技术实施,并在数据预览工具中使用导航关联。
步骤
显示用于在数据库中创建视图实体技术表示的 SQL 语句。
右键单击数据定义源代码中的任意位置,然后选择显示 SQL CREATE 语句。
打开部门数据的 CDS 视图的数据预览。
右键单击数据定义源代码中的任意位置,然后选择打开方式→数据预览。或者,将光标置于数据定义源代码中的任意位置,然后按
F8。显示负责销售和分销部门的所有员工。
右键单击标识列中值为
SALE的行中的任意位置,然后选择关注关联。或者,将光标置于行中的任意位置,然后按Ctrl + G。选择 _Employee → Z##_R_Employee [0..]* 。
返回部门清单并显示管理部门的助理。
在数据预览标签上方显示的导航路径(有时称为"导航痕迹导航")中,选择 Z##_R_DEPARTMENT 返回到部门清单。
右键单击标识列中值为
ADMIN的行中的任意位置,然后选择关注关联。或者,将光标置于行中的任意位置,然后按Ctrl + G。选择 _Assistant → Z##_R_Employee [1..1] 。
在不返回到部门列表的情况下,导航至部门,此人在此工作并从那里工作到部门主管。
右键单击显示的单行中的任意位置,然后选择关注关联。
选择*_Department → Z##_R_Department [1..1]* 。
右键单击显示的单行中的任意位置,然后选择关注关联。
选择 _Head → Z##_R_Employee [0..1] 。