行式引擎,行式的引擎,报表性能优化,多数聚集实现层式报表
1. 问题描述
若报表使用的数据量是上百万条的话,觉得报表展现的速度慢,可以使用层式报表来提高报表展现速度。但由层式报表章节可以得知,层式报表必须是单数据集,若是多数据集的模板且数据量又很大,想要提高报表的查询速度要如何实现呢? 2. 实现思路
在定义数据集时通过使用数据库本身的行序号或者使用数据库函数生成行序号(即行号)并且在where条件中通过页码参数使得行号在一定范围内显示,点击自定义的上一页下一页按钮时重新传入页码参数取出相应的数据。
注:SQL Server2000无法生成行号,因此需要定义存储过程实现分页查询,以下介绍SQL Server2005以及Oracle数据库实现步骤。
3. SQL Server2005示例
3.1 定义分页SQL
为了加快展示速度,我们可以使用分页查询,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},设置page参数的默认值为1,首次看到的是第一页,只查询出第1~20条记录;若page参数为2时,查询出第21~40条记录,即第二页内容。
注:这边定义报表每页显示20条数据,即ds1的查询SQL一次只取20条数据,从而加快报表展示速度。
3.2 自定义上一页、下一页按钮
使用分页查询后,报表需要根据page参数查询出行号在一定范围内的数据,当点击下一页时,page需要加1并传入报表查询出后20条记录;点击上一页时,page需要减1并传入报表查询出前20条记录。而报表内置的上一页下一页按钮无法做这些操作,因此需要自定义上一页下一页按钮。
在工具栏中无法直接获取page参数的值,因此先在单元格中求出上一页下一页的页码值,然后再在工具栏按钮中获取单元格的值。
点击报表>报表Web属性>分页预览设置,在工具栏中增加两个自定义按钮分别命名为上一页,下一页。
上一页按钮设置:选中上一页自定义按钮,点击自定义JavaScript,在js中填入:
注:第一句是获取上一页页码(A1单元格)的值,第二句是重新加载报表并给page参数赋值。
上一页按钮设置:下一页按钮设置与上一页的js差不多,只需要获取B1的值就可以了,所以在js中填入:
3.3 第一页与最后一页的处理
首次访问报表时,默认显示第一页page=1,此时上一页按钮应该是无效的,否则点击上一页按钮时(页码为0),此时查询行号在-19到0之间的记录将会出错;同样,显示到最后一页时需下一页按钮无效。即当上一页页码page-1=0时,上一页无效;当下一页页码page+1>总页数时,下一页无效。
根据总记录数及每页显示条数,求出总页数。新增数据集ds3,SQL语句为:select count(*) as 总数 from year_school查询出year_school表学校编号总数,拖入单元格,如下
双击总数所在单元格弹出数据列设置对话框,选择高级>自定义显示,在自定义中填入公式:roundup($$$/20,0)求出总页数。
由上图可知,当上一页页码(A1单元格)值为0时,上一页按钮无效;当下一页页码(B1单元格)值大于总页数(C1单元格)值时,下一页按钮无效。点击报表>报表Web属性>分页预览设置,给模板增加加载结束事件,在js中填入:
分页预览,即可查看效果。
4. Oracle示例
Oracle数据库中本身有行序号ROWNUM,因此只需要将上例ds1数据集修改成如下:SELECT * FROM (select A.*,ROWNUM rn from (select * from year_school) A where ROWNUM <=${start}+20) where RN >=${start}即可。
注:ROWNUM只支持小于,大于是不支持的,因此要做如上定义。
返回顶部