FineReport层式报表解决大数据集展示问题攻略

本文以填报报表为例,通过分页的方式,来解决大数据集展示的问题。

实现的思想就是通过在SQL里筛选部分数据库数据,以达到浏览器可以合理的展示报表页面。(数据分段,语句我这采用的是MYSQL,如果要用其他数据库,请查看FineReport帮助文档)

步骤一:打开fenye.cpt文件。

模板界面如下

两个ds,和一部分数据,及隐藏的一行。

隐藏一行内容如下

这里数据的功能会在下面说起。

ds1 里的内容如下

语句内容 SELECT * from aaa limit ${f},${p}

目的是从第${f}跳开始,选择${p}数据(这个$p就是展示的页数,$f的计算可以下面公式($page-1)*$p,mysql的limit的偏移量是从0开始)。

在模板参数里,我设置了他们的默认值

$P=20

$page=1;

这个和全局参数同理,在模板预览的时候是看不到数据的,必须到展示页面的时候参数才通过url传进来。

ds2里的内容如下

这个语句就比较简单就是求数据总数再除以每页页数,就能得到总页数。

报表主体

第一行的数据分别是前一页,后一页,总页数和当前页以及一个/,用来在工具栏里展示上一页和下一页等操作使用的,这里正常是不显示的,所以我们先屏蔽了(隐藏)。其他的就是用户数据的展示了。

为了展示报表能和我们正常报表一样,我们还需要做什么?

这里就需要写代码能实现上图的效果了。

点开填报预览的齿轮

可以看到我们这里用了7个自定义按钮和一个加载结束事件

加载结束事件的代码如下:

var toolbar = contentPane.toolbar;

var items = toolbar.options.items;

var customButton=items[2];//JQUERY取我们的工具栏上的按钮.items[2]代表的是第三个,也就是那个显示成文本框按钮。

var inner = customButton.$table;

var btnWrapper = $("em", inner);

btnWrapper.html("<input data-role=‘none‘ type=‘text‘  class=‘fr-texteditor‘ style=‘width: 42px; height: 16px; text-align: center;‘>");

//修正这个按钮的属性,让它变成文本类型,居中,鼠标放上次图标是编辑状态。

var cellValue = contentPane.curLGP.getCellValue("D1");//获取D1单元格的值就是page,也就是当前页。

var $input = $("input", btnWrapper);

$input.val(cellValue);//给这个文本控件复制,用的是JQUERY的方法,可以COPY。

var total=contentPane.curLGP.getCellValue("C1");

if (total>parseInt(total)){total=parseInt(total)+1;

}

contentPane.toolbar.options.items[4].setText(total);

//把总页数显示在第5个控件上,因为这个数值可能是小数,所以判断下要不要加一处理。

contentPane.toolbar.options.items[3].setText(contentPane.curLGP.getCellValue("E1"));

//把斜线写在第4个控件上。

7个自定义按钮:

第一个首页:

代码如下:

window.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page=1";//链接到fenye.cpt,page 参数=1,代表第一页。

第二个上一页:

代码如下:

var page= $("tr[tridx=0]","div.content-container").children().eq(0).html();  //取第一行第一个单元格内容。

if(page==0)

{

this.setEnable(false);

alert("页面超出指定的范围");

}

else

window.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+page//如果没有小于1就正常跳转,否则显示页面超过指定的范围,这个控件设置不可以使用。

第三个可以跳转的当前页:

var toolbar = contentPane.toolbar;

var items = toolbar.options.items;

var customButton=items[2];

var inner = customButton.$table;

var btnWrapper = $("em", inner);

var $input = $("input", btnWrapper);

//取这个控件

$input.blur(function(){

var toolbar = contentPane.toolbar;

var items = toolbar.options.items;

var customButton=items[2];

var inner = customButton.$table;

var btnWrapper = $("em", inner);

var $input = $("input", btnWrapper);

var page=$input.val();

var total=$("tr[tridx=0]","div.content-container").children().eq(2).html();

if (total>parseInt(total)){total=parseInt(total)+1;

}

if(parseInt(page) > parseInt(total) || parseInt(page) < parseInt(1) )

{

alert("你输出的页数不再指定范围内");

}

else

window.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+page

});

//失去焦点后输入的值是不是在指定的范围内,如果在跳转到指定页面,就在else后面的URL,否则输出你的输出页面不对提示。失去焦点代表就是点击其他地方或者点击TAB键。

第四个斜线:
这个在加载时间里处理了。这边不需要处理。
第五个总页数:
这个在加载时间里处理了。这边不需要处理。
第六个下一页:
var page= $("tr[tridx=0]","div.content-container").children().eq(1).html();  
var total=$("tr[tridx=0]","div.content-container").children().eq(2).html(); 
//JQURUY取下一页和总页数
      if (total>parseInt(total)){total=parseInt(total)+1;
     }
