分页查询是一个常见需求,特别是在web相关的开发当中。

让人意外的是,google搜索abap paging query,查到的结果似乎都指出需要使用native SQL来实现相关功能;使用百度搜索 abap分页查询,不仅查不到解决方案,甚至可以看到有人提出分页查询非常影响效率,不应使用。我想这是没有道理的。经过对文档的查询,我发现Open SQL拥有这方面的能力。

本文链接:http://www.cnblogs.com/hhelibeb/p/8991141.html

原创内容,转载请注明。

OFFSET 关键字实现

从ABAP 7.51开始,Open SQL中引入了关键字OFFSET可以指定查询的开始位置。以下这是官方文档中的一个小例子,通过UP TO n ROWS指定一次查询的条目数,通过OFFSET指定开始行:

SELECT - UP TO, OFFSET:

REPORT demo_select_up_to_offset.

CLASS demo DEFINITION.
PUBLIC SECTION.
CLASS-METHODS
main.
PRIVATE SECTION.
CLASS-DATA:
o TYPE int8,
n TYPE int8.
CLASS-METHODS
setup.
ENDCLASS. CLASS demo IMPLEMENTATION.
METHOD main.
setup( ). SELECT FROM demo_expressions
FIELDS id, num1 AS number, numlong1 AS result
ORDER BY id, num1
INTO TABLE @DATA(itab)
OFFSET @o
UP TO @n ROWS. cl_demo_output=>display( itab ). DELETE FROM demo_expressions.
ENDMETHOD.
METHOD setup.
cl_demo_input=>new(
)->add_field( CHANGING field = o
)->request( CHANGING field = n ).
IF NOT ( ( o BETWEEN AND ) AND
( n BETWEEN AND ) ).
cl_demo_output=>display(
`Input not in allowed interval!` ).
LEAVE PROGRAM.
ENDIF. DELETE FROM demo_expressions.
DO strlen( sy-abcde ) TIMES.
INSERT demo_expressions FROM @(
VALUE #( id = substring( val = sy-abcde
off = sy-index -
len = )
num1 = sy-index
numlong1 = ipow( base = exp = sy-index ) ) ).
ENDDO.
ENDMETHOD.
ENDCLASS. START-OF-SELECTION.
demo=>main( ).

运行这段程序,会出现一个弹窗,其中两个输入框,分别是查询的开始位置和结果数量,让我们分别输入3,10:

运行程序,如图,我们得到了ID为4~13的条目:

按照这个思路,只要每次查询不同区间的条目,就可以实现分页查询了:

SELECT * FROM sflight ORDER BY carrid, connid, fldate
INTO TABLE @lt_sflight
UP TO ROWS OFFSET . SELECT * FROM sflight ORDER BY carrid, connid, fldate
INTO TABLE @lt_sflight
UP TO ROWS OFFSET .
………………

CONCAT 函数实现

如果可以将把数据库表中的内容按键排序,那么,首先获取键最小的10行,获取到结果集中键的值最大的条目,再继续查询键比该条目更大的10行...依次进行下去,也可以实现分页。

(Open SQL中的CONCAT函数在ABAP 7.50和更高版本可用)

REPORT ztest_paging.

CLASS lcl_paging DEFINITION.

  PUBLIC SECTION.
TYPES: ty_sflight_t TYPE STANDARD TABLE OF sflight. METHODS: main. PRIVATE SECTION. CLASS-DATA: rows TYPE int8. METHODS: setup,
get_max_key
IMPORTING
it_sflight TYPE ty_sflight_t
RETURNING
VALUE(r_result) TYPE string,
get_result IMPORTING i_rows TYPE int8. ENDCLASS. CLASS lcl_paging IMPLEMENTATION. METHOD setup. cl_demo_input=>new(
)->request( CHANGING field = rows ).
IF NOT ( rows BETWEEN AND ).
cl_demo_output=>display(
`Input not in allowed interval!` ).
LEAVE PROGRAM.
ENDIF. ENDMETHOD. METHOD get_result. DATA: lt_sflight TYPE ty_sflight_t. DATA: l_index TYPE i VALUE . cl_demo_output=>next_section( |{ l_index }| ). SELECT * FROM sflight ORDER BY carrid, connid, fldate
INTO TABLE @lt_sflight
UP TO @i_rows ROWS. cl_demo_output=>write( lt_sflight ). DATA(l_key) = get_max_key( lt_sflight ). DO TIMES. l_index = l_index + . SELECT * FROM sflight
WHERE concat( concat( carrid, connid ), fldate ) > @l_key
ORDER BY carrid, connid, fldate
INTO TABLE @lt_sflight
UP TO @i_rows ROWS .
IF sy-subrc <> .
EXIT.
ENDIF. cl_demo_output=>next_section( |{ l_index }| ).
cl_demo_output=>write( lt_sflight ). l_key = get_max_key( lt_sflight ). ENDDO. cl_demo_output=>display( ). ENDMETHOD. METHOD get_max_key. DATA(ls_last_row) = VALUE #( it_sflight[ lines( it_sflight ) ] OPTIONAL ). r_result = |{ ls_last_row-carrid }{ ls_last_row-connid }{ ls_last_row-fldate }|. ENDMETHOD. METHOD main. setup( ). get_result( rows ). ENDMETHOD. ENDCLASS. INITIALIZATION. NEW lcl_paging( )->main( ).

