以Access数据库为例,通过FineReport填报报表,说明如何利用行式引擎对需分页SQL的数据库实现层次化报表展示。
1、 应对策略
2、 对于支持行式引擎的MySQL数据库,若启用行式引擎,系统将自动为层式报表生成分页SQL。例如,新建一个源自MySQL的数据集ds1,其基础查询语句会由程序自动扩展,添加分页逻辑以优化数据展示与加载效率。
3、 查询订单明细表中的所有数据信息。
4、 若未设置分页SQL但启用行式引擎,预览报表时系统会自动将原SQL转换为分页查询语句以获取单页数据。
5、 从订单明细表中查询数据,先取出前60条记录,再从中筛选出行号大于30的记录。该操作通过嵌套查询实现:最内层获取全部订单明细,中间层限制结果集不超过60行,最外层则过滤掉前30行,最终返回第31至第60行的数据,实现分页查询效果。
6、 若数据库如Access等不支持直接生成分页SQL,则需手动编写相应的分页查询语句。
7、 操作流程
8、 以FRDemo中的Access为例,介绍其分页查询的编写方法与实现步骤。
9、 创建新数据集
10、 创建数据集ds1,查询订单明细表中的所有数据。
11、 加入分页查询的SQL代码
12、 在数据查询界面选择分页功能,输入相应SQL语句进行编辑操作。
13、 完整SQL语句如下所示
14、 从订单明细表中按订单ID升序排列,取第\${fr_pagenumber}页数据,每页\${fr_pagesize}条记录。
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、 预览报表时,系统根据设定的分页参数生成相应的数据库查询。当页面编号为2、每页显示30条数据时,前端请求会触发后台将原始SQL语句转换为对应分页条件的查询指令,从而获取第二页的数据内容并展示。
26、 从订单明细表中,先按订单ID升序取前60条记录,再从中按订单ID降序取前30条,最后将这30条记录按订单ID升序排列并返回结果。该查询通过多次排序与分页操作,逐步筛选出符合特定顺序要求的数据子集,最终输出一个经过多重排序逻辑处理后的有序结果集。整个过程实现了对原始数据的逐层过滤与重新排序。
27、 当预览到第3页时,fr_pagenumber值为3,SQL语句随之相应变化。
28、 从订单明细表中先按订单ID升序取出前90条记录,再从中按订单ID降序选取前30条,最后将这30条数据按订单ID升序排列返回。该查询通过多层排序与限制操作,实现了对特定范围数据的精确提取与顺序调整,适用于需要分阶段筛选并重新排序的场景。
29、 当预览到最后一页时,若剩余数据不足30行,SQL语句将如何调整以适应实际数据量?
30、 当总行数为100,每页显示30行时,共分4页。浏览到最后一页(即第4页)时,当前页码为4,系统会根据该页码、每页大小及总行数,将原始SQL语句自动重写,以实现仅查询并展示第四页所需的数据内容。
31、 从订单明细表中先按订单ID升序取出前90条记录,再从中按订单ID降序选取最后10条,最终将这10条结果按订单ID升序排列并返回。该查询通过多层排序与限制操作,实现了对特定范围数据的精确提取与顺序调整,适用于获取接近中间段但偏前部分的数据样本,常用于分页或数据分析场景。
32、 报表主体布局设计
33、 把数据列从数据集拖到单元格里。
34、 行式引擎配置
35、 进入模板设置,选择报表引擎属性,启用行式引擎执行报表,并勾选按页运算分段执行,每页记录数保持默认30条,具体设置所示。
36、 查看效果
37、 点击分页预览,效果所示
