美文网首页
添加了 @OData.publish 注解的 SAP CDS v

添加了 @OData.publish 注解的 SAP CDS v

作者: _扫地僧_ | 来源:发表于2024-08-02 22:17 被阅读0次

    本文阅读目录

    • 为什么基于 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 工作原理解析

    相关文章

      网友评论

          本文标题:添加了 @OData.publish 注解的 SAP CDS v

          本文链接:https://www.haomeiwen.com/subject/oodohjtx.html