报表性能优化方案之多数据集实现层式报表

1. 问题描述若报表使用的数据量是上百万条的话,觉得报表展现的速度慢,可以使用层式报表来提高报表展现速度。但由层式报表章节可以得知,层式报表必须是单数据集,若是多数据集的模板且数据量又很大,想要提高报表的查询速度要如何实现呢?

2. 实现思路在定义数据集时通过使用数据库本身的行序号或者使用数据库函数生成行序号(即行号)并且在where条件中通过页码参数使得行号在一定范围内显示,点击自定义的上一页下一页按钮时重新传入页码参数取出相应的数据。

注:SQL Server2000无法生成行号,因此需要定义存储过程实现分页查询,以下具体介绍Access实现分页的步骤,SQL Server2005以及Oracle数据库实现分页的步骤有一点区别,以下会详细介绍。

3. Access分页示例3.1 新建模板新建模板mutipage.cpt,为了加快展示速度,我们可以使用分页查询,获取每个产品的详细信息并计算产品对应的订单中的应付金额,因此添加数据集时查询SQL语句为select 产品.产品ID,产品名称, 供应商ID , 类别ID, 单位数量, 产品.单价, 产品.库存量, 产品.订购量,sum(应付金额) as 应付款项 from 产品,订单,订单明细 where 产品.产品ID=订单明细.产品ID and 订单明细.订单ID=订单.订单ID and 产品.产品ID between 10*(${page}-1)+1 and 10*${page} group by 产品.产品ID,产品名称, 供应商ID , 类别ID, 单位数量, 产品.单价, 产品.库存量, 产品.订购量 order by 产品.产品ID,设置参数page的默认值为1,首次看到的是第一页,只查询出第1~20条记录;若page参数为2时,查询出第21~40条记录,即第二页内容。

注:这边定义报表每页显示10条数据,即ds1的查询SQL一次只取10条数据,从而加快报表展示速度。

3.2 自定义上一页、下一页按钮使用分页查询后,报表需要根据page参数查询出行号在一定范围内的数据,当点击下一页时,page需要加1并传入报表查询出后10条记录;点击上一页时,page需要减1并传入报表查询出前10条记录。而报表内置的上一页下一页按钮无法做这些操作,因此需要自定义上一页下一页按钮。

  • 在单元格中求出上一页、下一页页码的值

在工具栏中无法直接获取page参数的值,因此先在单元格中求出上一页下一页的页码值,然后再在工具栏按钮中获取单元格的值。

  • 自定义上一页下一页按钮

点击模板>模板web属性>分页预览设置分,选择为该模板单独设置,在工具栏中增加两个自定义按钮分别命名为上一页,下一页,是工具栏上只剩下如下图所示几个按钮。

3.3 第一页与最后一页的处理首次访问报表时,默认显示第一页page=1,此时上一页按钮应该是无效的,否则点击上一页按钮时(页码为0),此时查询行号在-9到0之间的记录将会出错;同样,显示到最后一页时需下一页按钮无效。即当上一页页码page-1=0时,上一页无效;当下一页页码page>总页数时,下一页无效。

  • 求出总页数

根据总记录数及每页显示条数,求出总页数。新增数据集ds2,SQL语句为:SELECT count(*) as 总数 FROM 产品,查询出产品表总条数,拖入单元格,如下

双击总数所在单元格弹出数据列设置对话框,选择高级>自定义显示,在自定义中填入公式:roundup($$$/10,0)求出总页数。

将第一行的行高设置为0,或者是隐藏:

上一页按钮设置:选中上一页自定义按钮,点击自定义JavaScript,在js中填入:

  1. var page= $("tr[tridx=0]","div.content-container").children().eq(0).html();
  2. if(page==0)//如果报表显示第一页,则上一页不可用
  3. this.setEnable(false);
  4. else
  5. window.location.href="${servletURL}?reportlet=doc/Advanced/multipage.cpt&page="+page;

注:第一句是获取上一页页码(A1单元格)的值,其中最后的html()可以用Text()代替;第二句是重新加载报表并给page参数赋值。

上一页按钮设置:下一页按钮设置与上一页的js差不多,只需要获取B1的值就可以了,所以在js中填入:

  1. var page= $("tr[tridx=0]","div.content-container").children().eq(1).html();
  2. var total=$("tr[tridx=0]","div.content-container").children().eq(2).html();
  3. if(parseInt(page) > parseInt(total))//如果报表显示最后一页,则下一页不可用
  4. {
  5. this.setEnable(false);
  6. }
  7. else
  8. window.location.href="${servletURL}?reportlet=doc/Advanced/multipage.cpt&page="+page;

注:首次打开报表的时候,由于page参数是在数据集中定义的,数据集参数的默认值在第一个次打开报表时没办法传到单元格中,所以需要定义一个完全一样的模板参数page,默认值设为1。这样,首次打开模板时,上一页按钮同样不可用。

分页预览,即可查看效果。mutipage.cpt

具体模板可参考:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Advanced\mutipage.cpt。

4. SQL Server2005示例SQL Server2005使用ROW_NUMBER() OVER (ORDER BY 主键字段) AS rowno生成行号。

因此只需要修改数据集ds1查询SQL语句为select * from (SELECT *,ROW_NUMBER() OVER (ORDER BY year_school_id) AS rowno FROM year_school) as b where b.rowno between 20*(${page}-1)+1 and 20*${page}即可。

5. Oracle示例Oracle数据库中本身有行序号ROWNUM,因此只需要将上例ds1数据集修改成如下:SELECT * FROM (select A.*,ROWNUM rn from (select * from year_school) A where ROWNUM <=${start}+20) where RN >=${start}即可。

