使用 CDS 视图
学习目标
分析 CDS 视图定义。
使用 CDS 视图读取数据。
CDS 视图
ABAP 核心数据服务 (ABAP CDS) 中的视图定义
ABAP 核心数据服务(简称 ABAP CDS)是用于在 ABAP 中定义和使用语义丰富数据模型的基础架构。它们使用 CDS DDL 来定义实施语义数据模型的 CDS 实体。最重要的 CDS 建模实体是 CDS 视图实体。

CDS 视图定义包含可重用的 SQL 逻辑;有时像表字段的映射一样简单,有时对计算、聚合、连接、联合等更复杂。
CDS 视图定义可以包含关联以反映数据模型的关系。视图的使用者可以使用关联来检索相关数据。
最后,注释用于在语义上丰富视图定义。此元数据由基于 CDS 视图定义构建的框架进行评估。其中一个框架是 ABAP RESTful 应用程序编程模型,我们稍后将在本课程中讨论示例。
让我们看一下 CDS 视图定义的示例。

CDS 视图定义包含在数据定义类型的资源库对象中。现在,我们来看一下数据定义 /DMO/I_CONNECTION 的源代码。
主要部分是 DEFINE VIEW ENTITY 语句。它包含 CDS 视图实体的名称以及关键字 FROM 之后的数据源。在我们的示例中,视图实体的名称为 /DMO/I_Connection,数据源为数据库表 /dmo/connection。可选附加项 AS,定义别名连接以处理视图定义内的数据源。
注意
CDS 视图实体的源也可以是另一个 CDS 视图。
一对花括号包含视图元素列表。在我们的示例中,视图元素是数据库表 /dmo/connection 的字段。前两个元素前面的关键字键值将其定义为 CDS 视图实体的键值字段。可选附加项 AS 定义每个视图元素的别名。

附加项 association 定义与其他 CDS 视图实体的关系。在我们的示例中,相关视图是 CDS 视图实体 /DMO/I_Carrier,关联的名称为 _Airline。
通过将视图添加到元素列表,此关联可供视图的使用者使用。这称为公开关联。

注释以 at 符号 (@) 开头,用于在语义上丰富使用者的视图定义。视图定义之前的注释称为实体注释。实体注释用于将视图实体的元数据定义为整体。花括号之间的注释称为元素注释。元素注释用于定义视图不同元素的元数据。

您已经学习了如何使用 数据预览 工具显示和分析数据库表的内容。此工具还可用于 CDS 视图实体。
要打开给定 CDS 实体的数据预览,请右键单击数据定义中的任意位置,然后选择打开方式→数据预览。或者,将光标置于数据定义中的任意位置,然后按 F8。
该工具显示 CDS 实体返回的数据。相同的功能可用于对数据进行排序或过滤并调整显示。
如果视图定义包含一个或多个关联,则可以使用它们来显示相关数据。为此,请按以下方式继续:
右键单击显示中的行。
从上下文菜单中,选择 关注关联 。
从可用关联列表中,选择您感兴趣的关联。

如果要查找具有特定数据库表作为源的所有 CDS 视图,可以使用 ADT 的使用位置列表工具。要使用此工具,请执行以下操作:
打开数据库表的定义。
右键单击源代码中的任意位置,然后从上下文菜单中选择 获取使用位置列表 。或者,您可以按 Ctrl + Shift + G,或从工具栏中选择具有相同符号的按钮。
搜索 视图显示直接使用数据库表的所有开发对象的列表。

例如,如果您只对特定包或特定对象类型的对象感兴趣,则可以将过滤器应用于调用清单。该示例说明了如何过滤使用表的 CDS 视图。
如何分析 CDS 视图
演示:观看演示(SAP 官方交互式练习)
ABAP SQL 中的 CDS 视图

