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

  

报表性能优化方案之单数据集分页SQL实现层式报表的更多相关文章

  1. DedeCMS数据负载性能优化方案简单几招让你提速N倍

    前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...

  2. MySQL 性能优化系列之一 单表预处理

    MySQL 性能优化系列之一 单表预处理 背景介绍 我们经常在写多表关联的SQL时,会想到 left jion(左关联),right jion(右关联),inner jion(内关联)等. 但是,当表 ...

  3. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  4. mysql 性能优化方案1

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  5. (转)Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  6. mysql 性能优化方案 (转)

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  7. Redmine性能优化方案

    近来公司redmine服务器表现很糟糕,在16核,64GRAM的机器上,压测结果竟然只有每秒5~7个请求,部分页面一个都出不来. 以下是我对Redmine性能优化方案: redmine服务器性能问题排 ...

  8. Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  9. 老李分享:MySql的insert语句的性能优化方案

    老李分享:MySql的insert语句的性能优化方案   性能优化一直是测试人员比较感兴趣的内容,poptest在培训学员的时候也加大了性能测试调优的方面的内容,而性能优化需要经验的积累,经验的积累依 ...

随机推荐

  1. p7-p8面试经验总结--拿到offer

    简单的介绍下p7-p8之间的面试经验 整体的过程基本上所有的面试都是类似的,分为如下: 1.自我介绍: 2.相关问题讨论和交流: 3.谈薪资: 0.去面试的是架构师,最后来了两个面试官.最后拿到off ...

  2. Linux学习笔记13-用户和组

    操作系统通过用户.组概念来管理使用计算机的人 用户代表一个使用计算机的使用者,操作系统通过用户概念限制一个使用者能够访问的资源 组用来组织管理用户 用户具有以下概念: 每个用户有一个用户名和一个用户I ...

  3. SPRING SECURITY 拦截静态资源

    情景: <security:intercept-url pattern="/**" access="USER"/> 当在spring securti ...

  4. 设计模式——Spring IoC中用到的模板方法模式

    基本概念 什么是模板方法(Template method):父类定义了骨架(调用哪些方法及顺序),某些特定方法由子类实现. 最大的好处:代码复用,减少重复代码.除了子类要实现的特定方法,其他方法及方法 ...

  5. ArcGIS server 开发实践之【FeatureLayer类】

    全是干活,你值得拥有 要素图层类简介:Class:FeatureLayer //调用方式:require(["esri/layers/FeatureLayer"],function ...

  6. Java Swing快速构建窗体应用程序

    以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...

  7. Muzli – 所有你需要的设计灵感都在这

    曾几何时,三个家伙一起工作,他们分享各种令人振奋的资源链接.然后,其中一个人有一个想法.一个绝妙的主意,是否可以有一种方式来与他人分享这些链接?因此, Muzli 诞生了.所有你需要的设计灵感这里都有 ...

  8. ie8不兼容rgba的解决

    借鉴................. 在调试ie8兼容性的问题时,发现ie8不支持rgba. 关于rgba(),即为颜色设置的方法函数,rgb代表颜色,a代表透明度. 如rgba(0,0,0,0.1 ...

  9. 学习zepto.js(原型方法)[1]

    新的一周,新的开始,今天来学习一下zepto里边的原型方法,就是通过$.进行调用的方法,也是可以通过$.fn进行扩展的方法: $.camelCase(): 方法接收一个字符串,将连字符格式的字符串转为 ...

  10. 使用 SQL的 for xml path来进行字符串拼接 (group by)

    参考: http://www.cnblogs.com/repository/archive/2011/01/18/1938418.html select convert(varchar(10),c.[ ...