添加了 @OData.publish 注解的 SAP CDS view 发布的 OData 服务,为何不支持修改和创建功能?

本文阅读目录

  • 为什么基于 CDS View 直接生成的 OData 服务,不支持修改和创建操作?
  • 在 SEGW 事务码里完成修改和创建操作的逻辑实现
  • 总结

笔者的知识星球里有朋友提问:

在 SAP S/4HANA On-Premise 里开发了一个 CDS View,添加了 @OData.publish: true 的注解,成功生成 OData 服务。测试时通过 HTTP GET 能够正常获取数据,但是 HTTP Post 测试失败。

错误消息:The requested service is not supported by entity CDS~XXXX.

本文就来聊一聊通过 CDS View 添加上 @OData.publish: true 注解后生成 OData 服务这个话题。

8 年前的 2016 年 3 月,笔者完成了一个原型开发。当时的 SAP CRM,管理 Service Order 还只能通过 WebClient UI 进行。

我当时使用了 Smart Template(如今 Fiori Elements 的前身) + CDS View 这一在当时还算比较前沿的技术,基于 CDS View 快速生成了一个 OData 服务和一套 Fiori UI,提供了 SAP CRM Service Order 数据的搜索和增删改查操作。

当然 8 年后的今天,我不清楚在如今的 SAP S/4HANA On-Premise 里,是否存在更优的解决方案。如果本文读者在项目中有类似的需求,但是采取了其他解法,还请在文章评论区分享和讨论。

我当时把这个原型开发的全部细节,发布在了 SAP 社区博客上,文章地址如下。虽然社区几经改版,但这篇文章仍然有将近 1 万的阅读量。

为什么基于 CDS View 直接生成的 OData 服务,其读取和写入操作(包含创建和修改),要分开来实现呢?

众所周知,CDS View 只支持读取操作,不支持写入数据。

我们利用数学上的反证法来推理。

假设一个 CDS View 添加了 @OData.publish: true 的注解之后,生成的 OData 服务就自动支持写入操作。

那么我们通过 HTTP Post 消费 OData 服务,向其发送待写入的数据。请问 OData 服务接收到这些数据之后,要怎么处理呢?它根本找不到可以存放数据的场所。

这就需要作为开发人员的我们,去手动实现 OData 服务的修改和创建功能。

新的问题又来了。

添加了 @OData.publish: true 注解的 CDS View,激活后自动生成了 OData 服务,但是我们在哪里去给它增添修改和创建功能呢?

是下图的 CDS View 源代码编辑器里吗?

当然不是。CDS View 源代码编辑器里,无法编辑 ABAP 应用代码。

在 SEGW 事务码里完成修改和创建操作的逻辑实现

正确的做法是,在 SEGW 事务码里导入添加了 @OData.publish: true 注解的 CDS View,然后继续完成剩下的两块拼图,即 OData 服务修改和创建功能的开发。

我曾经写了一套使用 SEGW 开发 OData 服务的学习教程,通过一个图书管理应用的例子,介绍了如何给 OData 服务,提供图书增删改查的功能。

SAP OData 开发实战教程:从入门到提高

现在使用 @OData.publish: true 注解后的 CDS View,其实省去了读取和查找功能实现的工作量。

但是修改和创建操作,仍然需要我们手动在 SEGW 里实现。

为此我们需要先将 CDS View 导入到 SEGW 中。

新建一个 SEGW 项目,选中 DATA Model 的右键菜单,在 Reference 里选择之前创建好的 CDS View,即可完成导入。

接下来就是熟悉的 SEGW 常规开发了。点击激活按钮,生成运行时的 DPC 和 MPC 类。

然后按照笔者的开发教程,或者 SAP 官方帮助文档,完成 DPC_EXT 类下列三个方法的开发,即可实现修改功能。

  • CHANGESET_BEGIN
  • CHANGESET_END
  • PATCH_ENTITY

具体编码略。

同理,完成 CREATE_ENTITY 方法的开发,即可实现 OData 服务的创建功能。

笔者 8 年前开发的这个原型项目,总共引入了下图这些 CDS View,感兴趣的朋友可以从笔者文章里找到这些视图的源代码:

总结

一个功能完备的 OData 服务实现,一般都支持对其底层数据模型的搜索和增删改查操作。

使用 SEGW 开发工具,这些操作都必须手动实现。导入包含 @OData.publish: true 的注解的 CDS View,可以省去搜索和读取操作的实现,但修改和创建操作仍需手动实现。

SAP 社区上除了我的博客外,也有其他从业者的分享文章,内容和我的文章大致一致,只是晚于笔者两年后发表:

https://community.sap.com/t5/technology-blogs-by-members/c-create-r-read-u-update-d-delete-odata-services-creation-using-abap-cds/ba-p/13353722

当然,笔者在 SAP 社区上的文章写于 8 年之前了。如果目前大家有更好的解决方案,欢迎分享。

另外如果对 @OData.publish 注解底层工作机制感兴趣的朋友,可以阅读笔者之前的文章:

揭开 SAP Fiori 编程模型规范里注解的神秘面纱 - @OData.publish 工作原理解析

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值