SAP OData(三)Query Option

Query option是指客户端在获取EntitySet的URL中后缀的一些指令,在第一篇第四小节我们已经见识了一部分Query指令。在下面表中列出了最重要的QueryOption。注意指令在URL中必须小写。

Operation

Query Option

Filtering and projecting

$filter and $select

Sorting

$orderby

Client-side paging

$top, $skip and $inlinecount

Counting

$count

lnlining

$expand

Formatting

$format


一,$filter

框架不会提供默认Filter,我们必须在service implemenation中自己实现Filter,也就是在Get_entityset方法的重写中自己代码实现Filter,框架会将Filter转化成Select-Option形式以方便ServiceImplementation中代码的处理。

支持以下元素:

由ComplexType形成的多层结构如第一篇中的Item,使用斜杠访问成员【http..ser/Item$filter=DETAIL_INFO/UNIT eq 'KG'】

逻辑运算符【not/and/or】:都必须小写,注意not加单个条件不需要括号,否则要括号明确not的结合方向

关系运算符【eq等于/ne不等/lt小于/le小等/gt大于/ge大等】:都必须小写,=只能出现在filter之后不能当做eq使用

函数 contains(MATNR,'abc')

实例【$filter=(not startswith(MATNR, 'S')) and ITMNO eq '0020'】

框架解析为Select-Option形式【MATNR:E CP S*】和【ITMNO:I EQ 0020】


二,$select

实现projection效果,限定返回实体的property。简化返回字段对接口性能,乃至后端功能都有提升。

实例【$select=DOCNO,MATNR】

注意字段名区分大小写,多字段逗号分隔;

投影由框架自动实现,我们重写DPC时不需要自定义代码,但是可以通过如下代码获取传入的投影字段。

io_tech_request_context->get_select_entity_properties()


三,$orderby

很简单,在第一篇第四节已经说过了,多列逗号分隔,默认asc

实例【$orderby=ITMNO,MATNR desc】


四,$top $skip

客户端分页常用于移动端应用,有限的页面空间要展示大量的实体集必须要分页展示,在页面上有一些显示元素来标识分页信息:实体集的总数量,当前展示的分页数,当前分页展示的行位于实体集的从几行到几行。

比如在UI5页面中放入一个Table控件,绑定了OdataModel(下图红框),并设置为可分页且每页5行(下图蓝框)

在页面加载第一批数据时,我们可以看到浏览器请求地址中$skip=0&$top=5限定了取值范围,inlinecount=allpages用于获取数据总条数(下一小节详述)

我们点击页面上的More获取第二次数据,地址中的$skip=5&$top=5限定了第二批数据取数范围


五,$inlinecount

获取满足filter条件的Entity行数,这样客户端可显示总行数而且能计算出分多少页;该指令有以下两种用法

$inlinecount=allpages 返回数量

$inlinecount=none 不返回数量

在DPC的Get_entityset中我们用如下代码

IF io_tech_request_context->has_inlinecount( ) EQ ABAP_true. //allpages为真,none为假

es_response_context-inlinecount = '3'. //将计算数量放入该返回参数

ELSE.

clear es_response_context-inlinecount.

ENDIF.

在返回的报文中,将多出来一个标签表示entity总数量


六,$count

获取Entity数量;它很特别,

其一URL没有?来引导【https://www.123.com:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/ItemSet/$count】

其二,返回body中只有一个数量,没有其他任何内容

在DPC的Get_entityset中我们可以用如下代码判断是否客户端请求为count

io_tech_request_context->has_count( ) EQ ABAP_true

es_response_context-count = '998'.

如果使用自定义代码直接赋值,最后返回为所赋值,否则系统自动根据所得et_entityset的行数返回,考虑到效率如果只想获取$count我们没必要获取entityset,我们可以使用上面自定义代码直接select count(*)并返回。

$count与$inlinecount的区别:$count返回报文只有数量,而$inlinecount可以跟数据一起返回数量,另外$inlinecount必须自定义代码显式赋值


七,$expand

借助Navigation关系,将互相关联的多个Entity以层级方式在报文中返回。

实例【https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000002')?$expand=Association_To_Item】

最终形成的报文在导航Link中加了一个inline标签,而导航目标的EntitySet就包含在这个标签如下图ItemsData

