ABAP CDS-Part 1(ABAP CDS实体)
文章翻译自Tushar Sharma的文章,转载请注明原作者和译者!
在我们开始之前
预备条件
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类型:
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增强是在不进行修改的情况下进行增强的一种独立方式。
参考文章
- ABAP CDS Development User Guide
- ABAP CDS Access Control
- Enhanced ABAP Development with Core Data Services (CDS)
拓展阅读
ABAP CDS-Part 1(ABAP CDS实体)的更多相关文章
- 【ABAP CDS系列】ABAP CDS中的系统信息
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP CDS系列]ABAP CDS中的系统 ...
- 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
Jerry 2016年在学习SAP CDS view时,曾经写过一个CDS view的自学系列,其中有一篇提到了一个很方便的注解: @OData.publish: true 加上这个注解的CDS vi ...
- ABAP CDS ON HANA-(11)ABAP CDSでの関連付け
Association in ABAP CDS An association in CDS view joins different data sources. Defining and using ...
- 【ABAP系列】SAP ABAP 带有参数的AMDP的创建
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 带有参数的AM ...
- 【ABAP系列】SAP ABAP BAPI_REQUISITION_CREATE创建采购申请
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP BAPI_RE ...
- 【ABAP系列】SAP ABAP 字符编码与解码、Unicode
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 字符编码与解码 ...
- 【ABAP系列】SAP ABAP下载带密码的Excel文件
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP下载带密码的Ex ...
- 【ABAP系列】SAP ABAP 高级业务应用程序编程(ABAP)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 高级业务应用程 ...
- 【ABAP系列】SAP ABAP Break Point
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP Break P ...
- 【ABAP系列】SAP ABAP替代校验全解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP替代校验全解析 ...
随机推荐
- Windows 10 启动出现蓝屏 终止代码:UNMOUNTABLE_BOOT_VOLUME
解决办法:在命令符窗口中[管理员权限] 1.– 修复Windows文件:损坏的Windows文件可能会导致严重的问题. sfc /scannow 2 .– 修复硬盘:确保您的硬盘依次运行,以及Wind ...
- 超实用的14个 Spring MVC “隐藏”技巧,用了都说好!
通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,该名称由Spring的调度程序Servlet ...
- leetcode114:valid-sudoku
题目描述 根据数独的规则Sudoku Puzzles - The Rules.判断给出的局面是不是一个符合规则的数独局面 数独盘面可以被部分填写,空的位置用字符'.'.表示 这是一个部分填写的符合规则 ...
- 自制 os 极简教程1:写一个操作系统有多难
为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...
- ARM的三级流水线结构
看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果.所以,决定总结学习下ARM流水线. ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/ ...
- Dem地形数据转换为cass支持的dat格式教程
一.获取dem数据各类精度的dem高程数据下载这里不赘述,可以查阅这篇文章:高程数据下载 这里我们以12.5m精度的dem为例进行转换: 二.将dem数据转换为文本我们这里先将地形数据加载入globa ...
- mysql一些好的问题
一."N叉树"的N值在MySQL中是可以被人工调整吗? 1, 通过改变key值来调整N叉树中非叶子节点存放的是索引信息,索引包含Key和Point指针.Point指针固定为6个字节 ...
- select限制之文件描述符限制
1.一个进能够打开的最大文件描述符限制.可以通过两种方式修改ulimit -n :获取最大文件描述符个数ulimit -n 2048:修改为2048个 该限制的测试代码: 客户端程序: /* 1.se ...
- malloc/free与new/delete的区别(转)
相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...
- 如何实现Http请求报头的自动转发[应用篇]
如今的应用部署逐渐向微服务化发展,导致一个完整的事务往往会跨越很多的应用或服务,出于分布式链路跟踪的需要,我们往往将从上游服务获得的跟踪请求报头无脑地向下游服务进行转发.本文介绍的这个名为Header ...