介绍
本文介绍使用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. web.config如何实现301跳转

    .htaccess的301定向非常简单,那么web.config的301定向又应该怎么实现呢? 先来看下,web.config中的301格式 <?xml version="1.0&qu ...

  2. jQuery解决高度统一问题

    <div class="itemdl over"> <dl class="fl"> <dt><img src=&quo ...

  3. 040同步条件event

    条件同步和条件变量同步差不多意思,只是少了锁功能,因为条件同步设计于不访问共享资源的条件环境,event=threading.Event():条件环境对象,初始值为False.event.isSet( ...

  4. The Tao to Excellent

    1:一次只做一件事情 我不具备同时做好多件事情的能力. 2:随身携带一本书 效率最高的学习时间是那些零碎的时间. 3:听身体的 休息的标准是:如果你觉得你是在休息,那你就是在休息了. 4:如果有一件事 ...

  5. CF311E Biologist

    嘟嘟嘟 很显然是一道最小割模型. 做完几道题后.图的大概就能想出来了: 1.对于每一个动物,如果是0,就和s连一条边,否则向t连一条边. 2.对于每一个任务,题中要求最大利润,可以转化成最小损失. ( ...

  6. new ,malloc

    特征 new/delete malloc/free 分配内存的位置 自由存储区 堆 内存分配失败返回值 完整类型指针 void* 内存分配失败返回值 默认抛出异常 返回NULL 分配内存的大小 由编译 ...

  7. Redis数据类型(下)

    集合Set    Redis 的集合不是 个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来 存储和查找数据,理论上 个集合可以存储 232 (大约 42 亿)个元素,因为采用哈希表结 ...

  8. ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架

    ASP.NET SingalR不多介绍.让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见. 先简单介绍聊天室功能: 用户加入聊天室,自动给用户 ...

  9. 【转】Java中关于WeakReference和WeakHashMap的理解

    新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...

  10. Grunt中批量无损压缩图片插件--grunt-sprite

    这是什么 这是一个帮助前端开发工程师将css代码中的切片合并成雪碧图的工具,它的主要功能是: 使用二叉树排列算法,对css文件进行处理,收集切片序列,生成雪碧图 在原css代码中为切片添加backgr ...