注:ROWNUM只支持小于,大于是不支持的,因此要做如上定义。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 08:23:02

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

报表性能优化方案之行引擎执行层式报表

1. 问题描述 这样一种报表:报表形式非常简单,只是简单的单数据源明细报表,但是数据量非常大,百万.千万甚至更多.报表取数及计算时间相当长. 希望能够提高报表展示速度,对于用户来说,查询报表不会有滞后的感觉. 解决方案提供工具:报表开发工具FineReport. 2. 解决方案 2.1 解决方案 对于单数据源明细报表,可以启用行引擎来执行报表,提高报表展示速度,优化用户体验. 2.2 原理 普通报表:取出全部数据后再执行报表,最后返回整体的报表结果给浏览器,用户访问到看到结果的时间=报表取数时间

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

1.概述 我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分页SQL. 下面以Access数据库为例介绍需要写分页SQL的数据库怎样利用行式的引擎实现层式报表. 解决方案提供工具:报表开发工具FineReport 2.解决思路 对于mysql这类可以直接使用行式的引擎实现层式报表的数据库来说,如果勾选了行式引擎,程序会自动生成分页sql,如,我新建了一个数据

报表性能优化方案之数据集缓存与共享

1. 问题描述 对于大数据量报表,若每次直接从数据库中查询数据,不仅增加数据库服务器的压力,也极大的影响了取数的速度从而降低了报表的执行速度,为此FineReport提供了数据集缓存与共享功能. FineReport可先将其数据集查询的结果缓存下来,对于缓存下来的数据,再次使用到相同数据集时,无需再次连接数据库重新查询数据,直接使用缓存下来的结果,即使用FineReport的数据集共享机制,达到资源复用,减少取数时间从而提高了报表的展现速度. 2. 数据集缓存 缓存分为缓存至内存和缓存至磁盘.

报表性能优化方案之善用参数注入

1. 问题描述 对于多数据集关联报表,当数据很大时报表的展现速度就会很慢,或通过写sql语句又很复杂.为此FineReport提供一种,既可加快报表的展现速度,又不用编写复杂的sql语句的方案.即使用动态参数注入功能. 2. 原理 动态参数注入,是通过注入的值对数据库中的数据进行操作的,只是取对应的数据,所以会提高报表的性能. 3. 示例 新建模板 展现多个关联数据表的数据 SQL语句,ds1:SELECT * FROM [订单] SQL语句,ds2:SELECT * FROM 订单明细 报表样

报表性能优化方案之报表取数

1. 取数原理 设计器拼出最终的SQL,将SQL语句传给数据库,数据库执行,将数据返回给设计器. 由于计算过程首先要通过SQL语句从数据库中取数据,我们可以通过控制数据量的大小和对数据的提前预处理来提高报表的性能.下面是一些优化的方法. 2. 优化SQL FineReport报表的数据集采用的是表模型,也就是说通过SQL这种DSL语言,从数据库通过简单查询或各种组合关联查询得到一个关系表,而这部分SQL查询根据各种数据库产商长时间的优化(比如建立索引),已经非常成熟.数据集一般要通过FineRe

报表性能优化方案之报表计算时间

1. 问题描述 完成报表取数后,设计器会对数据库返回的数据进行扩展.分组.列表.汇总等运算,好的模板制作习惯往往可以优化报表的计算时间. 以下示例报表开发工具:FineReport. 2. 解决方案 2.1 空白单元格应用 报表中,只要一个单元格里有设置就会占用一份内存,而空白的单元格几乎是不占任何内存的.报表中由于布局的需要,不可避免地会出现一些只起到占位作用而无需其他的设置的单元格:尽量将这些单元格设成空白单元格,这样能够有效的减少内存的占用,加快报表的运算速度. 2.2 慎用隐藏行列 报表

报表性能优化方案之巧用相邻连续分组

1. 问题描述 在数据显示方式章节内容中,我们已介绍分组的两个不同使用场景:普通分组和相邻连续分组.但其使用相邻连续分组功能,更主要原因是能够提高其报表的性能. 示例报表开发工具:FineReport 2. 原理 相邻连续分组的操作,是将数据集中连在一起的相同数据才进行合并的.尤其是,在配合SQL中已排好序的列,对其实现的分组时,使用此分组方式其性能比普通分组快些.如下简单示例,查看其报表执行数据信息,可看出其分组方式比普通分组方式更能提高其报表的性能. 3. 实现步骤 3.1 新建报表 3.2

报表性能优化方案之报表服务器优化基础讲解

一.内存 JVM堆栈内存是决定应用服务器性能的关键指标,一般服务器默认的内存配置都比较小,在较大型的应用项目中,这点内存是不够的,因此需要进行查看与修改Web服务器内存大小,接下来就介绍服务器内存查看的方法以及不同服务器内存的修改方式. 各应用服务器的内存配置方法不尽相同,如下列出了常用服务器的JVM参数(-Xms,-Xmx)配置方法. JVM参数定义: - Xms: 初始化内存大小 - Xmx: 可以使用的最大内存 以下示例工具:报表开发工具FineReport 二.服务器内存的查看 如果您想

报表性能优化方案之报表缓存路径

1. 问题描述 若启用了磁盘缓存,默认的会在C:\Documents and Settings\Administrator\.FineReport80(windows下)下创建cache即缓存文件夹,一般呢,C盘的空间会很小,如保存在C盘会增加对C盘的压力,那么有没有方法让其保存到别的盘符下呢? 解决方案提供工具:报表开发工具FineReport. 2. 解决方案 通过修改%FR_HOME%\WebReport\WEB-INF\resources\目录下的cache.xml文件(报表管理平台中设