这是一个很好的系列,从Part1到Part20,反复练习就可以很好的掌握CDS View,尊重版权,仅供个人学习
https://sapyard.com/abap-on-sap-hana-part-iv/
https://sapyard.com/abap-on-sap-hana-part-v/
CDS Annotation online help:
https://help.sap.com/viewer/cc0c305d2fab47bd808adcad3ca7ee9d/1709%20000/en-US/630ce9b386b84e80bfade96779fbaeec.html
HANA DB以内存存储内存计算而傲,在其上的产品如S4 HANA、C4C等均以此为base为core,所以尽最大可能的利用内存数据库是SAP最新一代产品的特点。以HANA DB为基础,尽大可能的利用数据库的计算能力。SAP 从ABAP 7.40 SP05引入了ABAP CDS View。
CDS是SAP HANA中定义和使用语义丰富的数据模型的新基础设施。通过使用数据定义语言(DDL)、查询语言(QL)和表达式语言(EL), CDS可以包含编写操作、事务语义、约束等。
CDS View的存在是为了把逻辑处理从应用服务器推往数据库或是client端。 学HANA会经常看到一句“Core-to-Data”,就是把耗时最大的处理逻辑从应用服务器转移到Database,除了往后推,还能够通过从CDS View生成的OData服务的Annotations来控制SAP UI5 Smart Controls 和SAP Fiori Elements。这样CDS View就把逻辑通过delegate到了前端控件。
CDS View有点类似 ABAP View,都是通过一个或多个数据库表提供预定义的SQL查询以有效和舒适地连接和访问数据。
首先讨论一个问题:
假设有一个需求是获得组织代码 ’ 4711 '中所有员工的id、姓名和各自的家庭地址的邮政编码。
用Native SQL来实现会是下面的代码:
上面代码的问题是,需求和SQL代码之间存在很大的语义差异。
用ABAP Open SQL代码实现的话,大概会是这样的:
Open SQL的问题是,命令式编程着重于描述程序是如何运行的。而且它还有可能因为嵌套造成性能低下。
接下来看下CDS View的实现:
看以看出,使用CDS, SQL开发人员可以看到和需求之间只有很小甚至没有语义差距,abaper也不需要任何编码。可以直接从CDS得到结果。这样的动机还不够吗?
问题2:
和传统的View相比, CDS View不只是简单的视图构建,而是描述了用于构建包含数据库表、数据库视图、函数和数据类型的元模型存储库的DDL。它满足了ABAP数据字典和HANA Studio不能实现的功能。对于CDS,数据模型是在数据库上定义和使用的,而不是在服务器上。CDS还提供了超越传统数据建模工具的功能,包括对概念建模和关系定义、内置功能和扩展的支持。最初,CDS仅在SAP HANA的设计时和运行时环境中可用。现在,CDS概念在SAP NetWeaver AS ABAP也得到了充分的实现,使开发人员能够在将代码执行下推到数据库的同时,使用ABAP开发工具在ABAP层工作。
问题:
可以分为ABAP CDS和HANA CDS,也可以这样划分 带参数的CDS View和不带参数的CDS View,
问题:
CDS是用于定义有丰富语义的数据模型的基础结构层,这些模型表现形式为CDS View。CDS允许开发人员以非常基本的方式定义实体类型Entity type(例如订单、业务伙伴或产品)和它们之间的语义关系,它们对应于传统实体-关系Entity-Relationship(ER)模型中的外键关系。
CDS是使用基于SQL的数据定义语言(DDL)定义的,DDL基于标准SQL,还有一些附加的概念,比如关联associations
,它定义CDS View
和注释Annotations
之间的关系,后者指定CDS工件Artifacts
的特定领域使用。另一个例子是表达式expressions
,可以在将某些CDS属性视为要聚合的度量的场景中使用表达式。
和DDIC在ABAP世界中的角色相似,基于CDS的数据模型作为中心定义,它可用于许多不同的领域,如事务和分析应用程序,以统一的方式与数据库中的数据进行交互。然而,CDS数据模型超出了DDIC的能力,后者通常被限制在事务范围内(想想传统的在线事务处理功能)。例如,CDS可以定义以分层方式聚合和分析数据的视图,从基本视图开始,然后添加组合基本视图的强大视图。另一个区别是对特殊操作符的支持,比如UNION,它允许组合多个select语句只返回一个结果集。
CDS工件Artifacts
存储在DDIC中,可以通过Open SQL在ABAP程序中访问,方式与普通ABAP表或视图相同。
简单说:
CDS是SAP HANA中定义和使用语义丰富的数据模型的新基础设施。通过使用数据定义语言(DDL)、查询语言(QL)和表达式语言(EL), CDS可以包含编写操作、事务语义、约束等。
问题:CDS有哪些工件Artifacts
和元素?:
实体Entities (tables)
视图Views
用户定义数据类型User-defined data types (including structured types)
上下文Contexts
关联Associations
注释Annotations
问题:
取决于可重用性。如果视图的功能只需要一次,那么不需要创建CDS View。我们可以在Open SQL中使用连接、SQL表达式、子查询等来执行这个代码下推。但是如果我们想要重用一个视图,需要使用到Open SQL没有CDS的语义或技术能力,或者我们是想把整个数据模型下推到数据库,这时就是我们需要使用CDS View的时候。
问题:
CDS in native SAP HANA 和 CDS in ABAP的细微区别在于视图定义。在ABAP和HANA场景中,视图都是在DDIC中包含的现有数据库表之上创建的。对于原生SAP HANA中的CDS,我们必须创建与DDIC表对应的基本实体类型,作为CDS视图定义的一部分。而对ABAP中的CDS,我们可以从CDS视图定义中引用任何底层DDIC表、视图或类型,从而避免在CDS层重复DDIC表的定义。在ABAP场景中,CDS定义被视为DDIC工件,需要像任何其他DDIC工件一样被激活,当进行更改时,它们的影响将传播到相关的工件。
创建的HANA CDS对象不是由ABAP字典管理的,这意味着不能使用Open SQL直接访问它们,而且它们不是ABAP类型系统中的类型。
ABAP CDS View比ABAP Dictionary View能做的更多。ABAP字典视图实际上就是一个ABAP结构。ABAP CDS View也生成ABAP结构,但还有更多内容。总的来说,一个ABAP CDS View生成或可以生成:
在CDS View之前,ABAP代码主要是包含ABAP应用程序的逻辑,这个逻辑由应用服务器处理。现在,ABAP应用程序的大部分逻辑都可以从ABAP代码转到CDS View,从而从应用服务器转到数据库。
这个是 ABAP CDS View和 HANA CDS View的共同点。
SAP ABAP CDS views定义在应用服务器层,View是由驻留在应用服务器中的DDL文件来创建和维护的,它是数据字段(SE11)的一部分,也是STMS,Life Cycle management的一部分。ABAP CDS View 是用OPEN SQL写的,ABAP CDS View 是旨在支持ABAP应用程序的开发。数据库系统的类型无关紧要,它可以不必是HANA数据库。因此ABAP CDS View的主要重点是创建视图。
总结一下SAP ABAP CDS View的特点:
SAP HANA CDS Views是定义在HANA 数据库层的,是由驻留在位于 HANA XS服务器的数据库的DDL文件创建和维护的,使用的是Native SQL。HANA CDS View旨在支持本地SAP HANA应用程序的开发。他们使用SAP HANA特有的特性。因此它们只能与HANA数据库一起使用。HANA CDS View的主要关注点是在HANA数据库上创建模型。
总结一下SAP HANA CDS View的特点:
SAP ABAP CDS View和SAP HANA CDS View是两个不同的CDS实现。它们跑在不同的平台上,技术兼容性无法保证,具有不同的功能和发布周期。
图表显示两者不同:
ABAP CDS Views | HANA CDS Views | |
---|---|---|
Reside | Application Server | HANA Database |
Database | Any | HANA |
SQL | OPEN SQL | Native SQL |
Aim | ABAP Application | Native HANA Application |
Main Focus | Create Views | Create Models |
Analytics intended | Yes | No |
如果再加上传统的ABAP Dictionary View,它的特点就只有:
在ECC系统中使用ABAP CDS View而不是ABAPDictionary View的5个原因
问题:
如果单独运行SAP HANA,或者在side-by-side的情况下运行SAP HANA(在顶部没有ABAP堆栈),这种情况不能使用ABAP CDS。必须用HANA CDS。
如果在HANA数据库上有一个ABAP栈(AS ABAP使用HANA数据库作为中央数据库),那么:
问题:
可以,对于每个CDS视图,在激活时都会同时在数据库中创建一个数据库视图(SQL视图)。我们可以直接访问这个数据库视图。CDS表函数由AMDP管理。相关的数据库功能也可以原生访问。
问题:
可以,Open SQL隐式地检查授权,但是当然会被翻译成在DB级别上执行此操作的原生SQL代码(隐式条件)。本机检查授权本身的SADL框架也是如此。问题是,您需要访问未发布且可能更改的内部角色表示,或者您必须自己构建一个框架来解析角色定义并创建相应的条件。
问题:
SE11或SE16查看表TADIR
,条件是PGMID = ‘R3TR’, OBJECT = ‘DDLS’
;
SE11或SE16查看表DDLDEPENDENCY
,这里每一个DDL Source都有两行,一个的type是STOB,一个的type是VIEW,STOB代表CDS 实体(只能用ADT查看或修改),VIEW代表所生成的数据库视图(可以SE11查看)。它们的名字也可以定义成相同的,但通常我们会定义不同的名字,它们毕竟是不同类型的对象。
问题:
基本上,CDS视图是一个可以按其名称寻址的实体:在ABAP中作为一种类型,在Open SQL中作为一个数据源。
在SE11中看到CDS View是一种技术工件,但我们不应该在ABAP程序中直接使用这个数据库视图。从SE11中,还可以导航到由定义生成的数据库对象。这个数据库对象甚至可以用原生SQL直接访问。从SE11中,还可以导航到由定义生成的数据库对象。这个数据库对象甚至可以用原生SQL直接访问。
这意味着我们可以从ABAP程序或其他地方直接访问CDS View。为了评估CDS View(存储在系统表中)的语义属性(Annotations),我们应该使用合适的API (CL_DD_DDL_ANNOTATION_SERVICE(如果系统中可用))。
从CDS源代码创建的数据库视图仅仅是“出于技术原因”。CDS源代码和定义的CDS实体应该是“真实的东西”。
问题:
SAP声称传统的数据库视图只是一个或多个表的链接,而CDS View是一个完全成熟的数据模型,除了具有se11定义的视图所没有的额外特性之外,它甚至可以被SAP域之外的应用程序使用。
从技术上讲,CDS是SQL的增强,它为我们提供了一种数据定义语言(DDL),用于定义语义丰富的数据库表/视图(CDS实体)和数据库中的用户定义类型。
增强包括:
与在事务SE11中创建和维护的传统字典视图一样,CDS View也由ABAP数据字典管理。在激活时,会在HANA层上创建一个数据库视图,但是只有ABAP CDS View(在所谓的DDL源中定义)必须通过ABAP更改和传输系统(CTS)传输。此外,CDS View提供的功能可以在所有SAP支持的数据库上使用,我们不必担心在异构系统中传输这些对象。
CDS View是ABAP字典中ABAP CDS实体,比经典的SE11视图高级得多。我们可以在DCL的不同位置使用的参数来影响CDS View。对于传统的SE11视图来说,CDSView会在我们可以在SE11中检查的数据库中生成一个平台相关的运行时对象。当使用Open SQL访问一个CDS View,数据库接口访问这个运行时对象。CDS Veiw是在Eclipse中使用DDL(与SQLScript无关)用基于源代码的编辑器创建的。
出于技术上的原因,在SE11中从源代码中生成了一个经典的DB视图,我们可以像访问任何经典视图一样访问它,但我们不应该这样做。相反,应该访问所谓的CDS实体,因为它比纯粹的技术DB视图具有更多的意义,并且涉及新的客户端处理类型。
PS:在即将发布的版本中(可能已经发布了),直接访问CDS View的DB 视图将被宣布为过时的。所以,如果可以避免的话,最好不要使用这些DB 视图。
我们使用CDS在字典中对应用程序的大部分进行建模,并在ABAP中使用简单的Open SQL select
来进行直接的join连接和子查询。将来Open SQL可能会具有与CDS View相同的功能,但这并不意味着它们是多余的。在CDS出现之前,我们就已经可以在SE11中创建可重用视图和ABAP中在Open SQL中编程联接之间进行选择。根据经验,如果视图在多个程序中使用,我们就创建视图,而仅在需要它一次时就编写join联接。这与CDS非常相似,但对语义丰富的模型建模的可能性更大,以便在ABAP程序中重用。
CDS是开放的。它并不仅限于HANA(但是在不同的DB中性能可能不同)。
上一个部分我们了解到HANA中的CDS视图有两个组件,也就是创建一个Data Definition时会生成两个对象:
DDL SQL View
: 它是只读的经典数据库视图,在ABAP字典(SE11)中可见。但不能在SE11中编辑。CDS View Entity
:它是DDL源文件,也是实际的CDS视图。它是一个数据库对象,在Eclipse/HANA Studio/ADT中可见,在SE11中无法查看CDS View 实体。它覆盖了CDS数据库视图并使其他属性成为可能,比如在CDS View中定义的权限检查。在展示如何在HANA ADT中创建CDS View之前,我们先从如何删除CDS View开始。
问题:我们需要分别删除 DDL SQL View和CDS View Entity么?
答案是不,那我们可以通过删除DDL SQL来删除CDS View么?,答案也是不
先执行删除DDL SQL是不会成功的。因为它是CDS View 生成的。
如果要删除的话,要执行删除CDS View Entity,也就是Data Definitions。然后SQL View就自动删除了。
接下来看如何创建一个CDS View。
很简单,使用ADT工具,创建一个DDL Source
或者
指定TR
SAP提供了一些常用的模版以便我们快速完成CDS View创建,比如要创建一个带参数的CDS View,就可以选上图那个Define View with Parameters
避免了忘记语法的尴尬
上图是我们选择了最常用的Define View
模版:
当我们试图用SE11去打开这个CDS View Entity时,提示是需要用ADT才能查看或编辑的。
查看SQL View 是可以的,但也仅是查看,是不允许编辑的,因为它是CDS激活时生成的,同样在TR中也是看不到这个SQL View的,只有Data Definition对象
CDS View的命名规则
SQL View name 最长16位字符, CDS View name最长30位字符。自定义文件的用Z或Y开头(或者registered namespace)。
在引用SAP Business entity时,重用SAP定义的字段名,创建自己的字段名或扩展SAP标准的View时,使用YY或ZZ作为前缀。
SQL View name
<前缀><描述> – 如: ZIBPADDR.
前缀规则:
后缀规则:
CDS View name
<前缀><描述> – 例如: ZI_BPNameAddress.
前缀规则:
描述规则:
参考:About ABAP Programming Model for SAP Fiori
Annotations enrich the data models with additional (domain specific) metadata.
Annotation用metadata来丰富数据模型。
上面Demo中@
开头的都是这个CDS View的Annotation,可以翻译叫注释,对当前CDS View的一个更详细解释说明以及定义了一些属性。例如@ClientDependent
注释允许我们设置CDS视图是否依赖于client。在上面的例子中,它是依赖于client的(默认)。注释还可以用于指定CDS视图的缓冲区状态(打开/关闭)和缓冲区类型(single/generic/fully单个/通用/完全)。AbapCatalog.sqlViewName
指定了当前CDS View的名字,是一个mandatory属性。
在读一个CDS View时,左下角的Outline是我们先会去看地方,非常实用的功能。
先介绍一个概念“虚拟数据模型”,以前看的一些内容,正好对应上面CDS View的命名,
SAP ABAP CDS View属于虚拟数据模型,用于事务和分析应用程序以及API。
虚拟数据模型:
通常一个虚拟数据模型由4部分组成:
虚拟数据模型中的ABAP CDS Views要使用Annotation关键字:@VDM.viewType: #
SAP使用Annotation @VDM.viewType对CDS View进行内部构造和解释
Basic Interface views
@VDM.viewType: #BASIC
基本接口视图构建在数据库表之上。基本接口视图是虚拟数据模型的底层。只有基本接口视图才能访问数据库表。所有其他的CDS视图都重用,可以从基本接口视图取它们的数据。
基本接口视图应该从单个数据库表中进行选择。基本接口视图不应该存在转换或计算逻辑。
使用Basic interface views的目的有:
Field Annotation | Semantic |
---|---|
@Semantics.amount.currencyCode | Amount that references to a currency (@Semantics.quantity.unitOfMeasure) |
@Semantics.quantity.unitOfMeasure | Amount that references to a unit(@Semantics.unitOfMeasure) |
@Semantics.unitOfMeasure | Unit |
@Semantics.currencyCode | Currency |
@Semantics.text | Text in human-readable form |
Comosite Interface Views复合接口视图
@VDM.viewType: #COMPOSITE
Composite interface views是建立在Basic interface views和其它Composite interface views之上的。它在虚拟数据模型中的中间层。这种项目数据一般用于应用程序和Consumption views消费视图,或者组合来自多个数据源的数据以从其他复合视图中重用。
Analytical CDS views 如 fact sheets, cubes,和 dimensions也用 composite interface views。
使用Composite interface views的目的有:
Consumption Views消费视图
@VDM.viewType: #CONSUMPTION
Consumption Views是建在Composite interface views之上的,是虚拟数据模型的最上层,顾名思义就是最终被用来消费用的。通常是被:
消费视图并不用来重用,它就是为应用或是系统需求提供准备的数据。
消费视图可表现为三种:
消费视图可以通过annotation事务和分析应用程序的属性(如应用程序的layout和behavior)来控制。
除了最普通的 View之外还有:
可以看到SE11是不能查看这种带参数的视图的,可以在ADT中使用Data preview工具快速查看。
还有View with Association, Extend View and Table Function with Parameters.等等,可以在后面接触到时再做学习。
我们可以像使用ABAP中的其他表或数据字典视图一样使用CDS视图,带参数的写法是这样的:
SELECT * FROM ZGJZ_I_WO_STATUS_PA( p_stat = @p_status , p_lang = 'EN' ) INTO TABLE @i_wo_status.
我们可以既使用DDL SQL视图也可以使用CDS视图中进行数据选择。但是区别是,如果使用DDL SQL视图,那和普通的数据字典对象就一样了,并不能体现出HANA数据库的优势,也就看不到性能的提高。理论上这是需要ABAP层和数据库层之间建一个数据库连接的;而CDS View Entity(DDL Source)是ABAP层已知的数据库对象,并不存在于数据字典(SE11)中。这个数据库对象包含SQL power并驻留在数据库层。这样我们就可以在ABAP层和数据库之间不创建数据库连接的情况下执行SQL。只有结果将被传送回ABAP层。
下面程序代码分别使用了DDL SQL View和CDS View entity,可以执行实验一下:
*&---------------------------------------------------------------------*
*& Report YCDS_WO_STATUS_REPORT
*&---------------------------------------------------------------------*
*& Description: Demo to fetch data from CDS View with Parameter
*& Note: This program is just to show how CDS View can be used.
*& This does not depict the true strength (Core to Data Paradigm) of CDS
*&---------------------------------------------------------------------*
REPORT ycds_wo_status_report.
*--------------------------DATA DECLARATION----------------------------*
*DATA: i_wo_status TYPE STANDARD TABLE OF ZGJZ_I_WO_STATUS_PA. " CDS Entity View
DATA: I_WO_STATUS TYPE STANDARD TABLE OF ZGJZIWOSTATUSPA. " DDL SQL View (DDIC)
*&---------------------------------------------------------------------*
*&SELECTION SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_status TYPE j_status. " Status
PARAMETERS : p_lang type spras."Lauguage
SELECTION-SCREEN END OF BLOCK a01.
*&---------------------------------------------------------------------*
*& START OF SELECTION.
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Select data using CDS View with Parameter
PERFORM sub_get_data_from_cds.
*&---------------------------------------------------------------------*
*& END OF SELECTION.
*&---------------------------------------------------------------------*
END-OF-SELECTION.
* Display data
PERFORM sub_display_data.
*&---------------------------------------------------------------------*
*& SUB ROUTINES
*&---------------------------------------------------------------------*
FORM sub_get_data_from_cds.
* Fetch from CDS Entity View
* SELECT * FROM ZGJZ_I_WO_STATUS_PA( p_stat = @p_status,p_lang = @p_lang )
* INTO TABLE @i_wo_status.
* Fetch from DDL SQL data dictionary View
SELECT * FROM ZGJZIWOSTATUSPA( P_STAT = @P_STATUS,p_lang = @p_lang )
INTO TABLE @I_WO_STATUS.
ENDFORM.
FORM sub_display_data.
DATA:
lr_functions TYPE REF TO cl_salv_functions, " ALV Functions
lr_alv TYPE REF TO cl_salv_table, " ALV Functions
lr_display TYPE REF TO cl_salv_display_settings, " ALV Functions
lv_salv_msg TYPE REF TO cx_salv_msg. "ALV Functions.
* Display the final internal table in ALV
IF i_wo_status IS NOT INITIAL.
TRY.
* Factory Method
cl_salv_table=>factory( IMPORTING r_salv_table = lr_alv
CHANGING t_table = i_wo_status ).
CATCH cx_salv_msg INTO lv_salv_msg.
MESSAGE lv_salv_msg TYPE 'E'.
ENDTRY.
* Self explanatory
lr_functions = lr_alv->get_functions( ).
lr_functions->set_all( abap_true ).
lr_display = lr_alv->get_display_settings( ).
lr_display->set_striped_pattern( cl_salv_display_settings=>true ).
lr_display->set_list_header( TEXT-001 ).
* Actual Diplay
lr_alv->display( ).
ELSE.
MESSAGE 'No data found' TYPE 'I'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
需要注意的是DDL SQL View和CDS View是不能通用声明的。如果声明用的是SQL View,那下面就也要用SQL View。同理CDS View。