Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
JerryWang
Advisor
Advisor
0 Kudos


在我的博客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,因此也不会有太多额外的开销。