介绍
本文介绍使用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注释

 
 
 
在下一步中,我们将通过事务代码SEGW创建网关项目,并将其引用到上一步ABAP CDS中创建的

 
 

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

 
 

服务文档如下所示:

 
 

“CRUD”类型OData服务创建

 

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

 
 

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

 
 
 

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

SAP将生成运行时对象

 
 
 
对于“CRUD”类型的OData服务,我们应该设置实体集的参数,然后实现它们中的每一个。
 
 
 
 
导航到ABAP Workbench并重新定义* DPC_EXT类的方法以进行CRUD操作
 
 

这里可以直接向ABAP CDS指出SELECT语句的Get_EntitySet方法

METHOD experimentset_get_entityset.
SELECT *
FROM zxeq1_lexprmnt01
INTO CORRESPONDING FIELDS OF TABLE @et_entityset
ORDER BY PRIMARY KEY.
ENDMETHOD.

如果设置实体集的可搜索参数,则ABAP代码实现应如下所示

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代码应如下所示

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和其他数据类型相关的对象和关键字段名称

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类应在此处用于实现所需的业务逻辑)

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类应在此处用于实现所需的业务逻辑)

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类应在此处用于实现所需的业务逻辑)

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服务。

使用ABAP CDS视图创建服务的更多相关文章

  1. ABAP CDS-介绍(ABAP CDS视图)

    前言 文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 在SAP发展到SAP HANA版本之后,SAP内部的技术正在快速地变化,SAP开发业务应用程序的方式已经发生了范式转变(根本 ...

  2. 教程:基于访问控制的ABAP CDS视图权限

    Hi! 对每一个CDS视图,我们都可以通过DCL(Data Control Language)定义访问控制.在这篇文章中,我会介绍ABAP CDS视图中非常重要的一面:权限管理. 本文的阐述基于我正在 ...

  3. ABAP-Eclipse ADT中创建ABAP CDS视图

    Create an ABAP Project in ABAP Development Tools (ADT): https://developers.sap.com/tutorials/abap-cr ...

  4. CDS测试框架介绍:如何为ABAP CDS Entities写测试

    动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...

  5. ABAP CDS-Part 1(ABAP CDS实体)

    文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 目录 预备条件 一.概述 二.ABAP CDS实体(CDS Entity) a.定义ABAP CDS Views b.ABAP C ...

  6. ABAP CDS Table Function介绍与示例

    Core data services(以下简称CDS)可以指两样东西,一个是HANA CDS,一个是ABAP CDS. 如我们所知,HANA CDS只支持HANA数据库,ABAP CDS理论上支持多种 ...

  7. 使用PlanViz进行ABAP CDS性能分析

    如管理学学者彼得·德鲁克所说:你无法管理你不能衡量的东西( If you can't measure it, you can't manage it).要对已有程序进行性能优化,首先要对它的运行状况做 ...

  8. 【ABAP CDS系列】ABAP CDS中的系统信息

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP CDS系列]ABAP CDS中的系统 ...

  9. CDS视图篇 2

    核心数据服务 (CDS) 公司希望使用 SAPS/4HANA 核心数据服务 (CDS) 视图技术.需要学习 CDS 视 图的概念和结构以及语法 . ● 核心数据服务是用于业务实体的 SAP 战略建模方 ...

随机推荐

  1. php大文件上传失败的原因及解决方法

    为什么上传大文件总是失败,上传小文件就没有问题.关于PHP大文件上传失败的原因及解决方法如下: 第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定 ...

  2. openvpn(上)

    VPN概述:(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公网中建立专用的数据通信网络的技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道 ...

  3. 使用npoi插件将excel文件导出

    大致流程:前端使用URL地址的方式跳转到action后返回file类型数据 js: window.location.href = '/Home/index?Id=' + id 后台代码: /// &l ...

  4. rc.local 开机自启脚本无法启动

    1.看是否rc.local 第一行如果是 #!/bin/sh -e 改成 #!/bin/bash sudo systemctl enable rc-local.service 2.看rc.local的 ...

  5. 【luogu P4017 最大食物链计数】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4017 DAG + DP #include <queue> #include <cstdio ...

  6. 关于readonly的一些说明

    readonly在代码中只能在字段初始化器和构造函数中赋值,并不是说readonly只能赋值一次,超出这个范围以后readonly就不能通过代码修改了,但是还是可以用反射来修改,readonly仅仅是 ...

  7. Node环境下实现less编译

    今天在学习less的时候发现了在node中是可以渲染的,通过调用less的render方法渲染来生成css,所以写了个小Demo. var less = require('less'); var ht ...

  8. 自学安卓练习作品单词APP(1)-安卓的hello word与有道字典防爬虫破解

    1.前言 闲来无聊.手机每天又是都接触的东西.程序什么的最容易接触到.想到有些人说前后端都做就是全栈的说法.哦,你看html5全栈. 要我说多接触一些多有意思.天天写后端.还不是业务层.又不是什么高大 ...

  9. Java 分支结构

    Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java 有两种分支结构: if 语句 switch 语句 if 语句 一个 i ...

  10. HDBS之应用代码优化

    一.目录结构树 总体概述 代码检测工具sonar HDBS代码优化 总结开发注意点 二.总体概述 进入现在这家公司我的第一个任务就是对HDBS进行代码质量优化.HDBS可能大家不是很了解,现在给大家简 ...