报表品质优化方案之单数据集分页SQL落成层式报表

 

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语句,如下图:

图片 1

总体的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  

  

 

网站地图xml地图