自定义分页

SQL 自定义分页实现方案

报表自带分页功能,但当数据过大时,建议进行 SQL 自定义分页(手动)

基础版实现

实现思路

  1. SQL 查询总记录数,固定每页行数,得出总页数
  2. 用动态参数表征翻页功能,传参到主数据集中查询对应数据行

具体步骤

1. 建立计算总页数数据集(命名"分页")

select decode(ceil(count(1)/13),'0','1',ceil(count((1)/13) 总页数 
from tableA
where 1=1
--and 其他条件  --同主数据集中where 筛选条件一致

2. 建立主数据集(命名"ds1")

select * from (
    select rownum row_num, a.* from (
         select /*+parallel(t,4)*/ cloumn1,column2,...,cloumnN 
         from tableA t
         where 1=1
         --and  其他条件
         --order by cloumn1 desc nulls last  --排序
    ) a --order by cloumn1 desc nulls last  --排序
)
where row_num > (${a}-1)*13
and row_num <= ${a}*13
--order by cloumn1 desc nulls last  --排序

以上写法根据数据源不同,可以采用不同写法,一般通用可以用row_number() over()来写。

3. 页面布局设置

在主要模块下方(例如在 A4 所在行)放置翻页按钮,依次从左至右单元格放置字段或插入文字及其对应动态参数:

单元格 内容 动态参数
A4 总页数 列隐藏
首页 a = 1 -
上一页 a = if(a=1,1,a-1) -
下一页 a = if($a = A4, A4, $a + 1) -
末页 a = A4 -
富文本 共${=if(A4==0,1,A4)} 页,当前第${=$a}页 -

4. 其他配置

  1. 对于当前行设置条件属性:如果 $$$ <=1 则行高为 0
  2. 模板参数默认 a = 1
  3. 如果页面存在筛选后查询控件:
    • 添加不显示 label,命名为 a,控件值为字符串 1
    • 保证筛选后查询页面页码始终从第一页开始

增强版实现

样式优化

  • 可以使用 CSS 修改圆角等样式
  • 可以增加控件,设置自定义每页显示记录数(参数控件),不固定为 13 或其他值

工具栏实现

可以在参数面板中加入 button 等按钮,形似工具栏:

设置参考如下:

效果参考如下:

posted @ 2025-05-28 20:17  灯熄帘摇月候身  阅读(25)  评论(0)    收藏  举报