Posts Tagged ‘性能’

3种Web报表软件的体系结构

07.02.2010 by admin - 0 Comment - 0
Posted in web报表

今天有一位朋友问起有关Web报表软件的体系结构和性能问题,解释如下:

Web报表软件总的讲有三种体系结构。一种是纯Java报表,以润乾为代表;一种是控件方式,以数巨为代表;另一种是独立服务器方式的报表软件,以Crystal Report为代表。

1、控件方式

这种方式在浏览器端要安装一个ActiveX控件,在服务器端只负责取数据,报表的计算与生成都是在控件中进行的。采用这种方式的原因是它的报表功能往往都是采用Delphi实现的,包括许多产品都是采用相同的第三方组件。

控件方式的缺点在于:

1)部署:一个控件,要完成别人报表服务器所实现的大部分功能,体积可想而之。功能越强,控件的体积越大。这对于部署是一个很大的负担。不仅如此,而且,当报表系统升级时,用户都必须重新安装控件,Web报表软件的B/S结构在部署方面的优势荡然无存。(其实这种方式本身就是伪B/S)

2)性能:在PC端计算与在服务器端计算,对小报表可能差别不大,但对于大报表,显然差异非常大。并且,如果一个Web报表系统有多个用户都要使用,服务器方式所可以采用的定时计算、缓存等等都无法发挥作用。

所以,控件方式一般只适用于简单、小型报表。这里的简单,不仅是报表的样式简单,也包括计算量、报表规模上都比较简单。

2、独立服务器

这种方式安装一个独立(逻辑上)的报表服务器。它避免了控件方式的Web报表软件部署繁琐、升级不便的缺点,能够通过服务器有效地管理报表,很好地处理性能问题。但它部署起来也是比较麻烦的,实际很多这类Web报表软件产品也很难真正做到跨平台。尤其是涉及集群、连接池等问题,它就无法提供良好的可扩展性。

3、Java报表软件

首先它可以轻松实现Web报表的跨平台部署。对于ASP,.NET等非Java应用,它可以以报表服务器的方式提供Web报表服务,这时这种Web报表工具的工作方法是与Crystal Report之类的产品类似的,具有独立服务器相同的优点与缺点(这里所说的独立服务器是指逻辑上的,物理上仍然可以与其他服务器安装在一起)。而对于Java应用,则可以以类包的方式将报表软件嵌入到J2EE应用架构中,与应用系统形成无缝衔接。这时,它的优势就更加明显:

1) Java应用服务器的所有提高性能的手段,都可以在Web报表软件上充分发挥作用,如计算能力更强的服务器(对控件方式服务器起不了多大作用,独立报表服务器则很多难以在UNIX服务器上部署),负载均衡,连接池等等。

2) Web报表软件可以与应用程序更紧密地衔接,被应用程序更灵活地使用。

有人说,你不要总拿Unix说事,实际应用中很多应用服务器是采用PC Server的。确实是这样,但是(姑且不说许多Web报表工具并不能很好地支持Linux)不要忘记应用服务器层采用PC Server的原因是在于在这一层比较适合采用水平方向的扩展,即使用Cluster和负载均衡技术。对于Java报表软件,这一点太容易了,直接和应用部署在一起就可以,可以说是天生的,但对于独立服务器,这个就很麻烦了。

转自:http://elf8848.javaeye.com/blog/626808

数据类型与运算速度

08.07.2009 by fengzhou - 0 Comment - 0
Posted in java报表相关

数值型的数据,根据其精度不同,可以分成若干种,例如:整型数据有short(16位),int(32位),long(64位),BigInteger(大于64位);浮点型数据有float(32位), double(64位),BigDecimal(大于64位)。

一般来说,精度越高的数据类型,运算速度越慢,因此,如果实际可能的数据长度没有那么长,那么建议选择精度相对比较低的数据类型,可以加快运算速度。

润乾报表提供的数值型转换函数有:

float() –转换成32位的浮点数
double() –转换成64位的浮点数
decimal() –转换成大于64位的浮点数
integer() –转换成32位的整数
long() –转换成64位的整数
bigint()– 转换成大于64位的整数
number() –转换成相应的32位整数、64位整数、或者64位符点数

在实际报表设计的时候,应该根据数据的长度慎重选择以上函数以保证有最快的运算速度。
引自:润乾报表知识库
相关文章:一种实现类似excel把负数显示成红色且去掉负号的方法 ; 导入带公式excel的问题web报表的扩展功能;润乾报表出了新版统计图解决行式填报导入excel发生错位的问题

巧用空值判断函数nvl()

08.06.2009 by fengzhou - 0 Comment - 0
Posted in java报表相关

在设计企业报表时,报表单元格的表达式中经常需要用到空值判断,例如在单元格的显示值属性中,判断当单元格的值为空时,显示为0,否则显示单元格的真实值,等等。一般这种情况下,用户习惯写的表达式是: if(value()==null, 0, value())。

如果我们把value()换成更加复杂的表达式,例如if(ds1.select1(…)==null, 0, ds1.select1(…)),大家可以看出,这种算法明显很慢,需要把ds1.select1(…)这样的复杂表达式运算两次,而如果采用nvl()则可以避免这个问题。

单元格函数:nvl()

函数说明:
根据第一个表达式的值是否为空,若为空则返回指定值

语法:
nvl( valueExp1, valueExp2 )

参数说明:
valueExp1–需要计算的表达式,其结果不为空时返回其值
valueExp2–需要计算的表达式,当valueExp1结果为空时返回此值

返回值:
valueExp1或valueExp2的结果值

示例:
例1:nvl(A1,””) 表示当A1为空时,返回空串,否则返回A1

