当前位置:网站首页>SAP ABAP OData 服务如何支持 $filter (过滤)操作试读版
SAP ABAP OData 服务如何支持 $filter (过滤)操作试读版
2022-07-31 12:04:00 【汪子熙】
正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到提高(包含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,可以分为三大类。因此本教程也分为三大部分,分别进行介绍。本文是本教程的文章目录。
作者简介
Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 标准产品开发生涯里,Jerry 曾经先后参与 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等标准产品的研发工作。
Jerry 对 SAP OData 服务的开发,测试,发布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和使用场合,均有着深入的研究。
基于 SEGW - Gateway Service Builder 的开发教程
使用 Restful ABAP Programming 编程模型(简称 RAP) 开发 OData 服务
- 正在写作中,敬请期待
使用 SAP Cloud Application Programming 编程模型开发 OData 服务
- 正在写作中,敬请期待
本教程的前四篇文章,我们已经使用事物码 SEGW,开发了一个用于图书管理的 OData 服务,成功将其配置并部署到了 ABAP 系统上,可以通过下列两个链接,在 SAP ABAP Gateway Client 里,分别返回 OData 服务的元数据和硬编码的一条图书数据。
/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/$metadata
/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection
4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南
本步骤我们会介绍如何实现 OData 服务的 $filter 即过滤操作。
成功实现后的效果是,我们在 Gateway Client 里输入如下链接:
/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection?$filter=book_id eq '1001'
能精准返回 book_id 等于 1001 的这条图书记录,这里 url 片段里的 eq
,代表 equal,即 =
的含义。
下面是本步骤的详细实现步骤。
首先,因为我们想演示从多条图书记录里,精准返回匹配 $filter 输入条件,即 book_id 满足 url 里指定值的图书信息,所以我们需要在系统里准备多条图书数据。此时用硬编码的方式就显得不够灵活了,因此我们创建一个名叫 ZBOOKS 的数据库表。
这个表的字段名同本教程第一篇文章1. 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目介绍的图书管理 OData 模型的 Entity Type 的字段类型和名称完全一致:
成功创建并激活数据库表之后,我们进入 SE16 事物码,给这张表里插入两条测试数据:
除了 Book GUID 之外的其他字段,我们都可以通过手动录入的方式来维护:
对于 Book GUID 字段,我们用 SE37 事物码打开函数 GUID_CREATE
, 然后按 F8 执行:
下面能够看到执行结果,双击 EV_GUID_16:
然后选择菜单 Object -> Save to PC File:
在保存选项里,选择最后一个选项,即将 GUID 保存到系统剪切板。
然后回到 SE16 ZBOOKS 的数据维护对话框,单击 BOOK GUID, 然后 Ctrl + V 即可。
重复之前的完整流程,再插入另一条数据到数据库表里。现在,表里就有了两条测试数据。
我们用 SE24 打开 OData 服务的 DPC 类,打开我们前一步骤重定义的 GET_ENTITYSET 方法。
首先把之前在方法里返回一条硬编码数据的逻辑删除,取而代之以从以上创建的数据库表 ZBOOKS 里,将两条测试数据用 OPEN SQL 读取出来。
修改之后的代码如下图所示:
METHOD /iwbep/if_mgw_appl_srv_runtime~get_entityset.
DATA: lt_book_db TYPE TABLE OF zbooks,
ls_book_db LIKE LINE OF lt_book_db,
lt_book TYPE zcl_zbook_manage_mpc=>tt_book,
ls_book LIKE LINE OF lt_book.
FIELD-SYMBOLS: <book> LIKE lt_book.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_book_db FROM zbooks.
LOOP AT lt_book_db INTO ls_book_db.
MOVE-CORRESPONDING ls_book_db TO ls_book.
APPEND ls_book TO lt_book.
ENDLOOP.
CREATE DATA er_entityset TYPE zcl_zbook_manage_mpc=>tt_book.
ASSIGN er_entityset->* TO <book>.
<book> = lt_book.
ENDMETHOD.
打开 Gateway Client,执行 url:/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection
,可以看到数据库表里的两条数据,成功被 OData 服务返回:
然后打开 /IWFND/GW_CLIENT
事物码,输入 url /sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection?$filter=book_id eq '1001'
执行,观察断点触发时,SAP OData 框架如何将上述 url 解析后的值,传入到该方法内:
我们在调试器内,观察这个方法的输入参数 IT_FILTER_SELECT_OPTIONS
,里面已经被填充了一条记录,内容如下:
显然,这就是 SAP ABAP OData 框架将 $filter=book_id eq '1001'
url 解析成 ABAP 的对应值。
其中上图的 SELECT_OPTIONS 内容又是一个内表,内容如下,代表 eq '1001'
:
还记得我们在教程第一篇文章,1. 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目 里提到,在 SEGW 项目里,对 book_id 这个字段的 Filterable
属性打上了 *
么?这代表我们作为 OData 服务的提供者,告诉 OData 服务的消费者,这个字段支持 $filter
操作。
接下来,我们需要在 ZCL_ZBOOK_MANAGE_DPC_EXT->GET_ENTITYSET 方法里,用 ABAP 实现这个过滤逻辑。
主要逻辑分为两大块:
(1) 如果输入内表 it_filter_select_options 为空,说明用户没有指定任何过滤条件,此时直接用 SELECT 操作,读取数据库表里所有的数据。
(2) 如果输入内表不为空,则从内表里读取出用户通过 url 传递进来的过滤条件。当前实现我们只支持根据 book_id
过滤,见代码第 22 行的 IF 判断。如果过滤条件为 book_id
, 我们使用 SELECT SINGLE
,读取满足过滤条件的单条记录,因为我们假定任何两本图书,不可能拥有相同的 book_id
值。
完整代码如下:
METHOD /iwbep/if_mgw_appl_srv_runtime~get_entityset.
DATA: lt_book_db TYPE TABLE OF zbooks,
ls_book_db LIKE LINE OF lt_book_db,
lt_book TYPE zcl_zbook_manage_mpc=>tt_book,
ls_book LIKE LINE OF lt_book,
ls_filter LIKE LINE OF it_filter_select_options,
ls_option LIKE LINE OF ls_filter-select_options.
FIELD-SYMBOLS: <book> LIKE lt_book.
IF it_filter_select_options IS INITIAL.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_book_db FROM zbooks.
LOOP AT lt_book_db INTO ls_book_db.
MOVE-CORRESPONDING ls_book_db TO ls_book.
APPEND ls_book TO lt_book.
ENDLOOP.
ELSE.
READ TABLE it_filter_select_options INTO ls_filter INDEX 1.
READ TABLE ls_filter-select_options INTO ls_option INDEX 1.
IF ls_filter-property = 'book_id' AND ls_option-option = 'EQ'.
SELECT SINGLE * INTO ls_book_db FROM zbooks WHERE book_id = ls_option-low.
MOVE-CORRESPONDING ls_book_db TO ls_book.
APPEND ls_book TO lt_book.
ENDIF.
ENDIF.
CREATE DATA er_entityset TYPE zcl_zbook_manage_mpc=>tt_book.
ASSIGN er_entityset->* TO <book>.
<book> = lt_book.
ENDMETHOD.
最后在 Gateway Client 里,使用 url /sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection?$filter=book_id eq '1001'
,即可返回满足 book_id 为指定条件的单条图书记录。
边栏推荐
- 栈和队列的基本概念
- The latest MySql installation teaching, very detailed
- Read through the interface to call the artifact RestTemplate
- 一文带你了解redux的工作流程——actionreducerstore
- Experience innovation and iteration through the development of lucky draw mini-programs
- 一周精彩内容分享(第14期)
- Docker installs canal and mysql for simple testing and achieves cache consistency between redis and mysql
- 学习爬虫之Scrapy框架学习(1)---Scrapy框架初学习及豆瓣top250电影信息获取的实战!
- 认知—运动康复医疗机器人应用设计
- 这款悄然崛起的国产API接口管理工具,你一定要晓得
猜你喜欢
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
cesium-Web网页优化进阶
Redis学习笔记-3.慢查询和其他高级数据结构
file contains vulnerabilities
ESP8266-Arduino编程实例-MCP9808数字温度传感器驱动
The item 'node.exe' was not recognized as the name of a cmdlet, function, script file, or runnable program.
三六零与公安部三所发布报告:关基设施保护成为网络安全博弈关键
机器学习基本概念
busybox之reboot命令流程分析
Experience innovation and iteration through the development of lucky draw mini-programs
随机推荐
After class, watching the documentation and walking back to the lab, I picked up the forgotten SQL operators again
三相PWM整流器预测直接功率控制
关于IDEA开发工具的介绍
In PLC communication error or timeout or download the prompt solution of the model
Selenium自动化测试之Selenium IDE
一文带你了解redux的工作流程——actionreducerstore
deeplab implements its own remote sensing geological segmentation dataset
带有对称约束切换线性系统的结构可控性
使用 Excel 读取 SAP ABAP CDS View 通过 ODBC 暴露出来的数据
JVS应用中心
LeetCode - 025. 链表中的两数相加
The latest MySql installation teaching, very detailed
ApiPost is really fragrant and powerful, it's time to throw away Postman and Swagger
Data Lake (19): SQL API reads Kafka data and writes it to Iceberg table in real time
快速学完数据库管理
Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
最近两个月谷歌 ad 掉的厉害
Shengxin Weekly Issue 38
Experience innovation and iteration through the development of lucky draw mini-programs
VBA实现双击单元格自动输出对号再次双击取消对号