這篇文章的英文版我發在了SAP Community上:Paging Implementation in S/4HANA for Customer Management
<a href="https://blogs.sap.com/2018/03/28/paging-implementation-in-s4hana-for-customer-management/">https://blogs.sap.com/2018/03/28/paging-implementation-in-s4hana-for-customer-management/</a>
按照我的公衆号文章裡介紹的,S/4HANA for Customer Management 1.0裡的Service Request UI仍然是采用CRM Webclient UI技術來開發的。
假設我在UI上指定max hit值為200:
每頁預設顯示20條資料,是以這200條搜尋結果總共分10頁顯示。
關于CRM WebClient UI的分頁機制,有兩個要點:
1. 搜尋按鈕點選後,會有max hit的值指定條數的記錄從資料庫取出,存儲于WebClient UI的應用的記憶體區域中。在我的例子裡,我指定的max hit為200,是以有200條Service Request從資料庫裡取出。
2. WebClient UI是一項伺服器端渲染的技術,意味着所有WebClient UI頁面對應的html源代碼都是在ABAP伺服器裡渲染的,然後直接在浏覽器顯示。在搜尋這個場景裡,任意時間段裡,ABAP背景隻會生成預設20條搜尋結果的html源代碼。
例如我點了搜尋按鈕之後,隻有第1條道第20條記錄的html源代碼在背景生成,然後傳回給浏覽器由其渲染。當了我點了第二頁的超連結"2"時,第21條到第40條的源代碼相應在背景生成。
下面是一些技術細節。
1. 可以使用事務碼ST05找到S4CRM的Service Request搜尋查詢的CDS view的名稱CRMS4_SERVHSRCH
第201條記錄被丢棄:
在視圖ICCMP_INBOX/INBOXRESULTVIEW.HTM裡設定斷點, 在調試器裡檢查變量"me":
通過這個路徑能找到存儲在記憶體中的200條搜尋結果:
{O:5768*CLASS-POOL=CL_BSP_WD_COLLECTION_WRAPPERCLASS=LCL_COLLECTION_REF}-IF_BSP_WD_COLLECTION_REF~COLLECTION
2. 當我點第二頁的超連結後:
背景生成好的針對從第21行到第40行記錄的html源代碼可以在Chrome開發者工具中觀察到,如下圖所示:
那麼背景如何得知應該從第21行開始準備其html源代碼呢?這個索引資訊是從前台傳到背景的,通過http請求頭部的字段:ItemTree_visibleFirstRow.
在方法CL_THTMLB_CELLERATOR~GET_REQUEST_PARAMETERS設定斷點,找到背景是在何處解析該前台請求傳入的visibleFirstRow:
在BSP渲染類CL_THTMLB_CELLERATOR裡,這個變量gv_visible_first_row被用于渲染的起始索引:lv_current_row_index:
每一行的每一個單元的源代碼在循環裡依次生成好。循環基于表的列定義,目前我系統裡預設的配置,搜尋結果有8列:
出于調試目的,您可以在變量GT_TABLE_ENTRIES裡檢視生成好的用于目前頁面顯示的html源代碼:
比如對于第二頁,索引從21開始:
以40結束:
為什麼變量gt_table_entries有168條記錄?
每頁預設顯示20條記錄,加上1行表頭,每條記錄8列,是以最後是( 20 + 1 ) * 8 = 168
要擷取更多Jerry的原創技術文章,請關注公衆号"汪子熙"或者掃描下面二維碼:
