扩展 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.viewEnhancementCategory 和 AbapCatalog.extensibility.extensiity.extensit.extensit.extended。在这种情况下,注释值必须相互适合。必须同时允许或禁止延期。
无法在客户和合作伙伴之间分配配额份额。
您可以定义 elementSuffix 而不是 fieldSuffix ,因为 CDS 实体的元素列表可由多个字段组成。公开关联就是一个示例。
最重要的区别是子注释 allowNewDatasources 和 dataSources,它们在 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 视图扩展,请执行以下操作:
在项目浏览器中,找到要扩展的 CDS 实体的数据定义。
右键单击数据定义并选择 新建数据定义 。
调整包,输入新对象的名称和描述。然后选择 下一步 。
注意
通常,扩展名为 的数据定义与基本对象不在同一包中。因此,调整建议的包非常重要。
输入传输请求,然后选择 下一步 。
从模板清单中,选择 扩展视图实体 ,然后选择 完成 。 还有一个 扩展视图 模板。它属于较旧生成的 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)。
步骤
打开员工数据的基本视图实体的定义。
按
Ctrl + Shift + A,输入数据定义的名称,然后选择确定。调整视图扩展类别以允许扩展元素清单。
将注释 @ABAPCatalog.viewEnhancementCategory 的值从
#NONE更改为#PROJECTION_LIST。维护扩展的允许数据源列表。将视图实体从中读取的数据库表添加到此列表。
注意
要将数据库表添加到列表,需要为其定义别名(建议别名:员工)。
添加 @ABAPCatalog.extensibility.dataSources 注释,如下所示:
@AbapCatalog: {
dataMaintenance: #RESTRICTED,
viewEnhancementCategory: [#PROJECTION_LIST],
extensibility.dataSources: [ 'Employee' ]
}
定义数据源的别名,如下所示:
define view entity Z##_R_Employee
as select from z##employ as Employee
为附加字段定义必填后缀(建议值:
ZEM)。添加注释 @ABAPCatalog.extensibility.elementSuffix,如下所示:
@AbapCatalog: {
dataMaintenance: #RESTRICTED,
viewEnhancementCategory: [#PROJECTION_LIST],
extensibility.dataSources: [ 'Employee' ],
extensibility.elementSuffix: 'ZEM'
}
激活数据定义。
按
Ctrl + F3激活开发对象。打开含员工数据参数的视图实体的定义。
按
Ctrl + Shift + A,输入数据定义的名称,然后选择确定。与之前一样,调整视图扩展类别,维护允许的数据源并定义元素后缀。
注意
使用与之前相同的数据源别名和元素后缀。
如下调整代码:
@AbapCatalog: {
dataMaintenance: #RESTRICTED,
viewEnhancementCategory: [#PROJECTION_LIST],
extensibility.dataSources: [ 'Employee' ],
extensibility.elementSuffix: 'ZEM'
}
定义数据源的别名,如下所示:
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
激活数据定义。
按
Ctrl + F3激活开发对象。
任务 2: 扩展基本视图实体
对于基础视图实体,创建 CDS 视图扩展(建议名称:Z##EXT_R_EMPLOYEE)以将员工称谓和国家字段添加到元素清单(建议名称为:ZZTITLE_ZEM 和 ZZCOUNTRY_ZEM)。
步骤
为 CDS 视图实体
Z##_R_Employee创建 CDS 视图扩展。在项目浏览器中,找到数据定义
Z##_R_EMPLOYEE,右键单击并选择新建数据定义。确保包字段包含您自己的包的名称。
在 名称 中输入
Z##EXT_R_Employee并在 描述 中输入扩展 Z##_R_Employee。然后选择下一步。确认传输请求,然后选择下一步。
注意
不要选择完成,否则您将无法选择正确的模板。
从模板列表中,选择扩展视图实体,然后选择完成。
编辑视图扩展的元素列表。移除占位符并使用代码完成添加员工的称谓和国家/地区。
在源代码中,将
base_data_source_code.element_name. 替换为zz,然后按 **Ctrl + 空格**键调用代码完成。从建议列表中选择 zztitle_zem- z##employs as employee (column) 以将附加字段添加到 CDS 视图扩展的元素列表中。
重复操作以调整代码,如下所示:
extend view entity Z##_R_Employee with
{
employ.zztitle_zem,
employ.zzcountry_zem
}
定义新视图元素的别名(建议名称:
ZZTitleZem和ZZCoutryZem)。如下调整代码:
extend view entity Z##_R_Employee with
{
employ.zztitle_zem as ZZTitleZem,
employ.zzcountry_zem as ZZCountryZem
}
激活视图扩展。
按
Ctrl + F3激活开发对象。显示扩展视图实体的工具提示描述,以确认其包含新元素。
在以
extend view entity开头的代码行中,将光标放在z##_R_Employee上,然后按F2。
任务 3: 扩展查询视图实体
对于具有参数的查询视图实体,创建 CDS 视图扩展(建议名称:Z##EXT_C_EMPLOYEE)以将添加的元素添加到基本视图(建议元素名称为:ZZTitleZem 和 ZZCountryZem)。同时添加 SQL 函数以连接员工的名字和姓氏,用单个空格分隔(建议元素名称:ZZFullNameZem)。最后,使用标志扩展视图,该标志告诉您员工是否位于欧盟(建议元素名称:ZZEUBasedZem)。
提示
国家/地区主数据包含标志 IsEuropeanUnionMember。要访问此元素,首先必须使用与 CDS 视图实体 I_Country(建议的关联名称:
_ZZCountryZem)的关联扩展视图。然后将路径表达式添加到视图扩展的元素列表。
步骤
为 CDS 视图实体
Z##_C_EmployeeQueryP创建 CDS 视图扩展。在项目浏览器中,找到数据定义
Z##_C_EMPLOYEEQUERYP,右键单击并选择新建数据定义。确保包字段包含您自己的包的名称。
在名称中输入
Z##EXT_C_Employee,在描述中输入Z##_EmployeeQueryP 的扩展。然后选择下一步。确认传输请求,然后选择下一步。
注意
不要选择完成,否则您将无法选择正确的模板。
从模板列表中,选择扩展视图实体,然后选择完成。
编辑视图扩展的元素列表。移除占位符并使用代码完成添加员工的称谓和国家/地区。
在源代码中,将
base_data_source_code.element_name. 替换为zz,然后按 **Ctrl + 空格**键调用代码完成。从建议清单中选择 ZZTitleZem - Z##_R_Employs as Employee(列),将扩展字段添加到元素清单。
重复操作以调整代码,如下所示:
extend view entity Z##_C_EmployeeQueryP with
{
Employee.ZZTitleZem,
Employee.ZZContryZem
}
使用
concat_with_space函数连接员工的名字和姓氏,用单个空格分隔。如下调整代码:
extend view entity Z##_C_EmployeeQueryP with
{
Employee.ZZTitleZem,
Employee.ZZContryZem,
concat_with_space( Employee.FirstName, Employee.LastName, 1 )
}
为此新元素添加名称(建议名称:
ZZFullNameZem)并使用相关注释提供标签。如下调整代码:
extend view entity Z##_C_EmployeeQueryP with
{
Employee.ZZTitleZem,
Employee.ZZContryZem,
@endUserText.label: '
concat_with_space( Employee.FirstName, Employee.LastName, 1 ) as ZZFullNameZem
}
通过与 CDS 视图实体
I_Countries(建议名称:_ZZCountryZem)的关联扩展视图。
提示
在 ON 条件中,使用元素列表中的国家/地区代码和视图实体 I_Country 的关键元素。
如下调整代码:
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
}
在元素列表中,添加关联目标的
IsEuropeanUnionMember元素(建议名称:ZZEUBasedZem)。如下调整代码:
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
}
激活视图扩展并显示扩展视图实体的工具提示描述,以确认其包含新元素。
按
Ctrl + F3激活开发对象。在以
extend view entity开头的代码行中,将光标放在z##_C_EmployeeQueryP上,然后按F2。