本文阅读目录
- 为什么基于 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 服务,提供图书增删改查的功能。
现在使用 @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 社区上除了我的博客外,也有其他从业者的分享文章,内容和我的文章大致一致,只是晚于笔者两年后发表:
当然,笔者在 SAP 社区上的文章写于 8 年之前了。如果目前大家有更好的解决方案,欢迎分享。
另外如果对 @OData.publish 注解底层工作机制感兴趣的朋友,可以阅读笔者之前的文章:
网友评论