(ABAP CDS实体)ABAP CDS-Part 1

目录
预备条件
一、概述
二、ABAP CDS实体(CDS Entity)
a.定义ABAP CDS Views
b.ABAP CDS Table Functions
三、ABAP CDS 访问控制
四、Note
参考文章
拓展阅读
在我们开始之前诅咒小人

预备条件诅咒方法
SAP NetWeaver版本

SAP NetWeaver 7.5 SP01或者更高
数据库没有特殊要求,但是推荐使用SAP HANA数据库
开发环境

建议使用SAP NetWeaver最新版本的ABAP开发工具(即ADT)。您可以在[此处]下载最新的ADT插件。关于开发工具,我链接一些其他博客在本文末尾,可以帮助了解更多相关知识。
SAP Gateway

正确配置您的SAP Gateway,帮助ABAP系统激活和测试产生的ODATA服务。更多关于此的信息,请访问SAP帮助门户:SAP Gateway Foundation Developer Guide。
权限
要实现上述指南中描述的步骤,需要在SAP NetWeaver Application Server上分配以下角色的用户:

SAP_BC_DWB_ABAPDEVELOPER
SAP_BC_DWB_WBDISPLAY
/IWFND/RT_DEVELOPER (for SAP Gateway service development).
让我们开始吧!
一、概述
在SAP HANA引入CDS之后,SAP意识到CDS可以通过ABAP应用服务器引入,这将允许ABAP从CDS数据定义语言提供的增强功能中获益,而不是基于表单的ABAP字典工具。所以,在ABAP 7.40 SP05版本开始,SAP引入了ABAP CDS Views。由于ABAP字典已经具有定义表、视图和数据类型的能力,因此在ABAP应用服务器上引入CDS的方法是将其添加到ABAP字典中。基于源代码编辑器的ADT允许我们在Eclipse 或 SAP HANA studio中创建数据定义语句(DDL)。

基于ABAP的CDS在SAP Business Suite 4 SAP HANA (SAP S/4HANA)里扮演着重要的角色。由数十万行ABAP代码,数千张CDS Views组成的一组大量CDS工件,已经被SAP引入,用来表示SAP S/4HANA解决方案的底层核心数据模型。标准的ABAP CDS Views,ERP表和视图可以在ADT源代码编辑器自定义CDS Views中重用。

自大部分主要功能已经被引入的ABAP7.50 SP00版本以来,使用ABAP CDS Views最主要的动机是在传统的物理SAP ERP表之上提供一个语义层。传统的物理SAP ERP表通常充当数据库上的物理数据容器。其拥有一个非常复杂的内部结构,大部分情况下,在没有传统的ABAP处理时不能进行评估。而CDS提供的富语义数据建模使SAP S/4HANA中的这一层能够简化、高效地访问底层数据。

二、ABAP CDS实体(CDS Entity)
ABAP CDS提供了一个框架,用来在ABAP应用服务器的中央数据库定义和使用语义数据模型。它基于ABAP字典管理的数据定义语言(DDL)和数据控制语言(DCL)。因此,CDS Entity或CDS Views的增强在CDS数据定义中被定义为源代码。

要定义一个CDS Entity,你首先需要创建一个DDL源( DDL source)作为相关的开发对象,使用该对象可以使用ABAP工作台的标准功能——例如语法检查,激活,传输等功能。你可以在Eclipse ADT或SAP HANA studio ADT的基于文本的DDL编辑器中来定义CDS Entity。

ABAP CDS Entity类型:

ABAP CDS Views
ABAP CDS Table Functions
a.定义ABAP CDS Views
使用ABAP CDS声明语句DEFINE VIEW,可以为现有的数据库表和视图或ABAP字典中的其他CDS Views定义一个CDS Views。CDS Views用于定义SQL View的结构,并表示在一个或多个字典表或字典视图上的投影。

注意:SQL View和CDS Entity是同一个命名空间的一部分。因此,必须为SQL View和CDS Entity分配不同的名称。

如上图:在DDL编辑器中定义一个CDS View。CDS Entity ZCDS_VIEW定义了一个到数据库表scustom的投影。生成的SQL View(ZcdsView)包含了所有选取的字段id,name,city.

激活

激活CDS View后,在ABAP字典中会创建以下对象:

实际的CDS Entity (Zcds_View)
SQL View (ZcdsView)
b.ABAP CDS Table Functions
使用ABAP CDS声明语句DEFINE TABLE FUNCTION可以定义一个CDS Table Function,它可以作为数据源被OPEN SQL语句读取。

每个CDS Table Function包含以下部分:

在ABAP字典中生成的Table Function的CDS Entity
CDS Table Function实现 (ABAP 类库)
注意:相比于CDS Views,CDS Table Functions能够通过Native Sql实现。这种实现是在AMDP类的AMDP方法中完成的,并在数据库系统中的AMDP框架中作为一个AMDP函数来管理。

如上图:定义和实现一个CDS table function。
注意:实现AMDP的方法名,只能在一个CDS table function中指定。(1对1关系)

