使用ABAP CDS视图创建服务(CDSビューでODATAサービスの作成方法)
介绍
本文介绍使用ABAP Core Data Services创建OData服务的最快方法。 给出了有关@ OData.publish注释利用率,对数据源CDS实体的引用和从DDIC结构导入的详细信息。 自定义透明表数据上显示的创建,更新和删除操作只是为了简化文章,而不是将重点从OData服务创建转移到业务流程需求实现。
“R”类型OData服务创建。 在ABAP CDS中使用@ OData.publish注释
我们假设我们有下列数据表(可能在自定义命名空间中,只是为了简化演示案例并仅关注OData服务,而不是关注SAP功能模块和类使用)

可以使用SAP HANA Studio为其创建ABAP CDS视图

在CDS激活期间,OData服务将在后台生成。
服务文档如下所示:

“R”类型OData服务创建。 使用ABAP CDS上的参考

可以使用SAP HANA Studio为其创建ABAP CDS视图。 请注意,在这种情况下,没有使用@OData注释



SAP将基于对ABAP CDS的引用生成运行时对象

服务文档如下所示:

“CRUD”类型OData服务创建

可以使用SAP HANA Studio为其创建ABAP CDS视图(未使用@OData注释)

在下一步中,我们将通过事务代码SEGW创建网关项目并导入DDIC结构(使用ABAP CDS中的@ AbapCatalog.sqlViewName值,请参见上图)



如果您正在使用具有关联的复杂CDS(例如,对于Master-Details视图),则还应创建关联和导航属性。 将添加此部分。
SAP将生成运行时对象



这里可以直接向ABAP CDS指出SELECT语句的Get_EntitySet方法
1 2 3 4 5 6 | METHOD experimentset_get_entityset. SELECT * FROM zxeq1_lexprmnt01 INTO CORRESPONDING FIELDS OF TABLE @et_entityset ORDER BY PRIMARY KEY . ENDMETHOD. |
如果设置实体集的可搜索参数,则ABAP代码实现应如下所示
1 2 3 4 5 6 7 8 9 10 11 | METHOD experimentset_get_entityset. DATA: lv_osql_where_clause TYPE string. "Prepare where clause lv_osql_where_clause = io_tech_request_context->get_osql_where_clause( ). " Select data SELECT * FROM zxeq1_lexprmnt01 INTO CORRESPONDING FIELDS OF TABLE @et_entityset WHERE (lv_osql_where_clause) ORDER BY PRIMARY KEY . ENDMETHOD. |
如果您另外设置实体集的Pageable参数,则ABAP代码应如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | METHOD experimentset_get_entityset. DATA: lv_osql_where_clause TYPE string, lv_top TYPE i, lv_skip TYPE i, lv_max_index TYPE i. "Prepare top and skip lv_top = io_tech_request_context->get_top( ). lv_skip = io_tech_request_context->get_skip( ). IF lv_top IS NOT INITIAL. lv_max_index = lv_top + lv_skip. ENDIF. " Prepare where clause lv_osql_where_clause = io_tech_request_context->get_osql_where_clause( ). "Select data SELECT * FROM zxeq1_lexprmnt01 INTO CORRESPONDING FIELDS OF TABLE @et_entityset UP TO @lv_max_index ROWS WHERE (lv_osql_where_clause) ORDER BY PRIMARY KEY. " Process skip IF lv_skip IS NOT INITIAL. DELETE et_entityset TO lv_skip. ENDIF. "Process inline couter IF io_tech_request_context->has_inlinecount( ) = abap_true. SELECT COUNT (*) FROM zxeq1_lexprmnt01 WHERE (lv_osql_where_clause). es_response_context-inlinecount = sy-dbcnt. ELSE . CLEAR es_response_context-inlinecount. ENDIF. ENDMETHOD. |
在Get_Entity方法中,我们应该使用ABAP CDS和其他数据类型相关的对象和关键字段名称
1 2 3 4 5 6 7 8 9 10 11 12 | METHOD experimentset_get_entity. DATA: ls_data TYPE zcl_xeq1s_exprmnt01p_mpc=>ts_experiment. "Convert keys to data CALL METHOD io_tech_request_context->get_converted_keys IMPORTING es_key_values = ls_data. " Select data by keys SELECT SINGLE * INTO CORRESPONDING FIELDS OF @er_entity FROM zxeq1_lexprmnt01 WHERE uname = @ls_data-uname. ENDMETHOD. |
如果设置Creatable参数,则应实现Create_Entity方法,ABAP代码可能如下所示。 在我们当前的示例中,我们使用数据库表作为INSERT数据的目标(在更复杂和更现实的业务案例中,SAP BAPI或功能模块或ABAP类应在此处用于实现所需的业务逻辑)
1 2 3 4 5 6 7 | METHOD experimentset_create_entity. DATA: ls_data TYPE zxeq1_dexprmnt01. " Insert data in database MOVE -CORRESPONDING er_entity TO ls_data. INSERT zxeq1_dexprmnt01 FROM @ls_data. ENDMETHOD. |
如果您设置Updatable参数,那么您应该实现Update_Entity方法,如下面的示例。 在我们当前的示例中,我们使用数据库表作为UPDATE数据的目标(在更复杂和更现实的业务案例中,SAP BAPI或功能模块或ABAP类应在此处用于实现所需的业务逻辑)
1 2 3 4 5 6 7 | METHOD experimentset_update_entity. DATA: ls_data TYPE zxeq1_dexprmnt01. " Update data in database MOVE -CORRESPONDING er_entity TO ls_data. UPDATE zxeq1_dexprmnt01 FROM @ls_data. ENDMETHOD. |
如果设置了Entity Set的Deletable参数,那么您应该实现Delete_Entity方法,如下例所示。 在我们当前的示例中,我们使用数据库表作为删除数据的目标(在更复杂和更现实的业务案例中,SAP BAPI或功能模块或ABAP类应在此处用于实现所需的业务逻辑)
1 2 3 4 5 6 7 8 9 10 | METHOD experimentset_delete_entity. DATA: ls_data TYPE zcl_xeq1s_exprmnt01p_mpc=>ts_experiment. "Convert keys to data CALL METHOD io_tech_request_context->get_converted_keys IMPORTING es_key_values = ls_data. " Delete data from database DELETE FROM zxeq1_dexprmnt01 WHERE uname = @ls_data-uname. ENDMETHOD. |
创建了以下OData服务文档

结论
本文展示了一种基于ABAP CDS技术的完整CRUD功能支持的快速简单的OData服务创建方法。 可以看到基于ABAP CDS的CRUD OData服务的包装器可以创建为几个小时的活动。 我们需要的只是在其中添加ABAP逻辑,这与我们在使用Web服务之前在ABAP开发中完成的活动大致相同。 此外,在ABAP CDS视图上创建的OData服务已准备好供SAP HTML5(UI5)应用程序使用,可以从SAP Cloud Platform部署到公司本地SAP Fiori Launchpad或SAP Fiori Cloud Launchpad(Portal)。
附: 请注意,在使用SAP Fiori Cloud Launchpad的情况下,我们必须使用SAP Cloud Platform OData Provisioning Service来包装OData服务。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