运行程序,可以看到输入框,输入每页行数为10,回车运行:

可以发现结果已经按键排序,分成了每10条数据一组:

更多参考:SAP UI 搜索分页技术

ABAP Open SQL 分页查询的更多相关文章

  1. SQL Server SQL分页查询

    SQL Server SQL分页查询的几种方式 目录 0.    序言 1.    TOP…NOT IN… 2.    ROW_NUMBER() 3.    OFFSET…FETCH 4.    执行 ...

  2. SQL分页查询结果不一致

    今天遇到了SQL分页查询结果不一致的情况,一看代码,原来是没加排序查询!!分页查询最好加排序,且以唯一性高的字段进行排序,如ID,时间等,以保持每页查询结果的准确! PS:又帮别人擦屁股!!

  3. Oracle中的SQL分页查询原理和方法详解

    Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006

  4. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  5. sql分页查询(2005以后的数据库)和access分页查询

    sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...

  6. 【原创】SQL分页查询存储过程

    ------------------------------------- -----作者:张欣宇 -----时间:2013-06-28 -----简介:根据参数和条件分页查询 ----------- ...

  7. SQL分页查询,纯Top方式和row_number()解析函数的使用及区别

    听同事分享几种数据库的分页查询,自己感觉,还是需要整理一下MS SqlSever的分页查询的. Sql Sever 2005之前版本: select top 页大小 * from 表名 where i ...

  8. SQL分页查询总结{转}

    开发过程中经常遇到分页的需求,今天在此总结一下吧.简单说来方法有两种,一种在源上控制,一种在端上控制.源上控制把分页逻辑放在SQL层:端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridVie ...

  9. sql分页查询公式

    分页查询公式: select top PageRow(每页显示的数据行数) from 表名 where 主键  not in(select top PageRow*(当前页数-1) 主键  from ...

随机推荐

  1. Java并发框架——AQS阻塞队列管理(三)——CLH锁改造

    在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点 ...

  2. 最简单的基于DirectShow的示例:视频播放器自定义版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  3. (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现 ...

  4. CCM和GCM

    分组密码链接-消息认证码--CCM    Counter with CBC-MAC 组成CCM的关键算法是AES加密算法.CTR工作模式和CMAC认证算法,在加密和MAC算法中共用一个密钥K. CCM ...

  5. MyBatis主键生成器Jdbc3KeyGenerator(二)

    上一篇博客MyBatis主键生成器KeyGenerator(一)中我们大体介绍了主键生成器的接口及配置等,接下来我们介绍一下KeyGenerator的实现类Jdbc3KeyGenerator Jdbc ...

  6. Java初级面试题

    //1.请问执行下面的程序大致会输出类似什么内容? public class TestThisToString{ public String toString(){ return "my m ...

  7. Android官方命令深入分析之etc1tool

    etc1tool是一个命令行工具,可以将PNG图像压缩为etc1标准,并且可以进行解压缩. 用法: etc1tool infile [--help | --encode | --encodeNoHea ...

  8. 【TCP/IP 协议】 TCP/IP 基础

    总结 : 通过学习 TCP/IP 基础, 并总结相关笔记 和 绘制思维导图 到博客上, 对 TCP/IP 框架有了大致了解, 之后开始详细学习数据链路层的各种细节协议, 并作出笔记; 博客地址 : h ...

  9. iOS中 数据持久化 UI高级_17

    数据持久化的本质就是把数据由内写到本地(硬盘中),在iOS指将数据写到沙盒文件夹下: 沙盒机制:指的就是采用沙盒文件夹的形式管理应用程序的本地文件,而且沙盒文件夹的名字是随机分配的,采用十六进制方法命 ...

  10. javascript之prototype原型属性案例

    练习: 给字符串对象添加一个toCharArray的方法,然后再添加一个reverse(翻转)的 方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...