例2:nvl(value(),0) 表示当当前格为空时返回0,否则返回当前格的值

应用举例:

正确写法,速度快 错误写法,速度慢
nvl(ds1.select1(…), 0) if(ds1.select1(…)==null, 0, ds1.select1(…))
nvl(a1[……]{……}, “–”) if(a1[……]{……}==null, “–”, a1[……]{……})

引自:润乾报表知识库
相关文章:一种实现类似excel把负数显示成红色且去掉负号的方法 ; 导入带公式excel的问题web报表的扩展功能;润乾报表出了新版统计图解决行式填报导入excel发生错位的问题

尽量在SQL中Group

08.05.2009 by fengzhou - 0 Comment - 0
Posted in web相关技术

对于汇总类型的分析报表,在报表生成时往往需要进行分组聚集运算,如果在数据库中先进行一次分组聚集,能够大大减少取到报表服务器的记录数,加快取数和报表运算的速度。

看如下报表:

1.png

这是一个典型的交叉分组报表,其sql有两种写法:

第一种:select 产品,客户,销量 from 购买记录表

第二种:select产品,客户,sum(销量) from 购买记录表 group by 产品,客户

而报表的做法都一样,如下图所示:

2.png

分析:

采用第一种做法,不仅仅取到报表服务器上记录数多了,取数速度慢,而且在报表端对购买记录表进行分组运算的时候速度也慢了;

采用第二种做法,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表端进行分组运算的时候只要对很少的记录数进行,报表的运算速度大大加快了。

总结:第二种做法的性能远远优于第一种
引自:润乾报表知识库
相关文章:一种实现类似excel把负数显示成红色且去掉负号的方法 ; 导入带公式excel的问题web报表的扩展功能;润乾报表出了新版统计图解决行式填报导入excel发生错位的问题

.NET报表开发中使用博计报表分页标签:显示第几页和共几页

06.13.2009 by fengzhou - 0 Comment - 0
Posted in .net报表相关

在使用博计报表开发Web报表时,如果遇到海量数据的清单式列表,那么在读取、展现及导出过程中可能会出现速度过慢、内存溢出、系统死机等问题。

因此,博计报表提供了分页计算extHtml标签。这个标签扩展了原html标签的功能,实现了以页为单位对数据进行读取和展现及导出等操作,大大降低了内存占有量,提高了运行效率,避免内存溢出等问题。

那么,如何在使用分页标签的报表的单元格中显示当前页码和总页数?

该问题的解决方法有两种:

1、假设分页标签的默认缓存页为100,那么首先将分页标签中的属性cachePageNum=”1″的赋值为1,然后在单元格中用表达式=beginRow/20+1来显示当前的页码,用表达式=totalCount/20来显示总页数。如果cachePageNum的值没有改为1的话,那么当前页就一直显示为1,因为报表已经默认缓存了100页,在点击下一页的时候,虽然后后台还在运算,但此时beginRow的值不会发生变化了。

2、我们可以首先将报表中某一个单元格的数据类型设置为html类型,然后在相应的内容中写入如下js代码:

<script>
document.write(report1_getCurrPage());
</script>

此时我们点击下一页的时候,所显示的数字即为当前页的页码。

总的页数我们也可以使用表达式:=floor(query(’SELECT count(*) FROM 订单明细’)/20,0)+1

引自:.NET报表知识库
原文链接:.NET报表开发中使用博计报表分页标签:显示第几页和共几页
相关文章:快逸报表V4.0支持什么样的数据库及服务器? ; 关于自定义类在不同操作系统下不能识别的问题 ; 利用内建数据集方便地进行快逸报表调试 ; OA产品的平台选择
其他相关内容:如何用多源关联设计复杂报表 ; ASP Web报表开发软件 ; 探讨报表工具;web报表博客

润乾报表分页标签:显示第几页和共几页

04.21.2009 by fengzhou - 1 Comment - 0
Posted in java报表相关

润乾报表使用当中,如果遇到海量数据的清单式列表,那么在读取、展现及导出过程中可能会出现速度过慢、内存溢出、系统死机等问题。因此,润乾报表提供了分页计算extHtml标签。这个标签扩展了原html标签的功能,实现了以页为单位对数据进行读取和展现及导出等操作,大大降低了内存占有量,提高了运行效率,避免内存溢出等问题。

那么,如何在使用分页标签的报表的单元格中显示当前页码和总页数?

该问题的解决方法有两种:

1、假设分页标签的默认缓存页为100,那么首先将分页标签中的属性cachePageNum=”1″的赋值为1,然后在单元格中用表达式=beginRow/20+1来显示当前的页码,用表达式=totalCount/20来显示总页数。如果cachePageNum的值没有改为1的话,那么当前页就一直显示为1,因为报表已经默认缓存了100页,在点击下一页的时候,虽然后后台还在运算,但此时beginRow的值不会发生变化了。

2、我们可以首先将报表中某一个单元格的数据类型设置为html类型,然后在相应的内容中写入如下js代码:

<script>
document.write(report1_getCurrPage());
</script>

此时我们点击下一页的时候,所显示的数字即为当前页的页码。

总的页数我们也可以使用表达式:=floor(query(’SELECT count(*) FROM 订单明细’)/20,0)+1

引自:润乾报表
原文链接:润乾报表分页标签:显示第几页和共几页
相关文章:国内企业级应用中的报表需求 ; 五种主流web报表工具的功能对比选择适合自己的Web报表工具指南快逸报表类EXCEL的高效报表设计web报表的扩展功能
其他相关内容: 润乾商业智能解决方案商业智能BI联盟 ; Java报表 ; 报表软件报表工具的功能对比; .net报表工具