示例:Table function定义
下面,我们通过DDL语法定义了一个CDS Table Function——TAB_FUNCTION_EXAMPLE 。这个表函数声明了两个输入参数clnt(带有预定义值:#CLIENT)和carrid。以及提供实现表函数的AMDP方法的返回值的元素列表。表函数与AMDP类CL_EXAMPLE_AMDP相关联,类的方法GET_FLIGHTS用于实现此表函数。

@ClientDependent: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
define table function TAB_FUNCTION_EXAMPLE

with parameters @Environment.systemField: #CLIENT
clnt:abap.clnt, carrid : s_carr_id
returns {
client : s_mandt;
carrname : s_carrname;
connid : s_conn_id;
cityfrom : s_from_cit;
cityto : s_to_city;

}

implemented by method CL_EXAMPLE_AMDP=>GET_FLIGHTS;
示例:Table Function实现
本例中的公共ABAP类(AMDP类)提供了AMDP方法GET_FLIGHTS,它是表函数TAB_FUNCTION_EXAMPLE的实现。与其他任何AMDP类一样,CL_EXAMPLE_AMDP必须实现标记接口IF_AMDP_MARKER_HDB。AMDP方法GET_FLIGHTS使用Native SQL代码实现数据选取。

class cl_example_amdp definition public.

public section.
interfaces IF_AMDP_MARKER_HDB.
class-methods get_flights for table function tab_function_example.

protected section.
private section.
endclass.


class cl_example_amdp implementation.

method get_flights by database function
for hdb
language sqlscript
options read-only
using scarr spfli.
RETURN SELECT sc.mandt as client,
sc.carrname, sp.connid, sp.cityfrom, sp.cityto
FROM scarr AS sc
INNER JOIN spfli AS sp ON sc.mandt = sp.mandt AND sc.carrid = sp.carrid
WHERE sp.mandt = :clnt AND
sp.carrid = :carrid
ORDER BY sc.mandt, sc.carrname, sp.connid;
endmethod.

endclass.
三、ABAP CDS 访问控制
ABAP CDS支持基于数据控制语言(DCL)的访问控制。ABAP CDS的访问控制进一步限制了从ABAP CDS中的CDS实体返回的数据。
ABAP CDS访问控制基于以下内容:

CDS角色是使用DCL语句DEFINE ROLE定义的。目前,一个CDS角色被隐式地映射到每个用户。这也是为什么它们被称为映射角色的原因。
在CDS角色CDS Entity中定义访问条件。访问条件可以是以下:
1、字面条件(Literal conditions):相对于CDS实体元素的字面值(literal values)
2、将CDS Entity的元素与SAP授权概念中的权限相关联的PFCG条件。
如果为CDS实体定义了CDS角色,那么每当使用Open SQL或SADL查询去访问对象时,都会隐式地校验访问条件(除非给访问控制参数@AccessControl.authorizationCheck赋值#NOT_ALLOWED来禁用访问控制)。如果启用了访问控制(赋值:##CHECK),则只有满足访问条件的数据才能访问到。

每个CDS角色都由一段单独的CDS源代码定义。此源代码只能通过ABAP Development Tools (ADT)修改。当激活后,CDS角色在ABAP字典中是一个全局内部对象。定义CDS角色的源代码与定义CDS Entity(CDS View 或 CDS Table Function)的源代码是在不同的编辑器中编辑的。

假设我们已经定义好了一个CDS View,如下:

@AbapCatalog.sqlViewName: ‘Z_T100_SABDEMOS’
@AccessControl.authorizationCheck: #CHECK.

define view z_t100_sabapdemos
as select from t100
{ * } where arbgb = ‘SABAPDEMOS’
然后,我们可以通过DCL(数据控制语言)为上述视图创建一个CDS角色(如下所示)。

@MappingRole: true

define role role_name {
grant select on z_t100_sabapdemos
where ( arbgb ) = aspect pfcg_auth ( s_develop, objname,
objtype = ‘MSAG’,
actvt = ’03’ )
and sprsl= ‘E’ ; }
现在我们有个问题需要思考:
DEFINE ROLE这个看似无害的语句做了些什么?

CDS角色向这个CDS View添加了一个额外的条件,即所谓的访问条件。而当你去尝试访问这个CDS View时,它会隐式的去校验每个角色中定义的访问条件。

在上述示例中:

条件语句sprsl=’E’限制了只能通过英语访问
关于PFCG条件方面,pfcg_auth ( s_develop … ) 语句将CDS角色关联到了一个经典权限对象s_develop,CDS访问控制运行时从中生成一个访问条件,该条件评估当前用户对该对象的授权。在这里,预定义的pfcg_auth将权限字段objname关联到了视图字段arbgb。另外,检查用户的权限是否符合授权字段objtype和actvt的固定值。
NOTE:如果你不想有任何的访问限制,你必须给访问控制参数@AccessControl.authorizationCheck赋值#NOT_ALLOWED来禁用访问控制。如此,CDS角色就会被忽视。

激活

当您激活DCL源时,SAP NetWeaver AS for ABAP会生成授权视图并使用所需的元数据填充访问控制管理表。角色在ABAP字典中被描述为全局内部对象。

四、Note
一旦创建,CDS View就可以通过Open SQL 读取语句在ABAP程序中使用。
为每个CDS视图创建一个CDS数据库视图,此视图只支持透明表,这意味着池表和蔟表不能通过CDS View访问。
对于CDS View,CDS View增强是在不进行修改的情况下进行增强的一种独立方式。

posted @ 2020-11-30 17:50  小道清玄  阅读(265)  评论(0编辑  收藏  举报