使用CDS view进行S4HANA的OData开发

66336d57ce7cea0170974fc778899aa2.jpeg

CDS(Core Data Service)View是S/4HANA里重要的建模方式之一。下面是S/4HANA的架构图,可以很清晰的看到CDS View在整个架构中的重要地位:S/4HANA里大部分ABAP代码对底层数据的事务操作(Transactional Logic, 即数据读和写)和报表分析逻辑(Analytic Logic), 几乎都基于构造于底层数据库表的CDS View来进行,而不像SAP Business Suite那样,直接操作底层的数据库表。

349d392649b044e89667c84f9e43f19a.jpeg

CDS View从其名称来分析,它首先仍然是一个数据库视图,将底层数据库表的某些字段暴露给消费者。同时CDS View提供的功能远远不局限于传统的数据库视图,SAP围绕着CDS View打造了一系列框架,本文要阐述的则是S/4HANA里基于CDS View模型的OData开发的具体操作与实现。

1

在深入S/4HANA OData开发之前,我们首先回顾SAP OData开发的演进路线。SAP成都研究院的Jerry Wang曾经在他的公众号文章SAP OData编程指南里讲述SAP Business Suite系统里OData的开发,可以简单归纳成以下步骤:

1. 在事务码SE11里创建OData模型需要的ABAP数据类型。

2. 在事务码SEGW里创建OData模型。OData模型是一个树形结构,由1个根节点和若干个子节点构成。父子节点间的关联通过navigation实现。激活OData模型,自动生成OData模型的元数据提供类(MPC)和业务数据提供类(DPC)。

3. 在事务码SE24或者SE80里对MPC和DPC进行ABAP编程。

可以看出Business Suite里的OData开发需要使用三种不同的开发工具,前两步可以概括为建模,而第三步则是具体编程实现。而OData实现的工作量主要集中在第三步。然而,我们试想这个场景,以Opportunity和Lead这两个模型的OData实现举例,除了它们底层数据库表的具体字段可能有所差异之外,围绕着这些模型进行的读,写和搜索的代码,必然有很多相似之处,那么用Business Suite这种开发方式,必然会造成在DPC的ABAP编码里有很多相似的代码出现。

因此,在S/4HANA里引入了一种全新的OData开发方式:基于CDS View的元数据驱动开发(Metadata-Driven Development)。所谓元数据驱动,意即开发人员只需要把精力花在CDS View这个元数据的开发上,至于围绕着CDS View的数据读取逻辑,则由S/4HANA的框架处理了,无需开发人员再手动编写代码。

2

我们先来看看S/4HANA标准的Fiori应用,Product Master,是如何贯彻基于CDS View的元数据驱动开发的思路的。S/4HANA Fiori Launchpad里点击Product Master tile来访问这个Fiori应用:

5b61631a8bf532cca24c7f0c92461efc.jpeg

在Chrome开发者工具的Network标签页观察到S/4HANA里Product Master这个Fiori应用基于的OData服务名称为MD_C_PRODUCT_MAINTAIN_SRV:

45acb4899cbdc603c8a930828426a6b1.jpeg

到S/4HANA的后台系统,使用事务码SEGW打开这个OData服务对应的模型, 在Data Source References->Exposures via SADL->CDS-Entity Exposures里能看到这个OData模型基于的CDS View是:C_Product

0ba6538fe1983703db7388afbd0ae030.jpeg

我们用ABAP Development Studio,在包VDM_MD_PRODUCT里能找到CDS View C_Product,可以看到它又是基于I_ProductWD这个View构建的。我们再打开I_ProductWD,依次类推,最后发现这些View基于的数据库表就是MARA,也就是我们熟悉的物料主数据的数据库表。

66e3a546cd17451487c1eef2730f3af0.jpeg

现在,就让我们来模仿S/4HANA的C_Product, 动手通过CDS View开发一个OData服务。

因为CDS View还是得基于一张实际的数据库表创建,因此我们先创建一张简单的数据库表,里面的记录用于描述一本图书的ID,名称和作者。

cba3b2c806191340147d3f483cfee3fd.png

插入三条数据:

efbeccf2e6f8e2c8de5abfffda17cbb5.png

然后基于数据库表ZBOOK创建一个CDS View: C_Book。这里我们也仿照S/4HANA Product Master的CDS View的命名规范,前缀C指Consumption(消费)。源码如下:

f3fcf70f7f9915cceddc59b0a00b8615.png

第一行的注解@AbapCatalog.sqlViewName定义了该CDS View在事务码SE11里对应生成的视图名称为ZCBOOK。可以在SE11里根据该名称打开它。

880dd2f3bbee02fd8de911420ced1e55.png

第二行@AccessControl.authorizationCheck:指定该CDS View的权限检查方式。因为本文出于演示目的,不需要进行权限检查。