上例中Header的Key可以不指定,多个导航逗号分隔,假设有三个Entity关联为A-B-C

我们以A为URL起点【https://xxxxxx:44301/.._SRV/A('01')?$expand=A_To_B,A_To_B/B_To_C】

我们以B为URL起点【https://xxxxxx:44301/.._SRV/B('01')?$expand=B_To_A,B_To_C】

$expand导航默认会使用get_entity和get_entityset来取数,这可能导致多次取数的性能影响,_DPC_EXT还提供了get_expanded_entityset方法来一次性取出所有关联实体(如果实现了该方法就不会通过get_entityset取数了)


八,$format

格式选项决定了OData调用和响应的格式,OData2.0支持XML和JSON两种格式,其中XML是默认的。用法【$format=json】

【$format=xslx】指明响应是一个二进制excel文件流。注意该格式只支持NetWeaver7.4以上,且有很多限制譬如不支持$expand

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/344536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL夯实之路-查询性能优化深入浅出

MySQL调优分析 explain;show status查看服务器状态信息 优化 减少子任务,减少子任务执行次数,减少子任务执行时间(优,少,快) 查询优化分析方法 1.访问了太多的行和列&#xff1…

react 项目结构配置

1 项目整体目录结构的搭建 如下图: 2 重置css样式: normalize.css reset.less ; 第一步 安装 npm i normalize.css 入口文件index.tsx导入:import ‘noremalize.css’ 第二步 创建自己的css样式:在assets文件夹中创建css…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息,Salesforce从中小企业CRM服务的蓝海市场切入,但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等,蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

【iOS】数据持久化(四)之FMDB

正如我们前面所看到的,原生SQLite API在使用时还是比较麻烦的,于是,开源社区就出现了一系列将SQLite API进行封装的库,其中FMDB的被大多数人所使用 FMDB和SQLite相比较,SQLite比较原始,操作比较复杂&#…

js:使用canvas画一个半圆

背景 需求需要画一个半圆&#xff0c;或者多半圆&#xff0c;其实一下子就能想到 canvas 中的圆弧&#xff0c;核心使用 context.arc context.arc(x,y,r,sAngle,eAngle,counterclockwise)接下来我们看看示例 例一 <!DOCTYPE html> <html lang"en"> &…

麒麟操作系统缓存rpm包,制作离线yum源

缓存rpm包&#xff0c;以make为例 mkdir -p /data/yum yumdownloader --resolve --destdir/data/yum make制作离线yum包 yum install createrepo -y cd /data/yum createrepo .写yum配置文件/etc/yum.repos.d/local.repo [local-repo] namelocal-repo baseurlfile:///data/…

JavaWeb,CSS的学习

CSS&#xff0c;层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有网页对象和模型样式编辑的能力&#xff0c;简单来说&#xff0c;美化页面。 CSS…

鸿蒙Harmony--LocalStorage--页面级UI状态存储详解

走的太急疼的是脚&#xff0c;逼的太紧累的是心&#xff0c;很多时候&#xff0c;慢一点也没关系&#xff0c;多给自己一些耐心和等待&#xff0c;保持热爱&#xff0c;当下即是未来&#xff0c;生活自有安排! 目录 一&#xff0c;定义 二&#xff0c;LocalStorageProp定义 三…

【Java SE语法篇】5.方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 0. 前言1. 方法的概念和使用1.1 什么是方法1.2 方法…

flask web服务器:运行在云服务器上的最简单的web服务器

上期文章我们分享了flask的基础知识以及如何安装flask&#xff0c;当你安装完成flask后&#xff0c;我们就可以打造自己的web服务器了。 首先我们打印最简单的hello world,并在浏览器中显示 from flask import Flask app Flask(__name__)app.route(/) def index():return he…

AR HUD全面「上新」

AR HUD赛道正在迎来新的时代。 上周&#xff0c;蔚来ET9正式发布亮相&#xff0c;新车定位为D级行政旗舰轿车&#xff0c;其中&#xff0c;在智能座舱交互层面&#xff0c;继理想L系列、长安深蓝S7之后&#xff0c;也首次取消仪表盘&#xff0c;取而代之的是业内首个全焦段AR H…

java基于SSM框架的在线学习系统设计与实现+vue论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…