使用 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 实体返回的数据。相同的功能可用于对数据进行排序或过滤并调整显示。

如果视图定义包含一个或多个关联,则可以使用它们来显示相关数据。为此,请按以下方式继续:

  1. 右键单击显示中的行。

  2. 从上下文菜单中,选择 关注关联 。

  3. 从可用关联列表中,选择您感兴趣的关联。

如果要查找具有特定数据库表作为源的所有 CDS 视图,可以使用 ADT 的使用位置列表工具。要使用此工具,请执行以下操作:

  1. 打开数据库表的定义。

  2. 右键单击源代码中的任意位置,然后从上下文菜单中选择 获取使用位置列表 。或者,您可以按 Ctrl + Shift + G,或从工具栏中选择具有相同符号的按钮。

  3. 搜索 视图显示直接使用数据库表的所有开发对象的列表。

例如,如果您只对特定包或特定对象类型的对象感兴趣,则可以将过滤器应用于调用清单。该示例说明了如何过滤使用表的 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

步骤

  1. 将类 /LRN/CL_S4D400_DBS_SELECT 复制到您自己的包中的类(建议名称:ZCL_##_CDS,其中 ## 代表组编号)。

  2. 打开全局类 /LRN/CL_S4D400_DBS_SELECT 的源代码。

  3. 将项目浏览器视图与编辑器链接。

  4. 在项目浏览器视图中,右键单击类 /LRN/CL_S4D400_DBS_SELECT 以打开上下文菜单。

  5. 从上下文菜单中,选择复制 ....

  6. 在包字段中输入的名称。在名称字段中,输入名称 ZCL_##_CDS,其中 ## 代表组编号。

  7. 调整描述,然后选择下一步

  8. 确认传输请求并选择完成

任务 2: 分析 CDS 视图实体

分析 CDS 视图实体 /DMO/I_Connection 的定义。

步骤

  1. 打开包含 CDS 视图实体 /DMO/I_Connection 定义的开发对象。

  2. 从 eclipse 工具栏中,选择打开 ABAP 开发对象或Ctrl + Shift + A

  3. 在输入字段中,输入 /DMO/I_Con 作为搜索字符串。

  4. 在匹配项目列表中,单击 /DMO/I_CONNECTION(数据定义)然后选择确定

  5. 分析 CDS 视图实体的元素列表。

  6. 导航到花括号 ({ }) 对之间的逗号分隔列表。

  7. 您可以在关键字 AS 之后找到别名。

  8. 打开关联 _Airline 的目标的元素信息 (F2)。

  9. 单击 as _Airline 之前的 /DMO/I_Carrier 并按 F2 显示元素信息。

任务 3: 声明附加属性

使用专用实例属性 carrier_name 扩展局部类 lcl_connection。将新属性的一些输出添加到方法 get_output() 的实施中。

注意

尚未填充新属性。为了填充,我们将在本练习的下一个任务中调整 SELECT 语句。

步骤

  1. 返回到全局类中的局部类 lcl_connection

  2. 在全局类中,选择局部类型

  3. 将以下专用属性添加到类定义中:

属性

属性名称

范围

数据类型

carrier_name

实例

/DMO/CARRIER_NAME

  1. 如下调整代码:

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.
  1. 扩展方法 get_output 的实施。将承运方名称添加到具有承运方标识的字符串模板。

  2. 导航到方法 get_output 的实施。

  3. 将语句 APPEND |Carrier: { carrier_id }| TO r_output. 替换为以下语句:

APPEND |Carrier:     { carrier_id } { carrier_name }| TO r_output.
  1. 激活此类。执行并分析控制台输出。

  2. Ctrl + F3 激活类。

  3. F9 键运行类。

任务 4: 使用 CDS 视图实体

在方法**构造函数的**实施中,将从数据库表 /dmo/connection 中读取的 SELECT 语句替换为从 CDS 视图实体 /DMO/I_Connection 读取的 SELECT 语句。

步骤

  1. 在方法**构造函数的**实现中,注释 SELECT 语句。

  2. 选择属于 SELECT SINGLE ... . 的所有行。

  3. Ctrl + < 在每个选定行前添加星号 (*)。

  4. 在注释代码之后,添加一个从 CDS 视图 /DMO/I_Connection 读取单个记录的 SELECT 语句。

  5. 如下调整代码:

*    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
  1. 实施 FIELDS 子句。读取视图元素 DepartureAirportDestinationAirport。此外,从关联 _Airline 的目标中读取视图元素 名称

提示

使用自动完成(Ctrl + 空格)输入名称。

  1. FROM /DMO/I_Connection 后输入 FIELDS

  2. 留空后,按 **Ctrl + 空格**键,然后选择 DepartureAirport

  3. 在逗号和空格后再次按 **Ctrl + 空格**键,然后选择 DestinationAirport

  4. 在逗号和空格后键入反斜杠 (),按 **Ctrl + 空格**并选择 _Airline

  5. _Airline 之后,立即输入破折号 (-),按 **Ctrl + 空格**并选择名称

  6. 完整的 FIELDS 子句应如下所示:

FIELDS DepartureAirport, DestinationAirport, \_Airline-Name
  1. 实施 WHERE 条件。使用导入参数 i_carrier_id i_****connection_id 的值限制 CDS 视图实体的关键元素。不要忘记使用前缀 @ 转义参数。

提示

使用自动完成(Ctrl + 空格)输入元素名称和参数名称。

  1. 在 FIELDS 子句后添加以下代码:

WHERE AirlineID    = @i_carrier_id
AND ConnectionID = @i_connection_id
  1. 实现 INTO 子句。将 SELECT 结果存储在属性 airport_from_idairport_to_idcarrier_name 中。不要忘记使用前缀 @ 转义属性。

提示

使用自动完成(Ctrl + 空格)输入属性名称。

  1. 如下调整代码:

WHERE AirlineID    = @i_carrier_id
AND ConnectionID = @i_connection_id
INTO ( @airport_from_id, @airport_to_id, @carrier_name ).
  1. 完整的 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 ).
  1. 激活此类。执行并分析控制台输出。检查新属性的输出是否显示数据。

  2. Ctrl + F3 激活类。

  3. F9 键运行类。