在自动完成列表里能看到这个注解其他的可选值:

11eacdb3b45eca832656bdacc612995d.png

第三行@EndUserText.label:该CDS View的描述信息,能在其他消费CDS View的框架中被读取,比如出现在前面展示的SE11里的Short Description字段。

第四行@ClientHandling.algorithm:我选择的是#SESSION_VARIABLE,这样一旦运行时该CDS View对应的数据被读取时,ABAP框架会自动在Where语句中添加一个client处理语句。我们来看个例子。

执行下面这行ABAP语句:

SELECT * INTO TABLE @DATA(lt_table) FROM c_book.

用ST05观测,发现ABAP框架悄悄地添加了一个WHERE "MANDT" = '001', 确保只有当前登录Client的数据被读取出来。

eed2f60eab696001589106bfa85dcbed.png

这也是为什么@ClientHandling.algorithm的值选择为#SESSION_VARIABLE后,CDS View生成的ABAP视图会自动出现一个MANDT字段:

b9e0f75d8b8e46e3378c49e7c6ce5741.jpeg

CDS View开发完成之后,我们可以用该View生成一个OData服务了。

事务码SEGW,创建一个新的OData项目:

e4b3ede56b87caee92a22ce592ddbb08.png

使用右键菜单Data Model->Reference->Data Source:

82e0710f2860343d3ad169b865d7c800.png

输入我们之前创建的CDS View名称:C_Book:

c1a614f9aecd2e0ac6dd71054bdc024b.png

此时在文件夹Exposures via SADL下面就能看见我们导入的CDS View对应的数据类型了,这个SADL我们马上会介绍。点击"Generate Runtinme Objects",生成DPC和MPC。

bf040ea32fd5b10ffb419875e4a158f4.jpeg

围绕着ZBOOK这张表的OData服务就生成好了——我们并没有做任何ABAP编程来实现ZBOOK表里数据的读取,这些都是S/4HANA里的SADL(Service Adaptation Definition Language)自动实现的。

我们先对自动生成的OData服务进行测试。把刚才自动生成的OData服务名字抄下来:MD_BOOK_SRV

dc4e8574a39f264f9f90009c6af4e664.png

使用事务码/IWFND/MAINT_SERVICE,点击“Add Service":

c1413540bd448a86fc5f3bea4b9859f9.png

在External Service Name里填入OData服务的名称,点击"Get Services"按钮,选中结果,再点"Add Selected Services":

d1e74552184120ad9a51f4469d39a80f.jpeg

然后这个OData服务就会出现在Service Catalog列表下了,点击SAP Gateway Client即可开始测试了。

b1722bbcbca0d66c78e260047100e63e.jpeg

Request URI维护成/sap/opu/odata/sap/MD_BOOK_SRV/?$metadata&$format=xml,点Execute按钮,就能成功返回该OData服务的metadata。当然用浏览器测试也行。

8ae8bb92da91fb560d8b595171287992.jpeg

使用如下的URL, 即可通过OData服务读取CDS View C_Book里的全部内容:

/sap/opu/odata/sap/MD_BOOK_SRV/c_book

可以看到三本书的内容都成功读取出来了。

d76a1004af2691d4171a10993db7c28f.jpeg

3

最后要介绍的就是SADL。到目前为止,我们只是进行了CDS View开发并将View导入SEGW的项目里,自动生成了OData服务,然而并未进行一行的ABAP编码。这正体现了前面提到的Metadata-Driven Development——元数据编程思路的优越之处:开发人员只需要关注于用CDS View进行业务模型的设计,运行时的读取,交由SADL框架来完成。

我们在类CL_SQL_STATEMENT的方法EXECUTE_QUERY设置断点,然后再次打开访问URL /sap/opu/odata/sap/MD_BOOK_SRV/c_book,断点触发:

ec6103c6487de916082568c4cac4e987.jpeg

从调用栈能看出通过构建于CDS View之上的OData服务读取数据,经历了几个不同的框架调用:

1. SAP Gateway框架类,就是图中以命令空间/IWFND开头的类,负责接收从浏览器发送过来的OData请求,根据请求URL里包含的MD_BOOK_SRV这一OData服务名,分发给对应的DPC类CL_MD_BOOK_DPC。

2. 因为CL_MD_BOOK_DPC的代码是通过事务码SEGW自动生成的,里面没有应用开发人员编写的逻辑,而是把调用转交给SADL框架。

3. SADL框架负责把请求映射成对应的SQL语句,通过一个SAP内部函数调用C_DB_FUNCTION进行数据读取:

d838884ddb9e04704786dade1d6f174c.jpeg

这就是S/4HANA里通过CDS View构造的OData的工作原理,感谢阅读。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值