ABAP Open SQL 分页查询
分页查询是一个常见需求,特别是在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 分页查询的更多相关文章
- SQL Server SQL分页查询
SQL Server SQL分页查询的几种方式 目录 0. 序言 1. TOP…NOT IN… 2. ROW_NUMBER() 3. OFFSET…FETCH 4. 执行 ...
- SQL分页查询结果不一致
今天遇到了SQL分页查询结果不一致的情况,一看代码,原来是没加排序查询!!分页查询最好加排序,且以唯一性高的字段进行排序,如ID,时间等,以保持每页查询结果的准确! PS:又帮别人擦屁股!!
- Oracle中的SQL分页查询原理和方法详解
Oracle中的SQL分页查询原理和方法详解 分析得不错! http://blog.csdn.net/anxpp/article/details/51534006
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- sql分页查询(2005以后的数据库)和access分页查询
sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...
- 【原创】SQL分页查询存储过程
------------------------------------- -----作者:张欣宇 -----时间:2013-06-28 -----简介:根据参数和条件分页查询 ----------- ...
- SQL分页查询,纯Top方式和row_number()解析函数的使用及区别
听同事分享几种数据库的分页查询,自己感觉,还是需要整理一下MS SqlSever的分页查询的. Sql Sever 2005之前版本: select top 页大小 * from 表名 where i ...
- SQL分页查询总结{转}
开发过程中经常遇到分页的需求,今天在此总结一下吧.简单说来方法有两种,一种在源上控制,一种在端上控制.源上控制把分页逻辑放在SQL层:端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridVie ...
- sql分页查询公式
分页查询公式: select top PageRow(每页显示的数据行数) from 表名 where 主键 not in(select top PageRow*(当前页数-1) 主键 from ...
随机推荐
- mac OS X 从无法同步互联网时间想到的
最近在mac OS X 巨浪 :)上执行 ntpdate time.nist.gov 失败,提示 13 Jan 19:41:53 ntpdate[1374]: the NTP socket is in ...
- Android触摸屏幕时间-android学习之旅(三)
android的多点触摸是经常遇到的编程技巧,这一篇可以将详细的介绍这个问题. 简单实例 android的触摸需要实现OnTouchListener接口,继承里面方法. 布局代码: <?xml ...
- EBS开发技术之Patch安装
Contents Document Control........................................................................ ...
- TensorFlow安装配置,茫茫人海中一瞥
深度学习的框架,我们熟知的有caffe,torch和convnet.最近,Google又搞了一个TensorFlow,已经开源:http://www.tensorflow.org/.据说,谷歌的深度学 ...
- Java编写的接口测试工具
这几天由于要频繁地使用一些天气数据接口,但是每次都要频繁的打开网页,略显繁琐,故就自己做了两个json数据获取的小工具. 第一个 先来看看第一个吧,思路是使用一个网络流的处理,将返回的json字符串数 ...
- iOS中 UITextView文本视图 技术分享
UITextView: 文本视图相比与UITextField直观的区别就是UITextView可以输入多行文字并且可以滚动显示浏览全文. UITextField的用处多,UITextView的用法也不 ...
- 【翻译】Sencha Cmd中脚本压缩方法之比较
概述 为什么要修改默认设置 YUI压缩 Google Closure编译器 UglifyJS 案例研究Ext JS 6示例应用程序 注意事项 自定义JS压缩 小结 概述 这么多年来,Web开发人员都被 ...
- 【IOS 开发】Object - C 语法 之 类型转换
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3913507 ...
- 《java入门第一季》之Calendar类小案例获取任意二月天数
import java.util.Calendar; import java.util.Scanner; /* * 获取任意一年的二月有多少天 * * 分析: * A:键盘录入任意的年份 * B:设置 ...
- Protobuf-java maven配置
Protobuf-java maven配置 1. maven pom片断 <!-- protobuf-java for maven plugin http://stackoverflow.com ...