S/4HANA和CRM Fiori应用的搜索分页实现
在我的博客Paging Implementation in S/4HANA for Customer Management 我介绍了S/4HANA for Customer Management里采用WebClient UI技术实现的UI上的搜索分页实现。
那么S/4HANA和CRM里原生的Fiori应用,其搜索分页又是如何实现的?
这篇博客分别选取S/4HANA里的Product Master,以及CRM里的My Opportunities这两个应用为例来介绍。
S/4HANA Fiori应用的搜索分页实现
点击搜索按钮之后,默认返回前25个命中的product,同时显示总共命中的product数目:140。

这个分页效果通过OData请求的参数$skip=0&top=25实现的。而总共命中条数140的显示通过另一个参数$inlinecount来实现,该参数的后台实现原理类似ABAP Open SQL里的SELECT COUNT(*)。

从Chrome开发者工具里观察该请求的回应,确实只有25条记录返回。

将该搜索结果列表scroll至底部,发现有另一个OData request自动发出:

该请求的头部参数为$skip=25&top=25,因此能够从后台只取从第26到50个product:

在我博客SAP Fiori里的List是如何做到懒加载Lazy load的 我解释了$skip递增的序列值0,25,50,75...是如何在前台生成的。
而在这篇博客里,我会着重介绍分页搜索的后台实现。
假设我重复将搜索结果scroll至底部的动作重复三次,那么能够通过ST05观察到有三个数据库的读请求,每个请求返回25条记录。

点击该按钮,可以查看到具体是哪一行ABAP代码发起的数据库读请求:

$skip和$top这两个参数的值从前台传入后台,在后台的方法CL_SADL_GW_GENERIC_DPC~_GET_ENTITYSET的输入参数io_query_option能观察到:


开始行的索引值等于$skip参数值加1。

实际的读取分页在后台的实现:通过ABAP关键字OFFSET实现。

该OFFSET的值通过方法CL_SADL_SQL_STATEMENT~GET_SECTIONS_FOR_SELECT内一个较复杂的table表达式来决定出来:

首先得出表达式lt_sections[ type = cl_sadl_sql_statement=>co_type-page ]-from的值:99.

再从内表mt_parts取出第99条记录,从其字段value2得出最终offset值75。

CRM Fiori应用的搜索分页实现
前台的逻辑和S/4HANA的Fiori应用完全一致。

该参数传至后台,存储在参数is_paging里:


至于后台的分页搜索,My opportunities应用并未使用ABAP OPEN SQL里的关键字OFFSET。相反地,所有匹配记录的GUID都通过One Order的搜索API返回:

多余的记录,即那些不在$skip和$top定义的参数之内的都被DELETE丢弃:

该实现或许不如S/4HANA采用OFFSET方式实现得直接,但是因为从数据库返回的仅仅是命中opportunity的GUID,因此也不会有太多额外的开销。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:


S/4HANA和CRM Fiori应用的搜索分页实现的更多相关文章
- S/4HANA for Customer Management里的搜索分页处理
这篇文章的英文版我发在了SAP Community上:Paging Implementation in S/4HANA for Customer Management https://blogs.sa ...
- SAP UI 搜索分页技术
搜索分页技术往往和另一个术语Lazy Loading(懒加载)联系起来.今天由Jerry首先介绍S/4HANA,CRM Fiori和S4CRM应用里的UI搜索分页的实现原理.后半部分由SAP成都研究院 ...
- SSM框架——实现分页和搜索分页
登录|注册 在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级 ...
- php搜索分页
最近做搜索分页的时候,发现第一页显示正常,点击到下一页的时候,显示结果变成了搜索全部内容. 仔细查看代码,发现当第一次输入关键词,提交到查询控制器的时候,表单提交的关键字不为空,可是点击到下一页的时候 ...
- Yii 框架ajax搜索分页
要想实现ajax搜索分页 其实很简单 第一步:在 Yii 框架自带的搜索和分页正常运行的情况下,在视图层
- 02 - Unit08:搜索笔记功能、搜索分页、处理插入数据库乱码问题
搜索笔记功能 按键监听事件 $("#search_note").keydown(function(event){ var code=event.keyCode; if(code== ...
- Elasticsearch系列---搜索分页和deep paging问题
概要 本篇从介绍搜索分页为起点,简单阐述分页式数据搜索与原有集中式数据搜索思维方式的差异,就分页问题对deep paging问题的现象进行分析,最后介绍分页式系统top N的案例. 搜索分页语法 El ...
- Django项目:CRM(客户关系管理系统)--80--70PerfectCRM实现CRM业务流程(bpm)课程排行分页
# coursetop_views.py # ————————64PerfectCRM实现CRM课程排名详情———————— #————班级学生详情——#计算#{学员ID:分数}——#计算 #{学员I ...
- Django项目:CRM(客户关系管理系统)--79--69PerfectCRM实现CRM业务流程(bpm)学生讲师分页
# student_views.py # ————————60PerfectCRM实现CRM学生上课记录———————— from django.shortcuts import render #页面 ...
随机推荐
- BestCoder Round #66 1002
GTW likes gt Accepts: 75 Submissions: 261 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 1 ...
- IP 地址子网划分
1.1 IP地址子网划分 1)容易造成地址浪费 2)容易产生严重的广播风暴 3)会造成路由器转发压力过大 1.2 庞大的网段需要进行子网划分 1)可以有效避免地址浪费 2)有效减少广播风暴的产 ...
- classloader 学习
classloader就是把类文件加载到jvm中供虚拟机使用,先看一个magic小例子: 首先,我定义一个alex/vicky包,然后在这个包内定义一个接口: public interfaceISer ...
- springMVC从前端接受boolean类型的属性失败的问题
springMVC从前端接收到的实体又一个boolean类型的属性,发现不管前端怎么操作,后台接收到的值都是false. 问题出现原因: eclipse在给实体属性生成getter和setter的时候 ...
- ssh两台主机建立信任关系
A主机(10.104.11.107) B主机(10.104.11.128) A: ssh-keygen -t rsa [root@H0f .ssh]# ssh-keygen -t rsa Gene ...
- spring配置文件中util:properties和context:property-placeholder
util:properties和context:property-placeholder标签都可以用来获取外部配置文件中的内容 1.util:properties 它是以声明bean方式来使用,创建了 ...
- Silverlight TreeView 带 checkbox和图片
前段时间做Silverlight TreeView 控件,但是要带checkbox和图片,在网上到处找相关的例子,效果图如下 xaml代码 <UserControl x:Class=" ...
- python-常用模块整理
学习背景 最近需要进行文件夹数据的批量读取,里面会用到python里面的os模块.但是对os模块又不是很熟悉,里面的函数有哪些函数?有什么用?怎么用?英语不好的每次看官方文档也比较费力,所以就想着看看 ...
- Unity 组件.name
组件.name 指的是组件所在游戏对象的名字,例如: Animation m_animation; m_animation =GetComponent<Animation>(); m_a ...
- Mongodb~连接串的整理
mongodb连接串可以分为普通开放的,带全局用户名和密码的,为指定数据库指定用户名密码的等. 普通开放连接 mongodb://localhost:27017 带全局用户密码的 mongodb:// ...