文档章节

报表性能优化方案之单数据集分页SQL实现层式报表

九月你好123
 九月你好123
发布于 2015/09/07 10:10
字数 1077
阅读 63
收藏 1

1、概述

我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分页SQL。

下面以Access数据库为例介绍需要写分页SQL的数据库怎样利用行式的引擎实现层式报表。

解决方案提供工具:报表开发工具FineReport

2、解决思路

对于mysql这类可以直接使用行式的引擎实现层式报表的数据库来说,如果勾选了行式引擎,程序会自动生成分页sql,如,我新建了一个数据集ds1,来源于mysql数据库,基本sql语句为:

SELECT * FROM 订单明细

如果不定义分页sql,勾选行式引擎选项,预览报表时,程序会将上面的sql语句转化为下面的语句来取一页的数据:

SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 订单明细) t

如果数据库是上面所说的access一类的无法直接生成分页sql的数据库,那么就需要编写分页SQL。

3、操作步骤

以FRDemo内置的sqlite为例,说明sqlite如何写分页查询。

注:sqlserver2005和sqlite操作步骤一样。

3.1新建数据集

新建数据集ds1:SELECT * FROM 订单明细。

3.2添加分页查询SQL语句

在数据查询面板中点击分页查询按钮,编辑分页SQL语句,如下图:


完整的sql语句如下:

 SELECT *     
     FROM (    
             SELECT  *        
              FROM(    
                   SELECT *     
                       FROM 订单明细 ORDER BY 订单ID ASC limit ${fr_pagesize*fr_pagenumber}     
                    ) AS e1 ORDER BY 订单ID DESC limit ${    
                         if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)    
                         }  
         ) AS e2 ORDER BY 订单ID ASC


注:上述代码放置在分页sql面板中时,要删除后面的注释语句,并且语句中的三次ORDER BY 一定不能丢。

·        分页sql语句注释

${if(fr_pagenumber==int( (((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount -(fr_pagesize*(fr_pagenumber-1)),fr_pagesize)}意思是:

假如是最后一页的话,就取最后一页剩余的行数,假如不是最后一页就取每页需要显示的行数,示例中每页需要显示的行数为30行。

fr_pagenumber:当前浏览的页数,如果预览第2页,则fr_pagenumber=2;

fr_rowcount:当前数据集的总数据条数;

fr_pagesize:表示设置行式引擎时,每页需显示的行数,该示例中fr_pagesize=30.

在预览时,设定的分页查询根据3个变量的值,会生成数据库查询,如fr_pagenumber=2,fr_pagesize=30时,即在web端预览报表,预览至第2页时,上面的sql语句会转化为:

SELECT * FROM (SELECT * FROM ( SELECT * FROM 订单明细 ORDER BY 订单ID ASC limit 60 )AS e1 ORDER BY 订单ID DESClimit30 ) AS e2 ORDER BY 订单ID ASC

预览至第3页时,fr_pagenumber=3,sql语句就转化为:

SELECT * FROM (SELECT * FROM ( SELECT * FROM 订单明细 ORDER BY 订单ID ASC limit 90 )AS e1 ORDER BY 订单ID DESClimit30) AS e2 ORDER BY 订单ID ASC

预览至最后一页时,所剩下的数据可能不足30行,那么sql语句又会转化成什么样呢?

如果fr_rowcount=100,fr_pagesize=30,即数据总行数为100行,每页显示30行,预览至最后一页,也就是第4页时,fr_pagenumber=4,sql语句将转换为:

SELECT * FROM (SELECT * FROM ( SELECT * FROM 订单明细 ORDER BY 订单ID ASC limit 90)AS e1 ORDER BY 订单ID DESClimit10 ) AS e2 ORDER BY 订单ID ASC

3.3报表主体设计

将数据集中的数据列拖曳至单元格中。

3.4行式引擎设置

同上一节的设置方法,这里不再赘述。

3.5效果查看

点击分页预览,效果图如下:

已完成模板请参照:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Advanced\PagingSql.cpt

3.6数据库的分页SQL语句

  

   SELECT *     
           FROM (    
              SELECT TOP ${    
                             if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)    
                            } *        
               FROM(    
                        SELECT TOP ${fr_pagesize*fr_pagenumber} *     
                       FROM 订单明细 ORDER BY 订单ID ASC      
                      ) AS e1 ORDER BY 订单ID DESC   
             ) AS e2 ORDER BY 订单ID ASC

 


© 著作权归作者所有

九月你好123
粉丝 10
博文 111
码字总数 112722
作品 0
杭州
私信 提问
报表性能优化方案之行引擎执行层式报表

问题描述 这样一种报表:报表形式非常简单,只是简单的单数据源明细报表,但是数据量非常大,百万、千万甚至更多。报表取数及计算时间相当长。 希望能够提高报表展示速度,对于用户来说,查询...

九月你好123
2015/09/16
31
0
报表性能优化方案之多数据集实现层式报表

问题描述 若报表使用的数据量是上百万条的话,觉得报表展现的速度慢,可以使用层式报表来提高报表展现速度。但由层式报表章节可以得知,层式报表必须是单数据集,若是多数据集的模板且数据量...

九月你好123
2015/10/09
51
0
报表性能优化方案之善用参数注入

问题描述 对于多数据集关联报表,当数据很大时报表的展现速度就会很慢,或通过写sql语句又很复杂。为此FineReport提供一种,既可加快报表的展现速度,又不用编写复杂的sql语句的方案。即使用...

九月你好123
2015/09/22
43
0
报表性能优化方案之巧用相邻连续分组

问题描述 在数据显示方式章节内容中,我们已介绍分组的两个不同使用场景:普通分组和相邻连续分组。但其使用相邻连续分组功能,更主要原因是能够提高其报表的性能。 示例报表开发工具:FineR...

九月你好123
2015/09/18
36
0
AOS V0.3 发布,JavaEE 应用基础平台

写在最前面 经过一段时间的强撸,我们觉得是时候发布AOS V0.3版本了。这个版本共有21个新增/缺陷/问题的变更。 AOS平台简介 AOS应用基础平台基于JavaEE技术体系,以“标准功能可复用、通用模...

阿老表
2015/07/31
9.5K
17

没有更多内容

加载失败,请刷新页面

加载更多

Knowage 6.2安装部署

注意:需要正确配置JAVA_HOME和JRE_HOME还有catalina_home,否则启动的时候tomcat一闪而过,想要获得报错信息,可以打开cmd,在dos命令行运行开始命令 官网:https://www.knowage-suite.com/s...

阿伦哥-
29分钟前
5
0
c++11 左值引用和右值引用

#include <iostream>using namespace std;void Print(string& s){ cout << s;}int main(){ string s="abc"; Print(s); // OK Print("abc"); // parse error......

SibylY
30分钟前
5
0
浅谈Facade外观模式

一、前言 外观模式是一种非常简单的模式,简单到我们经常都会使用,比如对于类A和B,如果两者需要交互,经过一定的处理过程才能实现某一个具体的功能,那么我们可以将这个处理的过程定义为一...

青衣霓裳
31分钟前
5
0
AnalyticDB for PostgreSQL 6.0 新特性介绍

阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务ACID。ADB PG通过行存储、列存...

Mr_zebra
33分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部