在个人博客Paging Implementation in S/4HANA for Customer Management 我介绍了S/4HANA for Customer Management里采用WebClient UI技术实现的UI上的搜索分页实现。sql
那么S/4HANA和CRM里原生的Fiori应用,其搜索分页又是如何实现的?数据库
这篇博客分别选取S/4HANA里的Product Master,以及CRM里的My Opportunities这两个应用为例来介绍。工具
点击搜索按钮以后,默认返回前25个命中的product,同时显示总共命中的product数目:140。 3d
这个分页效果经过OData请求的参数$skip=0&top=25实现的。而总共命中条数140的显示经过另外一个参数$inlinecount来实现,该参数的后台实现原理相似ABAP Open SQL里的SELECT COUNT(*)。blog
从Chrome开发者工具里观察该请求的回应,确实只有25条记录返回。索引
将该搜索结果列表scroll至底部,发现有另外一个OData request自动发出:ip
该请求的头部参数为$skip=25&top=25,所以可以从后台只取从第26到50个product:开发
在我博客SAP Fiori里的List是如何作到懒加载Lazy load的 我解释了$skip递增的序列值0,25,50,75...是如何在前台生成的。get
而在这篇博客里,我会着重介绍分页搜索的后台实现。博客
假设我重复将搜索结果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。
前台的逻辑和S/4HANA的Fiori应用彻底一致。
该参数传至后台,存储在参数is_paging里:
至于后台的分页搜索,My opportunities应用并未使用ABAP OPEN SQL里的关键字OFFSET。相反地,全部匹配记录的GUID都经过One Order的搜索API返回:
多余的记录,即那些不在$skip和$top定义的参数以内的都被DELETE丢弃:
该实现或许不如S/4HANA采用OFFSET方式实现得直接,可是由于从数据库返回的仅仅是命中opportunity的GUID,所以也不会有太多额外的开销。 要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码: