扩展 CDS 视图

学习目标

  • 使用 CDS 视图扩展扩展 CDS 实体。

CDS 视图扩展

从技术上讲,CDS 实体的扩展与字典对象的扩展非常相似。客户或合作伙伴创建新的开发对象,这些开发对象参考他们想要扩展的开发对象。在 ABAP 字典中,他们创建 APPEND 结构,在 CDS 中定义 CDS 实体扩展。CDS 视图实体通过 CDS 视图扩展进行扩展。CDS 视图扩展使用语句 EXTEND VIEW ENTITY 在专用数据定义中定义。现有 CDS 视图可具有一个或多个 CDS 视图扩展。

在此示例中,左侧的 CDS 视图实体 /DMO/E_Agency 在元素列表中包含一个元素。右侧的视图扩展将元素 ZZCategoryZAG 添加到此列表。两个数据定义之间的链接通过 CDS 视图实体名称在关键字 EXTEND VIEW ENTITY 之后建立。

注意

处理字段或元素时,CDS 视图实体扩展必须指定数据源名称。在此示例中,它使用在 CDS 视图实体 /DMO/E_Agency 中定义的代理作为数据库表 /DMO/AGENCY 的别名。

CDS 视图扩展还可以定义附加关联。根据可扩展性设置(请参阅下文),它们可以公开这些关联或将其用于元素列表的路径表达式。

在此示例中,CDS 视图扩展定义关联 _ZZTextZAG 并将其添加到 CDS 视图实体 /DMO/E_Agency 的元素列表中。

CDS 实体的可扩展性控制

CDS 实体的可扩展性控制与字典对象的可扩展性控制非常相似。大多数注释具有类似的语法和含义。有关完整文档,请参阅 ABAP 关键字文档

但是,存在一些细微差异,如下所示:

  • 注释以 @ABAPCatalog.extensibility 开头。在 CDS 中,它们以 @ABAPCatalog.enhancement 开头。

  • 存在简单的 真 / 假 注释,用于允许或不允许可扩展性。

注意

注释 AbapCatalog.viewEnhancementCategory 指定 CDS 视图的扩展方式。

可选择在同一 CDS 视图中同时指定 AbapCatalog.viewEnhancementCategoryAbapCatalog.extensibility.extensiity.extensit.extensit.extended。在这种情况下,注释值必须相互适合。必须同时允许或禁止延期。

  • 无法在客户和合作伙伴之间分配配额份额。

  • 您可以定义 elementSuffix 而不是 fieldSuffix ,因为 CDS 实体的元素列表可由多个字段组成。公开关联就是一个示例。

最重要的区别是子注释 allowNewDatasourcesdataSources,它们在 ABAP 字典中没有等效项。通过这些注释,CDS 视图实体的所有者可以控制扩展可从中读取其数据的位置。如果 allowNewDatasources 设置为 true,则扩展的开发人员可以从原始视图读取的任何数据源中读取。如果将其设置为 false,则扩展的开发人员只能从 dataSources 下列出的数据源中读取。可以是原始视图的直接数据源,也可以是其关联的目标。

SAP 通常使用它来强制使用扩展 include,这是 CDS 视图扩展的最佳实践。

扩展包括是 CDS 视图扩展的最佳实践。该名称有点误解,因为 ABAP CDS 不支持 ABAP 字典等包含技术。SAP 改用特殊 CDS 视图实体,通常由前缀 "E_" 识别。标准 CDS 视图实体(例如,前缀为 "R_" 的视图)通过与此 E 视图的关联进行定义。

在图中,左上方的 CDS 视图定义在左下方包含与扩展 include 视图的关联。这两个 CDS 视图均可扩展,但为了强制使用 E 视图,主视图将可扩展性限制为与 E 视图关联的元素。另一方面,E 视图允许使用主数据源的元素进行扩展。因此,扩展开发人员必须先向 E 视图添加新元素,然后才能将其添加到主视图。

让我们看一个示例。

此示例说明如何使用数据库表 /DMO/AGENCY 中的 ZZCATEGORYZAG 字段扩展 CDS 视图实体 /DMO/R_AgencyTP(位于左上方)。

无法直接执行扩展,因为 CDS 视图实体 /DMO/R_AgencyTP 将扩展限制为关联 _Extension,该关联以 CDS 视图实体 /DMO/E_Agency 作为目标(左下方)。

因此,在第一步中,开发人员扩展 /DMO/E_Agency(右下方),然后才通过路径表达式扩展 /DMO/R_AgencyTP 寻址元素 ZZCategoryZAG

CDS 视图扩展创建

与 CDS 视图一样,CDS 视图扩展在 CDS 数据定义中定义。

要定义 CDS 视图扩展,请执行以下操作:

  1. 在项目浏览器中,找到要扩展的 CDS 实体的数据定义。

  2. 右键单击数据定义并选择 新建数据定义 。

  3. 调整包,输入新对象的名称和描述。然后选择 下一步 。

注意

