大清单报表该怎么做?

 

很多行业都会有展现明细数据类的大清单报表需求,比如电信行业月底要看本月的全部充值记录,银行业要看当月交易记录清单,数据量会达到百万甚至千万级别

千万级别的数据,如果等全部取出算完再呈现,需要很长时间,没有人可以接受这么恶劣的用户体验,而且还有另外一个限制因素,就是报表大都是内存计算的,服务器的内存是有限的,一次装不下这么多数据,都得溢出

所以就需要有专门来处理大清单报表的功能和机制才可以

1 选一个合适的报表工具

这个功能完全自己做就太难了,所以要选一个报表工具

所有报表和 BI 厂商都号称自己可以做,但大多数的做法都是用数据分页

这会带来这样的问题:

imagepng

数据库分页不仅有这些弊端,而且程序代码和对应的数据库是强耦合的,万一换了数据源,那还得重新做一遍

这里有更详细的利弊分析:

大清单报表应当怎么做?

那么应该怎么做才好:

imagepng

更好的方法是:把取数和呈现做现两个异步线程,取数线程发出 SQL 后就不断取出数据后缓存到本地存储中,呈现线程根据页数计算出行数到本地缓存中去获取数据显示

这样做就可以把前面提到弊端从根本上全部解决掉了

1 只要已经取过的数据就能快速呈现,不会有等待感

2 取数线程只涉及一句 SQL,在数据库中是同一个事务,也不会有不一致的问题

目前貌似就润乾报表是这么实现的,大概也就只能选择润乾报表了

而且,润乾报表中使用了独有的集算器开源计算平台,还能解决非 RDB 数据源以及切换数据源的问题

然后我们就用润乾报表来做一个大清单报表

2 制作报表

打开润乾报表设计器,设置数据集取数

imagepng

制作报表模板

imagepng

制作参数模板

imagepng

制作完成后,报表就可以正常发布浏览了,但是这时候报表还只是普通报表,还没有使用大报表功能,经过下面两步后,就可以转变为大报表了

3 设置大数据集和对应标签

imagepng

在 jsp 中设置标签

imagepng

其中 rowNumPerPage 属性为每页显示记录数;fetchSize 为每次从数据源读取的数据量

4 浏览报表

浏览器中访问对应的 jsp,就可以看到报表了,这样一个大报表就做成了

imagepng

发布之后,右上角红框中的数字会不断增大,直到所有数据都取完才会停止

5 导出打印等

大清单报表,除了要在 web 端展示外,很多时候,还需要导出或者打印,这就要求导出和打印功能也得特殊处理才可以,否则导出和打印时候卡死,也是很严重的问题

润乾报表专门针对大报表的导出和打印做了优化,可以顺畅打印和导出

导出

imagepng

打印

imagepng

更详细的制作过程可以参考: 秒级展现的百万级大清单报表怎么做

本示例用的是润乾的 demo 数据库和 demo 应用来做的,用户实际制作的时候,可以先用润乾设计器设计好报表,然后把润乾标准的 j2ee 应用拷贝到自己的项目中,配置自己的数据源,就可以发布浏览了

总结

大清单报表需求虽不算普遍需求,但是却属于难度大风险高的需求,没有的时候用不到,用到的时候如果解决不了那就很难补救,所以选型的时候就要慎重考虑这一点了