SAP ABAP OData 服务的分页加载数据集的实现(Paging)

SAP UI5 应用的分页加载数据集,是一个极为重要的特性,需要 SAP UI5 前端和 OData 服务后端同时进行相应的开发工作,才能实现这个场景。

所谓分页加载数据集,就是默认情况下,SAP UI5 应用在启动后的默认页面里,只显示指定数据的数据集,这个个数默认为 20,也可以在系统或者代码里进行配置。因此我们可以理解成,SAP UI5 应用初始化时,默认从数据库加载第 1 到第 20 条数据。

当我们的滚动条向下滑动至屏幕底部时,会触发新一批数据的加载,读取第 21 条到第 40条也就是第二个 20 条数据。

SAP UI5 调用后台 OData 服务时,通过参数 $skip=X&$top=Y 来进行分页场景的指定。

  • 其中 $skip=X,代表跳过数据库第 X 条记录,从 X + 1 条记录开始读取(X为索引值,从 0 开始计数)

  • $top=Y,代表总共读取数据库 Y 条记录。

假设后台的 SAP ABAP OData 服务针对消费者通过 url 传入的 $skip=X&$top=Y,已经正确实现,则 SAP UI5 应用,以分页的方式消费该 OData 服务,具体实现步骤,可以参考笔者这些文章:

下面介绍为了支持分页加载数据集的 SAP ABAP OData 服务的后台实现。

首先我们构造带有分类加载数据集请求参数的 url:

https://{{host}}:{{port}}/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection?$skip=1&$top=2

意思是从数据库里第 2 条记录(因为 $skip 索引从1开始)开始读取,总共读取 2 条记录。

我们在图书管理 OData 服务的 Data Provider Class 的 GET_ENTITYSET 里设置断点,然后用 Postman 发送上述请求,观察这个方法的输入参数里包含的 skip 和 top 参数:

发现分别包含在 is_paging 结构体的 skip 和 top 参数里。

为了分页实现所作的增强,源代码如下所示,增加了一个 IF 分支。

如果 is_paging 输入参数不为空,说明 OData 服务消费者,指定了 skip 和top 等分页参数。

此时我们需要根据这两个整数值,从存储了数据库全部记录的内表 lt_book 里,摘取出部分子集数据。变量 lv_index 的初始值,维护了从数据库的第几条记录开始摘取。这个初始值等于用户输入参数 $skip 的值再加上 1,因为后者是从 0 开始索引计数的。

而 lv_read_count 是一个计数器,每当从 lt_book 内表里摘取一条记录出来之后,计数器就加一。显然,这个计数器的值,不能超过另一个分页参数 $top 的值。

下图是数据库表全部 4 条数据。

最后我们来做一个测试:

https://{{host}}:{{port}}/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookCollection?$skip=1&$top=2

如上 url,语义是,从数据库第 2( skip 的值加一) 条记录开始读取,总共读取 2(top 值为 2) 条数据。

测试结果,确实数据库第 2 和第 3 条记录被 OData 请求返回了:

GET_ENTITYSET 的完全代码如下:

  METHOD /iwbep/if_mgw_appl_srv_runtime~get_entityset.
    DATA: lt_book_db TYPE TABLE OF zbooks,
          ls_book_db LIKE LINE OF lt_book_db,
          lt_book    TYPE zcl_zbook_manage_mpc=>tt_book,
          ls_book    LIKE LINE OF lt_book,
          ls_order   LIKE LINE OF it_order,
          ls_filter  LIKE LINE OF it_filter_select_options,
          ls_option  LIKE LINE OF ls_filter-select_options.

    FIELD-SYMBOLS: <book> LIKE lt_book.

    IF it_filter_select_options IS INITIAL.
      SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_book_db FROM zbooks.

      LOOP AT lt_book_db INTO ls_book_db.
        MOVE-CORRESPONDING ls_book_db TO ls_book.
        APPEND ls_book TO lt_book.
      ENDLOOP.

    ELSE.
      READ TABLE it_filter_select_options INTO ls_filter INDEX 1.
      READ TABLE ls_filter-select_options INTO ls_option INDEX 1.
      IF ls_filter-property = 'book_id' AND ls_option-option = 'EQ'.
        SELECT SINGLE * INTO ls_book_db FROM zbooks WHERE book_id = ls_option-low.
        MOVE-CORRESPONDING ls_book_db TO ls_book.
        APPEND ls_book TO lt_book.
      ENDIF.
    ENDIF.

    IF is_paging IS NOT INITIAL.
      DATA: lv_index TYPE int4,
            lv_read_count  TYPE int4 VALUE 0,
            lt_paged_table LIKE lt_book,
            ls_line        LIKE LINE OF lt_book.

      lv_index = is_paging-skip + 1.
      WHILE lv_read_count < is_paging-top.
        READ TABLE lt_book INTO ls_line INDEX lv_index.
        IF sy-subrc <> 0.
           EXIT.
        ENDIF.
        APPEND ls_line TO lt_paged_table.
        lv_read_count = lv_read_count + 1.
        lv_index = lv_index + 1.
      ENDWHILE.

      lt_book = lt_paged_table.
    ENDIF.
    CREATE DATA er_entityset TYPE zcl_zbook_manage_mpc=>tt_book.
    ASSIGN er_entityset->* TO <book>.
    <book> = lt_book.

    CHECK it_order IS NOT INITIAL.

    READ TABLE it_order INTO ls_order INDEX 1.

    IF ls_order-property <> 'author_name' AND ls_order-property <> 'book_name'.
      RETURN.
    ENDIF.

    IF ls_order-order IS INITIAL OR ls_order-order = 'asc'.
      SORT <book> BY (ls_order-property).
    ELSEIF ls_order-order = 'desc'.
      SORT <book> BY (ls_order-property) DESCENDING.
    ENDIF.

  ENDMETHOD.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容