以Access数据库为例,通过FineReport报表工具,阐述如何在需分页SQL的数据库中,借助行式引擎实现层次化报表的构建与展示。
1、 应对策略
2、 对于MySQL这类数据库,若选择行式引擎来实现层式报表,系统将自动为数据集生成分页SQL。例如,新建一个源自MySQL的数据集ds1,其基础查询语句在启用行式引擎后,会由程序自动追加分页逻辑,无需手动编写分页代码,提升开发效率与执行规范性。
3、 查询订单明细表中的所有数据。
4、 若未设置分页SQL但启用行式引擎,预览报表时系统会自动将原SQL转换为分页查询语句以获取单页数据。
5、 从订单明细表中查询数据,先取出前60条记录,并为每行分配行号,然后在这些结果中筛选出行号大于30的记录,最终返回第31到第60条数据。该查询通过嵌套子查询实现分页效果,外层条件限制起始位置,内层控制最大获取数量,从而完成指定范围的数据提取。
6、 若数据库为Access等不支持直接生成分页SQL的类型,则需手动编写相应的分页查询语句。
7、 操作流程
8、 以FRDemo中的Access为例,介绍其分页查询语句的编写方法与实现步骤。
9、 创建新数据集
10、 创建数据集ds1,查询订单明细表中的所有数据。
11、 添加分页查询的SQL语句
12、 在数据查询面板点击分页按钮,编辑相应SQL语句,操作所示。
13、 完整SQL语句如下所示
14、 从订单明细表中按订单ID升序排列,取第当前页码乘以每页条数条数据。
15、 根据订单ID降序排列,从子查询结果中限制输出指定数量的记录。
16、 }
17、 按订单ID升序排列,从子查询结果中选择数据。
18、 将上述代码用于分页SQL面板时,需移除末尾注释,并确保语句中三个ORDER BY均保留,不可遗漏。
19、 分页查询SQL语句说明
20、 当当前页码等于总记录数减一除以每页大小后加一的整数部分时,返回剩余记录数,否则返回每页大小。即判断是否为最后一页,若是,则显示末页实际剩余的记录数量;若否,则正常显示每页设定的记录条数。该表达式用于分页时控制最后一页的数据行数。
21、 若是最后一页,则取剩余行数;否则取每页设定的行数,示例中每页显示30行。
22、 fr_pagenumber 表示当前查看的页码,例如预览第2页时,其值为2。
23、 fr_rowcount:表示当前数据集中记录的总数量。
24、 fr_pagesize用于设定行式引擎每页显示的行数,本例中设置为30行。
25、 当进行预览操作时,系统会根据设定的三个变量值生成相应的数据库查询语句。例如,当 fr_pagenumber 设置为 2、fr_pagesize 设置为 30 时,在网页端查看报表并翻至第二页,原始 SQL 语句将自动转换为对应分页参数的查询指令。
26、 从订单明细表中先按订单ID升序取出前60条记录,再从中按订单ID降序取最后30条,最终将这30条结果按订单ID升序排列并返回。该查询通过多层排序与限制操作,实现了对中间数据集的筛选与重新排序,确保输出为特定范围内的有序订单信息,适用于分页或区间提取场景。
27、 当预览到第3页时,fr_pagenumber值为3,SQL语句相应地进行转换。
28、 从订单明细表中首先按订单ID升序取前90条记录,然后在结果中按订单ID降序取前30条,最后将这30条数据按订单ID升序排列输出。整个过程实现了对订单明细的多层筛选与排序,最终返回一个按订单ID从小到大排列的30条记录的结果集,用于获取特定范围内的有序数据。
29、 当预览到最后一页时,若剩余数据不足30行,SQL语句将如何调整以适应实际数据量?
30、 当总行数为100,每页显示30行时,共分4页。浏览到最后一页(即第4页)时,当前页码为4。此时系统会根据该页码、每页大小及总行数,将原始查询语句转换为对应的分页查询SQL,以正确获取第4页所需的数据内容。
31、 从订单明细表中先按订单ID升序排列,取出前90条记录;再将这90条结果按订单ID降序排列,取最后10条;最后将这10条数据重新按订单ID升序排序输出。整个过程实现了对原始数据的分步筛选与排序,最终返回一个经过多重排序处理后的结果集,确保获取到特定范围内的有序订单信息。
32、 报表结构设计
33、 把数据列从数据集拖到单元格里。
34、 行式引擎配置
35、 进入模板设置,选择报表引擎属性,启用行式引擎执行报表,并勾选按页运算分段执行,每页记录数保持默认30条,具体设置所示。
36、 查看效果
37、 点击分页预览,查看效果所示