在 ABAP 中实施 SELECT 语句时,可以使用 CDS 视图实体作为数据源,而不是直接从数据库表中读取。这有几个优点。
重用 CDS 视图中包含的 SQL 逻辑
使用关联简洁、易读地读取相关数据
有时,视图和视图元素的名称比数据库表和表字段的技术名称更具可读性
示例中的 SELECT 语句使用 CDS 视图实体 /DMO/I_Connection 作为数据源。
注意
请注意,FIELDS 子句和 WHERE 条件中使用的名称是视图元素的别名。
FIELDS 子句中的第三个元素使用公开的关联 _Airline。它从关联的 CDS 视图实体 /DMO/I_Carrier 中读取元素 Name。这种元素称为路径表达式。反斜线 () 是关联名称的强制前缀。
分析和使用 CDS 视图实体
在本练习中,您将从 CDS 视图实体而不是直接从数据库表中读取。这还可以让您轻松访问航空公司名称。
模板:
/LRN/CL_S4D400_DBS_SELECT(全局类)
解决方案:
/LRN/CL_S4D400_DBS_CDS(全局类)
任务 1: 复制模板(可选)
复制模板类。如果您已完成上一练习,则可以跳过此任务并继续编辑类 ZCL_##_SELECT。
步骤
将类
/LRN/CL_S4D400_DBS_SELECT复制到您自己的包中的类(建议名称:ZCL_##_CDS,其中 ## 代表组编号)。打开全局类
/LRN/CL_S4D400_DBS_SELECT的源代码。将项目浏览器视图与编辑器链接。
在项目浏览器视图中,右键单击类
/LRN/CL_S4D400_DBS_SELECT以打开上下文菜单。从上下文菜单中,选择复制 ....
在包字段中输入包的名称。在名称字段中,输入名称
ZCL_##_CDS,其中 ## 代表组编号。调整描述,然后选择下一步。
确认传输请求并选择完成。
任务 2: 分析 CDS 视图实体
分析 CDS 视图实体 /DMO/I_Connection 的定义。
步骤
打开包含 CDS 视图实体
/DMO/I_Connection定义的开发对象。从 eclipse 工具栏中,选择打开 ABAP 开发对象或按
Ctrl + Shift + A。在输入字段中,输入
/DMO/I_Con作为搜索字符串。在匹配项目列表中,单击 /DMO/I_CONNECTION(数据定义),然后选择确定。
分析 CDS 视图实体的元素列表。
导航到花括号 ({ }) 对之间的逗号分隔列表。
您可以在关键字
AS之后找到别名。打开关联
_Airline的目标的元素信息 (F2)。单击
as _Airline之前的/DMO/I_Carrier并按F2显示元素信息。
任务 3: 声明附加属性
使用专用实例属性 carrier_name 扩展局部类 lcl_connection。将新属性的一些输出添加到方法 get_output() 的实施中。
注意
尚未填充新属性。为了填充,我们将在本练习的下一个任务中调整 SELECT 语句。
步骤
返回到全局类中的局部类
lcl_connection。在全局类中,选择局部类型。
将以下专用属性添加到类定义中:
属性
属性名称 |
范围 |
数据类型 |
|---|---|---|
|
实例 |
/DMO/CARRIER_NAME |
如下调整代码:
PRIVATE SECTION.
DATA carrier_id TYPE /dmo/carrier_id.
DATA connection_id TYPE /dmo/connection_id.
DATA airport_from_id TYPE /dmo/airport_from_id.
DATA airport_to_id TYPE /dmo/airport_to_id.
DATA carrier_name TYPE /dmo/carrier_name.
ENDCLASS.
扩展方法
get_output的实施。将承运方名称添加到具有承运方标识的字符串模板。导航到方法
get_output的实施。将语句
APPEND |Carrier: { carrier_id }| TO r_output.替换为以下语句:
APPEND |Carrier: { carrier_id } { carrier_name }| TO r_output.
激活此类。执行并分析控制台输出。
按
Ctrl + F3激活类。按
F9键运行类。
任务 4: 使用 CDS 视图实体
在方法**构造函数的**实施中,将从数据库表 /dmo/connection 中读取的 SELECT 语句替换为从 CDS 视图实体 /DMO/I_Connection 读取的 SELECT 语句。
步骤
在方法**
构造函数的**实现中,注释 SELECT 语句。选择属于
SELECT SINGLE ... .的所有行。按
Ctrl + <在每个选定行前添加星号 (*)。在注释代码之后,添加一个从 CDS 视图
/DMO/I_Connection读取单个记录的 SELECT 语句。如下调整代码:
* SELECT SINGLE
* FROM /dmo/connection
* FIELDS airport_from_id, airport_to_id
* WHERE carrier_id = @i_carrier_id
* AND connection_id = @i_connection_id
* INTO ( @airport_from_id, @airport_to_id ).
SELECT SINGLE
FROM /DMO/I_Connection
实施 FIELDS 子句。读取视图元素
DepartureAirport和DestinationAirport。此外,从关联_Airline的目标中读取视图元素名称。
提示
使用自动完成(Ctrl + 空格)输入名称。
在
FROM /DMO/I_Connection后输入FIELDS。留空后,按 **
Ctrl + 空格**键,然后选择 DepartureAirport。在逗号和空格后再次按 **
Ctrl + 空格**键,然后选择DestinationAirport。在逗号和空格后键入反斜杠 (),按 **
Ctrl + 空格**并选择 _Airline。在
_Airline之后,立即输入破折号 (-),按 **Ctrl + 空格**并选择名称。完整的 FIELDS 子句应如下所示:
FIELDS DepartureAirport, DestinationAirport, \_Airline-Name
实施 WHERE 条件。使用导入参数
i_carrier_id 和 i_****connection_id的值限制 CDS 视图实体的关键元素。不要忘记使用前缀 @ 转义参数。
提示
使用自动完成(Ctrl + 空格)输入元素名称和参数名称。
在 FIELDS 子句后添加以下代码:
WHERE AirlineID = @i_carrier_id
AND ConnectionID = @i_connection_id
实现 INTO 子句。将 SELECT 结果存储在属性
airport_from_id、airport_to_id和carrier_name中。不要忘记使用前缀 @ 转义属性。
提示
使用自动完成(Ctrl + 空格)输入属性名称。
如下调整代码:
WHERE AirlineID = @i_carrier_id
AND ConnectionID = @i_connection_id
INTO ( @airport_from_id, @airport_to_id, @carrier_name ).
完整的 SELECT 语句应如下所示:
SELECT SINGLE
FROM /DMO/I_Connection
FIELDS DepartureAirport, DestinationAirport, \_Airline-Name
WHERE AirlineID = @i_carrier_id
AND ConnectionID = @i_connection_id
INTO ( @airport_from_id, @airport_to_id, @carrier_name ).
激活此类。执行并分析控制台输出。检查新属性的输出是否显示数据。
按
Ctrl + F3激活类。按
F9键运行类。