//判断总页数是不是整数,不是加一
      if(parseInt(page) > parseInt(total))
  {
this.setEnable(false);
alert("页数超出指定范围内");
}
else
window.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+page
//如果下一页在这个范围就跳转到那里

这个控件不可用,输出出错。
第七个末页:
代码如下:
var total=$("tr[tridx=0]","div.content-container").children().eq(2).html();  
//取总页数。
if (total>parseInt(total)){total=parseInt(total)+1;
}
window.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+total
//判断总页数是不是整数,不是加一,并跳转到最后一页。
显示控件的名称需要在别名里添加下

时间: 2024-10-08 16:30:22

FineReport层式报表解决大数据集展示问题攻略的相关文章

2018阿里云双12年终大促主会场全攻略

摘要: 双12官方攻略出炉! 2018阿里云双12年终大促活动已经于12月7日正式开启,从已开放的活动页面来看,活动分为两个阶段: 12月7日-12月23日的拉新返现阶段和12月24日-12月28日的TOP100英雄榜PK阶段. 活动核心亮点:老会员拉新可享25%返现+最高2.5万奖金,拉新前100赢大奖!新会员购买云产品2折起! 在双12这个大促活动中,怎样才能花最少的钱配置最特惠的云服务?云栖社区特为各位开发者奉献出省钱大法如下: 丨活动阵地:https://m.aliyun.com/act

如何利用报表工具FineReport实现报表列的动态展示

相信动态列的实现困扰了很多人,大数据量,多字段的加载将会非常耗时,数据又做不到真正的动态灵活.现有的方式都是通过变向的隐藏等方式来实现. 那该如何解决呢?这里分享帆软报表设计器FineReport的实现方案,结合实际工作中遇到的的相关内容. 我本地常用数据库是MYSQL,所以比较了解一点,所以实现方式也是基于mysql的.首先了解一下MySQL自带的information_schema数据库使用. 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_s

大数据入门级学习攻略

数据科学并没有一个独立的学科体系,统计学,机器学习,数据挖掘,数据库,分布式计算,云计算,信息可视化等技术或方法来对付数据. 但从狭义上来看,我认为数据科学就是解决三个问题: 很多初学者,对大数据的概念都是模糊不清的,大数据是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入了解,想学习的同学欢迎加入大数据学习qq群:458345782,有大量干货(零基础以及进阶的经典实战)分享给大家,并且有清华大学毕业的资深大数据讲师给大家免费授课,给大家分享目前国内最完整的大数据高端实

大 发 快 三攻略QQ:836840888

[〓微微 导师:836840888〓][邀 请 码17000077][网纸 1dd.app][信誉平台][资金保障][实力说话] 生活不如意十之八九,因此,我们总是不满意的多.人的满意分为两种,一种对自身的,一种是对外界的.外界 我们控制不了,外界常常令我们促不及防的产生不愉快,如下班时今天没赶上末班车,早上上班时堵车,这些外 界的不愉快不可避免的会影响我们自己的不满意,是不是我天生的命不好,倒霉事全占了,是不是天生就不行, 为什么那么多的不如意? 这时,人就会产生自怨自艾的情绪,说到这个自怨自

为部门准备应对大促等的攻略

大数据集报表点击表头排序

在润乾官方在线 demo的 "交互报表" 中,有介绍 "点击表头排序" 的报表案例,该报表针对普通统计类报表.对于使用大数据集的报表,当按照此方式改造时发现排序没起作用或仅对第一页或前几页排序,后面的都没成功. 要想了解啥原因导致?就需要分析该报表的做法及知道大数据集的取数原理. 首先,来分析下在线 demo“点击报表排序”的做法. 润乾报表中实现排序的方式有两种: 1. 借助数据集 sql,即 order by … 2. 数据集函数 如ds.select() 都有

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

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

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

1. 问题描述若报表使用的数据量是上百万条的话,觉得报表展现的速度慢,可以使用层式报表来提高报表展现速度.但由层式报表章节可以得知,层式报表必须是单数据集,若是多数据集的模板且数据量又很大,想要提高报表的查询速度要如何实现呢? 2. 实现思路在定义数据集时通过使用数据库本身的行序号或者使用数据库函数生成行序号(即行号)并且在where条件中通过页码参数使得行号在一定范围内显示,点击自定义的上一页下一页按钮时重新传入页码参数取出相应的数据. 注:SQL Server2000无法生成行号,因此需要定

FineReport中如何制作树数据集来实现组织树报表

1. 问题描述 FineReport,组织树报表中由id与父id来实现组织树报表,若层级数较多时,对每个单元格设置过滤条件和形态会比较繁琐,因此FineReport提供了一种特殊的数据集--树数据集,只需要简单的设置就能自动递归出层级,方便的实现如下图组织树报表: 图一   图二 2. FineReport构建树 2.1 新建报表,添加数据集 新建工作薄,添加数据集ds1取出原始数据,SQL语句为SELECT * FROM 公司部门. 2.2 定义树数据集 1)根据父字段构建树 使用情形:原始表