1. 背景
随着SAP Fiori应用程序的兴起,SAP领域的小伙伴接触和使用ABAP CDS View的机会也是越来越多。今天,让我们花些时间,一起在了解下这项技术的设计初衷和发展历史。
2. 设计初衷
说起ABAP CDS View,就不得不提及SAP HANA。SAP HANA引入了内存计算技术,这让ABAP开发范式发生了变化。
传统的ABAP开发,SAP系统的数据库可以是anyDB, 与数据库的交互往往是最耗时的。因而,ABAP开发者的处理方式更多的是,先从数据库获取数据,然后在应用层加工处理数据。
但HANA内存计算的能力,让我们有可能将数据处理逻辑下沉,也即在获取数据时,就让HANA处理好数据。
ABAP CDS View就是在SAP HANA数据库推出后的几年中逐渐发展起来的,它的设计初衷就是为了充分利用SAP HANA数据库的能力,通过提供了一种新的数据定义和访问语言,使得数据处理可以在数据库层面进行,从而提高整体数据访问的性能和效率。
3. 语言集
ABAP CDS是一种数据定义和查询语言,它主要由以下几种构成语言组成:
- DDL(Data Definition Language):用于定义数据模型,包括表、视图等,它是原生SQL的扩展,可以在更高的语义级别上建模和检索数据。
- DCL(Data Control Language):用于定义数据访问控制,包括权限控制等,并且集成了SAP传统权限对象的技术。
- QDL(Query Definition Language):用于定义数据查询,包括选择、排序、过滤等,这可以让我们在ABAP程序中通过Open SQL来直接访问CDS提供的数据。
4. 特性
ABAP CDS 提供了一系列的基础特性,使得开发者可以更高效地定义和访问数据,包括:
- 数据模型定义:ABAP CDS允许开发者定义更复杂的数据模型,包括表、视图、关联等。
- 参数化视图:ABAP CDS允许开发者定义参数化视图,使得视图可以根据参数的不同返回不同的结果。
- 关联(Association)和路径表达式:ABAP CDS支持关联和路径表达式,使得开发者可以方便地访问关联实体的数据。
- 元数据注解(Annotation):ABAP CDS支持在数据模型中定义元数据注解,如字段标签、搜索帮助等。
- 表达式和函数:ABAP CDS支持各种表达式和函数,包括算术表达式、字符串函数、日期函数等。
- 扩展性:ABAP CDS支持视图的扩展,使得开发者可以在不修改原始视图的情况下添加新的字段或关联。
- 访问控制:ABAP CDS支持数据访问控制,可以定义谁可以访问哪些数据。
- OData服务发布:ABAP CDS可以直接发布为OData服务,供其他应用程序访问。
5. 基础语法和演变(SQL View vs. CDS View Entity)
在AS ABAP 7.57之前,我们可以通过ABAP CDS的DDL语言直接定义发布两个对象,如下例:
@AbapCatalog.sqlViewName: 'ZDEMO_CDS_SQL'
define view ZDEMO_CDS_DDL
as select from sbook
{
carrid,
connid
}
其中,@AbapCatalog.sqlViewName
: ‘ZDEMO_CDS_SQL’ 指定了数据库SQL View
的名字,在CDS View激活时,会在数据库层生成对应的SQL View
(SE11可见)。
define view ZDEMO_CDS_DDL
是定义的CDS View Entity
的名字(SE11不可见)。
- SQL View是数据字典中的一个对象,它是一个真实数据库的对象,但不含有任何额外的语义信息(Semantics)。
- CDS View Entity并不会存在于数据字典中,它不是一个数据库对象,它可以看做是一个ABAP的数据类型,并含有额外的语义信息(Annotations)。
这种方式可以看做是一种技术上的过渡,随着CDS技术的发展,用
define view
的方式去创建CDS View Entity已经不再推荐,并且在AS ABAP 7.57后已经完全废弃。
目前,推荐的方式是,直接用关键字define view entity
去创建CDS View,而无需去生成数据字典中对应的SQL View,示例如下:
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Demo View'
define view entity ZDEMO_CDS_DDL
as select from sbook
{
carrid,
connid
}
这种方式,更加的简洁高效,也更符合CDS技术的初衷。
6. 注解(Annotations)
注解是ABAP CDS的一个重要特性,它设计初衷是为了添加额外的语义信息到CDS实体,从而使得这些实体可以更好地被各种应用程序和服务消费,例如被ABAP运行时环境、OData服务、Fiori应用等消费。
ABAP CDS的Annotations主要分为以下几种:
- 元数据扩展Annotations:用于添加额外的元数据到CDS实体,如字段标签、搜索帮助等。
- UI Annotations:用于定义CDS实体在UI(如Fiori应用)中的显示方式,如字段顺序、字段可见性等。
- OData Annotations:用于定义CDS实体在OData服务中的表现,如实体集名称、导航属性等。
- 语义Annotations:用于定义CDS实体的业务语义,如度量单位、货币代码等。
以下是一个使用Annotations的ABAP CDS视图示例:
@AbapCatalog.sqlViewName: 'ZCDS_VIEW'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS View Example'
@OData.publish: true
define view ZCds_View as select from sflight as flight
{
@UI.lineItem: { position: 10 }
flight.carrid as AirlineCode,
@UI.lineItem: { position: 20 }
flight.connid as ConnectionNumber,
@UI.lineItem: { position: 30 }
flight.fldate as FlightDate,
@UI.lineItem: { position: 40 }
flight.price as FlightPrice
}
在这个示例中,我们定义了一个名为ZCds_View的CDS视图,并使用了多个Annotations。
@AbapCatalog.sqlViewName
、@AbapCatalog.compiler.compareFilter
、@AccessControl.authorizationCheck
和@EndUserText.label
是元数据扩展Annotations,它们分别定义了SQL视图名称、编译器比较过滤器、授权检查和标签。
@OData.publish
是OData Annotation,它定义了这个视图应该被发布为OData服务。
@UI.lineItem
是UI Annotation,它定义了各个字段在UI中的显示位置。
7. 其它方面
ABAP CDS 技术有着广泛的应用场景,在此就不再过多展开,有时间我会继续整理和总结。
8. 小结
本文介绍了ABAP CDS的发展历史和主要特性,有助于更好地理解这项技术。