当前位置:网站首页>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 为指定条件的单条图书记录。
边栏推荐
- Docker installs canal and mysql for simple testing and achieves cache consistency between redis and mysql
- vb.net 画曲线
- 如何正确地把服务器端返回的文件二进制流写入到本地保存成文件
- Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
- 音视频基础
- ESP8266-Arduino编程实例-PIR(被动红外)传感器驱动
- JVM 运行时数据区与JMM 内存模型详解
- 文件包含漏洞
- Data Lake (19): SQL API reads Kafka data and writes it to Iceberg table in real time
- 快速学完数据库管理
猜你喜欢
JVS轻应用的组成与配置
一文带你了解redux的工作流程——actionreducerstore
Data Persistence Technology - MP
deeplab implements its own remote sensing geological segmentation dataset
基于C51实现按键控制
一文吃透接口调用神器RestTemplate
瑞吉外卖项目:新增菜品与菜品分页查询
数据持久化技术——MP
线性表的基本概念
AWS Amazon cloud account registration, free application for 12 months Amazon cloud server detailed tutorial
随机推荐
Data Persistence Technology - MP
JVS轻应用的组成与配置
DCM middleware family welcomes a new member
Docker practical experience: Deploy mysql8 master-slave replication on Docker
Use ODBC in Excel to read data from CDS view on SAP BTP platform
Android studio连接MySQL并完成简单的登录注册功能
音视频基础
kernel syscore
消息队列面试题(2022最新整理)
The latest MySql installation teaching, very detailed
[Virtualization ecological platform] Raspberry Pi installation virtualization platform operation process
5 open source Rust web development frameworks, which one do you choose?
ESP8266-Arduino编程实例-PIR(被动红外)传感器驱动
B/S架构模式的一个整体执行流程
「R」使用ggpolar绘制生存关联网络图
Distributed Transactions - Introduction to Distributed Transactions, Distributed Transaction Framework Seata (AT Mode, Tcc Mode, Tcc Vs AT), Distributed Transactions - MQ
Full GC (Ergonomics)排查分析
认知—运动康复医疗机器人应用设计
一周精彩内容分享(第14期)
基于姿态估计的护具佩戴检测与动作识别