S/4HANA for Customer Management 里的搜索分页处理
![S/4HANA for Customer Management里的搜索分页处理](https://static001.geekbang.org/infoq/f3/f33c87e852b5da87e0bc28d721839cfa.jpeg)
这篇文章的英文版我发在了 SAP Community 上:Paging Implementation in S/4HANA for Customer Management
https://blogs.sap.com/2018/03/28/paging-implementation-in-s4hana-for-customer-management/
按照我的公众号文章里介绍的,S/4HANA for Customer Management 1.0 里的 Service Request UI 仍然是采用 CRM Webclient UI 技术来开发的。
假设我在 UI 上指定 max hit 值为 200:
![](https://static001.geekbang.org/infoq/6b/6b906b183ede232f2ff007693f4677dd.png)
每页默认显示 20 条数据,因此这 200 条搜索结果总共分 10 页显示。
![](https://static001.geekbang.org/infoq/09/094722fc1f0d6544ee50b474eca53c82.png)
关于 CRM WebClient UI 的分页机制,有两个要点:
1. 搜索按钮点击后,会有 max hit 的值指定条数的记录从数据库取出,存储于 WebClient UI 的应用的内存区域中。在我的例子里,我指定的 max hit 为 200,因此有 200 条 Service Request 从数据库里取出。
2. WebClient UI 是一项服务器端渲染的技术,意味着所有 WebClient UI 页面对应的 html 源代码都是在 ABAP 服务器里渲染的,然后直接在浏览器显示。在搜索这个场景里,任意时间段里,ABAP 后台只会生成默认 20 条搜索结果的 html 源代码。
![](https://static001.geekbang.org/infoq/53/538fbc9edc252ba6ddbc8bc682c14d86.png)
例如我点了搜索按钮之后,只有第 1 条道第 20 条记录的 html 源代码在后台生成,然后返回给浏览器由其渲染。当了我点了第二页的超链接"2"时,第 21 条到第 40 条的源代码相应在后台生成。
下面是一些技术细节。
1. 可以使用事务码 ST05 找到 S4CRM 的 Service Request 搜索查询的 CDS view 的名称 CRMS4_SERVHSRCH
![](https://static001.geekbang.org/infoq/c8/c875883aa3072c2d644a3bb275750e10.png)
第 201 条记录被丢弃:
![](https://static001.geekbang.org/infoq/87/8728235ca97347b55a58c705dc77b8fa.png)
在视图 ICCMP_INBOX/INBOXRESULTVIEW.HTM 里设置断点, 在调试器里检查变量"me":
![](https://static001.geekbang.org/infoq/25/254ceb60f99359263262f3e15eb06937.png)
通过这个路径能找到存储在内存中的 200 条搜索结果:
{O:5768*\CLASS-POOL=CL_BSP_WD_COLLECTION_WRAPPER\CLASS=LCL_COLLECTION_REF}-IF_BSP_WD_COLLECTION_REF~COLLECTION
![](https://static001.geekbang.org/infoq/13/1308da32041f309567ff66784c01d11c.png)
2. 当我点第二页的超链接后:
![](https://static001.geekbang.org/infoq/9e/9e8e238ddaeee9b126fbdf890e8cc8d2.png)
后台生成好的针对从第 21 行到第 40 行记录的 html 源代码可以在 Chrome 开发者工具中观察到,如下图所示:
![](https://static001.geekbang.org/infoq/bf/bfe4a217d5713e09a41bab6c6ceb1c3f.png)
那么后台如何得知应该从第 21 行开始准备其 html 源代码呢?这个索引信息是从前台传到后台的,通过 http 请求头部的字段:ItemTree_visibleFirstRow.
如果您搞不清楚类似下图这种前缀 C36_W138_V139_的生成逻辑,请参考我的博客 WebClient UI element ID generation logic
![](https://static001.geekbang.org/infoq/77/77ca7ac51d58799d67b1a0dc954b7328.png)
在方法 CL_THTMLB_CELLERATOR~GET_REQUEST_PARAMETERS 设置断点,找到后台是在何处解析该前台请求传入的 visibleFirstRow:
![](https://static001.geekbang.org/infoq/5b/5b09587da62ab455675a9b4bbf67c22c.png)
在 BSP 渲染类 CL_THTMLB_CELLERATOR 里,这个变量 gv_visible_first_row 被用于渲染的起始索引:lv_current_row_index:
![](https://static001.geekbang.org/infoq/2e/2ef6072ddafb3563e80faec70d617cbb.png)
每一行的每一个单元的源代码在循环里依次生成好。循环基于表的列定义,当前我系统里默认的配置,搜索结果有 8 列:
![](https://static001.geekbang.org/infoq/94/9404287b39d5ce3b79b1aea1172edbf7.png)
![](https://static001.geekbang.org/infoq/24/249e4228bebc049e7b3fe07de4d1273f.png)
出于调试目的,您可以在变量 GT_TABLE_ENTRIES 里查看生成好的用于当前页面显示的 html 源代码:
![](https://static001.geekbang.org/infoq/b8/b84d0d2b37b1cb08181c54c5936f400b.png)
比如对于第二页,索引从 21 开始:
![](https://static001.geekbang.org/infoq/df/df58b9a3b73f67f661fc533eafe4657e.png)
以 40 结束:
![](https://static001.geekbang.org/infoq/e5/e5ced8d30c3a9fcb4c98eb3cceb4f72e.png)
为什么变量 gt_table_entries 有 168 条记录?
每页默认显示 20 条记录,加上 1 行表头,每条记录 8 列,所以最后是( 20 + 1 ) * 8 = 168
要获取更多 Jerry 的原创技术文章,请关注公众号"汪子熙":
![](https://static001.geekbang.org/infoq/61/61117504f21707475c0b8e1766a317a0.png)
版权声明: 本文为 InfoQ 作者【Jerry Wang】的原创文章。
原文链接:【http://xie.infoq.cn/article/3f63cb2dcff38d54c99a3d63a】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论