通常,扩展名为 的数据定义与基本对象不在同一包中。因此,调整建议的包非常重要。

  1. 输入传输请求,然后选择 下一步 。

  2. 从模板清单中,选择 扩展视图实体 ,然后选择 完成 。 还有一个 扩展视图 模板。它属于较旧生成的 CDS 视图。仅当必须扩展使用 define view 而不是 define view entity 定义的视图时,才使用此模板。

扩展 CDS 视图实体

您想要使用附加元素和关联扩展 CDS 视图实体。创建 CDS 视图扩展,而不是直接编辑数据定义。

注意

在本练习中,您将扩展自己的 CDS 视图实体 Z##_R_Employee 和 Z##_C_EmployeeQueryP,其中##是您的组编号。这样做是为了简单起见。要激励扩展的使用,您必须假设视图实体位于不同的命名空间中,并且您无权直接对其进行更改。

模板:

  • 不适用

解决方案:

  • /LRN/EXT_R_EMPLOYEE(数据定义)

  • /LRN/EXT_C_EMPLOYEE(数据定义)

前提条件

在本练习中,您需要先前练习中开发的员工数据的基本视图实体(建议名称为 Z##_R_Employee)。如果尚未完成这些练习,请创建数据定义 /LRN/R_EMPLOYEE_AUT 的副本。

此外,您还需要具有员工数据参数的视图实体(建议名称为 Z##_C_EmployeeQueryP)。如果尚未完成相关练习,请创建数据定义 /LRN/C_EMPLOYEE_AUT 的副本,并将其从您的基础视图实体中读取。

任务 1: 启用可扩展性

调整员工数据的基础视图实体的可扩展性设置(建议名称为 Z##_R_Employee,其中 ## 是您的组编号)。允许使用来自员工数据数据库表的字段扩展元素列表(建议名称为 Z##_EMPLOY)。

同样,使用员工数据的参数调整视图实体的可扩展性设置(建议名称为 Z##_C_EmployeeQueryP,其中 ## 是您的组编号)。允许使用来自基础视图实体的元素扩展元素列表(建议名称为 Z##_R_Employee)。

步骤

  1. 打开员工数据的基本视图实体的定义。

  2. Ctrl + Shift + A,输入数据定义的名称,然后选择确定

  3. 调整视图扩展类别以允许扩展元素清单。

  4. 将注释 @ABAPCatalog.viewEnhancementCategory 的值从 #NONE 更改为 #PROJECTION_LIST

  5. 维护扩展的允许数据源列表。将视图实体从中读取的数据库表添加到此列表。

注意

要将数据库表添加到列表,需要为其定义别名(建议别名:员工)。

  1. 添加 @ABAPCatalog.extensibility.dataSources 注释,如下所示:

@AbapCatalog: {
dataMaintenance: #RESTRICTED,
viewEnhancementCategory: [#PROJECTION_LIST],
extensibility.dataSources: [ 'Employee' ]
}
  1. 定义数据源的别名,如下所示:

define view entity Z##_R_Employee
as select from z##employ as Employee
  1. 为附加字段定义必填后缀(建议值:ZEM)。

  2. 添加注释 @ABAPCatalog.extensibility.elementSuffix,如下所示:

@AbapCatalog: {
dataMaintenance: #RESTRICTED,
viewEnhancementCategory: [#PROJECTION_LIST],
extensibility.dataSources: [ 'Employee' ],
extensibility.elementSuffix: 'ZEM'
}
  1. 激活数据定义。

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

  3. 打开含员工数据参数的视图实体的定义。

  4. Ctrl + Shift + A,输入数据定义的名称,然后选择确定

  5. 与之前一样,调整视图扩展类别,维护允许的数据源并定义元素后缀。

注意

使用与之前相同的数据源别名和元素后缀。

  1. 如下调整代码:

@AbapCatalog: {
dataMaintenance: #RESTRICTED,
viewEnhancementCategory: [#PROJECTION_LIST],
extensibility.dataSources: [ 'Employee' ],
extensibility.elementSuffix: 'ZEM'
}
  1. 定义数据源的别名,如下所示:

define view entity Z##_C_EmployeeQueryP
with parameters
p_target_curr : /dmo/currency_code,
@EndUserText.label: 'Date of evaluation'
@Environment.systemField: #SYSTEM_DATE
p_date        : abap.dats
as select from Z##_R_Employee as Employee
  1. 激活数据定义。

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

任务 2: 扩展基本视图实体

对于基础视图实体,创建 CDS 视图扩展(建议名称:Z##EXT_R_EMPLOYEE)以将员工称谓和国家字段添加到元素清单(建议名称为:ZZTITLE_ZEMZZCOUNTRY_ZEM)。

步骤

  1. 为 CDS 视图实体 Z##_R_Employee 创建 CDS 视图扩展。

  2. 在项目浏览器中,找到数据定义 Z##_R_EMPLOYEE,右键单击并选择新建数据定义

  3. 确保字段包含您自己的包的名称。

  4. 名称 中输入 Z##EXT_R_Employee 并在 描述 中输入 扩展 Z##_R_Employee 。然后选择下一步

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

注意

不要选择完成,否则您将无法选择正确的模板。

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

  2. 编辑视图扩展的元素列表。移除占位符并使用代码完成添加员工的称谓和国家/地区。

  3. 在源代码中,将 base_data_source_code.element_name. 替换为 zz,然后按 **Ctrl + 空格**键调用代码完成。

  4. 从建议列表中选择 zztitle_zem- z##employs as employee (column) 以将附加字段添加到 CDS 视图扩展的元素列表中。

  5. 重复操作以调整代码,如下所示:

extend view entity Z##_R_Employee with
{
employ.zztitle_zem,
employ.zzcountry_zem
}
  1. 定义新视图元素的别名(建议名称:ZZTitleZemZZCoutryZem)。

  2. 如下调整代码:

extend view entity Z##_R_Employee with
{
employ.zztitle_zem   as ZZTitleZem,
employ.zzcountry_zem as ZZCountryZem
}
  1. 激活视图扩展。

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

  3. 显示扩展视图实体的工具提示描述,以确认其包含新元素。

  4. 在以 extend view entity 开头的代码行中,将光标放在 z##_R_Employee 上,然后按 F2

任务 3: 扩展查询视图实体

对于具有参数的查询视图实体,创建 CDS 视图扩展(建议名称:Z##EXT_C_EMPLOYEE)以将添加的元素添加到基本视图(建议元素名称为:ZZTitleZemZZCountryZem)。同时添加 SQL 函数以连接员工的名字和姓氏,用单个空格分隔(建议元素名称:ZZFullNameZem)。最后,使用标志扩展视图,该标志告诉您员工是否位于欧盟(建议元素名称:ZZEUBasedZem)。

提示

国家/地区主数据包含标志 IsEuropeanUnionMember。要访问此元素,首先必须使用与 CDS 视图实体 I_Country(建议的关联名称:

_ZZCountryZem)的关联扩展视图。然后将路径表达式添加到视图扩展的元素列表。

步骤

  1. 为 CDS 视图实体 Z##_C_EmployeeQueryP 创建 CDS 视图扩展。

  2. 在项目浏览器中,找到数据定义 Z##_C_EMPLOYEEQUERYP,右键单击并选择新建数据定义

  3. 确保字段包含您自己的包的名称。

  4. 名称中输入 Z##EXT_C_Employee,在描述中输入 Z##_EmployeeQueryP 的扩展。然后选择下一步

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

注意

不要选择完成,否则您将无法选择正确的模板。

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

  2. 编辑视图扩展的元素列表。移除占位符并使用代码完成添加员工的称谓和国家/地区。

  3. 在源代码中,将 base_data_source_code.element_name. 替换为 zz,然后按 **Ctrl + 空格**键调用代码完成。

  4. 从建议清单中选择 ZZTitleZem - Z##_R_Employs as Employee(列),将扩展字段添加到元素清单。

  5. 重复操作以调整代码,如下所示:

extend view entity Z##_C_EmployeeQueryP with
{
Employee.ZZTitleZem,
Employee.ZZContryZem
}
  1. 使用 concat_with_space 函数连接员工的名字和姓氏,用单个空格分隔。

  2. 如下调整代码:

extend view entity Z##_C_EmployeeQueryP with
{
Employee.ZZTitleZem,
Employee.ZZContryZem,
concat_with_space( Employee.FirstName, Employee.LastName, 1 )
}
  1. 为此新元素添加名称(建议名称:ZZFullNameZem)并使用相关注释提供标签。

  2. 如下调整代码:

extend view entity Z##_C_EmployeeQueryP with
{
Employee.ZZTitleZem,
Employee.ZZContryZem,
@endUserText.label: '
concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem
}
  1. 通过与 CDS 视图实体 I_Countries(建议名称:_ZZCountryZem)的关联扩展视图。

提示

在 ON 条件中,使用元素列表中的国家/地区代码和视图实体 I_Country 的关键元素。

  1. 如下调整代码:

extend view entity Z##_C_EmployeeQueryP with
association [1..1] to I_Country as _ZZCountryZem
on $projection.ZZCountryZem = _ZZCountryZem.Country
{
Employee.ZZTitleZem,
Employee.ZZContryZem,
concat_with_space( Employee.FirstName,
Employee.LastName,
1 )                    as ZZFullNameZem
}
  1. 在元素列表中,添加关联目标的 IsEuropeanUnionMember 元素(建议名称:ZZEUBasedZem)。

  2. 如下调整代码:

extend view entity Z##_C_EmployeeQueryP with
association [1..1] to I_Country as _ZZCountryZem
on $projection.ZZCountryZem = _ZZCountryZem.Country
{
Employee.ZZTitleZem,
Employee.ZZContryZem,
concat_with_space( Employee.FirstName,
Employee.LastName,
1 )                  as ZZFullNameZem,
_ZZCountryZem.IsEuropeanUnionMember     as ZZEUBasedZem
}
  1. 激活视图扩展并显示扩展视图实体的工具提示描述,以确认其包含新元素。

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

  3. 在以 extend view entity 开头的代码行中,将光标放在 z##_C_EmployeeQueryP 上,然后按 F2