Archive for the ‘web报表’ Category

季度与月份的关系

08.25.2010 by zangmingkun - 0 Comment - 0
Posted in web报表

润乾报表为客户提供了非常多的功能函数,可以让用户方便的取到年,月,日等信息,但现在还没有提供季度之类的函数,本文就来介绍一下月份与季度的关系:

一、根据已知月份数求出该月份所在的季度数和该季度的最小月,最大月

A、季度最小月份求法:
季度最小月份=已知月份-(已知月份-1)%3 或 季度最小月份=已知月份-(已知月份+2)%3
B、季度最大月份求法:
季度最大月份=已知月份-(已知月份-1)%3+2 或 季度最大月份=已知月份-(已知月份+2)%3+2
C、季度数求法:
季度=(已知月份-(已知月份-1)%3+2)/3 或 季度=(已知月份-(已知月份+2)%3+2)/3

二、根据季度数求该季度的最大月最小月份

A、季度最小月份求法: 季度最小月份=季度*3-2
B、季度最大月份求法: 季度最大月份=季度*3

下面以几个事例来简单说明一下:

有了这几个公式就可以轻松的转换了。

下面以季度统计额来说明,以年份分组,然后统计出每个季度的订单数和销售额,有了季度,就可以知道此季度中的最大月、最小月,进而统计最大月、最小月的销售额了。

润乾报表集群缓存同步功能介绍

07.26.2010 by zangmingkun - 0 Comment - 0
Posted in web报表

目前服务器的集群,大多是使用session同步的方法解决的问题,即让集群中一台电脑的session在集群服务器发生相互之间跳转的时候,把session也同时复制到相应的电脑上。例如:在集群服务器中,第一次访问A机器,第二次跳转到B机器继续访问,服务器会自动把A机器产生的session的内容复制到B机器上,使得访问正常进行,从而实现服务器之间负载更加均衡。

但是润乾报表的缓存机制有所不同,润乾的缓存是基于硬盘的,会把缓存文件保存到电脑的硬盘上。但是这样在集群服务器上就造成了如下问题:当客户端第一次访问A机器时产生的报表保存在A机器的缓存目录下,第二次访问跳转到B机器时,B机器无法从A机器的本地硬盘上取得缓存的报表。为了解决这个问题,润乾采取了集群缓存同步的功能。

首先介绍一下集群缓存同步功能的概念。集群缓存同步是指:客户端在多次访问集群服务器的不同主机时,服务器之间可以进行报表缓存的同步,使得客户端能够返回正确的结果而不需要重新计算。

然后用户需要知道,润乾报表缓存相关的配置方法要在 reportconfig.xml 中设置, reportconfig.xml 的路径为:润乾web应用根目录下的WEB-INF/reportConfig.xml ,其中所有缓存相关的可配置属性如下:

<config>
<!– 配置缓存机器和缓存端口号–>
<name>clusterMember</name>
<value>A,192.168.0.59,8087;B,192.168.0.48,8087;</value>
</config>
<config>
<!– 配置是否共享缓存目录–>
<name>isCachedFileShared</name>
<value>yes</value>
</config>
<config>
<!– 配置缓存共享目录–>
<name>cachedReportDir</name>
<value>\\192.168.0.59\cached</value>
</config>
<config>
<!– 配置缓存id的前缀,注意集群时不同机器用不同的前缀–>
<name>cachedIdPrefix</name>
<value>A</value>
</config>

 

在上面的可配置属性中,其中 clusterMember 属性指定了系统缓存前缀,所有集群的服务器结点,每个服务器结点与缓存服务器间的通讯接口。它的格式是:缓存前缀,对应电脑的IP地址,访问电脑的端口号;…”,集群中有多少台电脑要用到集群缓存同步机制,那么就要在这里按照上面的格式,把这些电脑一一配置好。

第二个重要属性是 isCachedFileShared ,它的取值范围是 yes 或者 no ,它的作用是是否共享本地硬盘上的缓存目录和文件。设置为 yes 的时候缓存目录和文件被共享,可以在集群服务器中访问到电脑硬盘上的缓存,如果设置为 no ,那么缓存不能被共享,也就不能被集群中的其他电脑得到。必须注意的是,如果它的值为 yes ,那么必须设置 cachedReportDir 属性的值, cachedReportDir 的作用是 配置缓存共享目录,润乾报表的缓存将被保存到这个目录下,所以 cachedReportDir 的值需

为一个可读写的访问路径。

根据上面 reportconfig.xml 的例子和属性说明配置好这个配置文件后,集群缓存同步的配置就基本完成了,这个就可以在集群服务器中相互跳转的时候取到润乾报表的缓存文件了,也就成功解决了以前采用 session 复制的方法不能取到本地硬盘上缓存的问题。

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

利用快逸报表内置JS函数实现页码跳转功能

02.01.2010 by hewei - 3 Comments - 0
Posted in web报表

Web应用开发中一个很普遍的需求就是页码的跳转,快逸报表已经为项目开发人员提供了起始页,下一页,上一页,最后页的功能,节省了人工编写的复杂度,当然,如果想直接跳转到某一页,就需要稍微做一点工作了,我们知道快逸报表内置的javascript函数中有一个_toPage( )函数,此函数的语法为:tag中的name属性+_toPage( N),N为页数。下面就简单的做一个例子实现这一效果。
(注:更多的函数说明请参考 应用开发教程以及应用开发手册中的网页脚本控制一章节)

首先看一下效果图:

快逸报表 web报表 页面条状 js函数.png

实现步骤:
1:首先制作一张报表,报表属性设置为按行分页,每页十五行,如图所示:

快逸报表 web报表 页面条状 js函数 报表模板 分页

2:写jsp页面发布此报表,jsp代码如下:

<!-
< %@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” % >
< %
//以下代码是将常用的jsp中input元素拼为字符串
String tpagestr = “< input type=\”text\” style=\”width:30px;\” value=\”\” name=\”atpage\” id=\”atpage\”>< input type=\”submit\” value=\”go\” onclick=\”aa();\” >”;
%>
< html>
< head>
< title>快逸报表输入跳转页数跳转< /title>
< h2 align=”center” >快逸报表输入跳转页数跳转< /h2>
< /head>
< script type=”text/javascript” >
//定义名为aa的js函数,当点击value为”go”的按钮时调用
function aa(){
//获得定义ID为atpage输入框的值
var tpagenum = document.getElementById(”atpage”).value;
//调用快逸内置的_toPage()函数,将获得的值传入即可实现转到某一页
try{report1_toPage(tpagenum);}
catch(e){}
return false;

}
< /script>
< table align=”center”>
< tr >< td>
< %== 以下是用tag标签发布报表==% >
< report:html name=”report1″ reportFileName=”moreData.raq”
< %== userFuncBarElements是自定义的功能条中的功能元素,引入我们自定义的Html元素 ==%>
userFuncBarElements=”"
width=”-1″
/ >
< /td>< /tr>
< /table>
< /html>

总结:快逸报表内置了很多很实用的js函数供开发者调用,可以实现诸如此类的需求,熟练使用快逸报表中的内置js函数可以使开发变得更快速简单。

原文链接:利用快逸报表内置JS函数实现页码跳转功能

单元格中用HTML控制显示个性化文字

01.30.2010 by hewei - 1 Comment - 0
Posted in web报表

快逸报表单元格中的文字展现效果基本上可以满足大部分展示需求,但是有时候web报表用户需要在单元格中显示一些个性文字,如文字翻转等,这样的文字就需要做一些特殊处理,本文就来介绍一下怎样实现在单元格中显示个性化文字。 、

实现思路:
个性化文字通常是通过一些css以及html语言来对文字进行修饰而来的,只要能把这些html加载到单元格中就可以实现显示个性化文字了。

下面根据思路来做一个个性化文字的例子–文字翻转,实现步骤如下:
新建一张普通报表,在A1单元格中我们使用快逸中默认的文字。
在A2单元格鼠标右键,将数据类型转成HTML类型,在文本里输入修饰字体的HTML语言,如下图:

快逸报表html格式设计.PNG

这里使用的是div的方式:
< div style=”FILTER:progid:DXImageTransform.Microsoft.BasicImage(Rotation=1);height:1px”>
快逸报表V4
< /div>
其中style这段代码是用来对字体进行反转操作,Rotation=1代表顺时针转九十度。(这样的HTML代码还有很多)。还可以通过 来设定字体的颜色大小等属性。
需要注意的是单元格数据类型为HTML时,尺寸调整方式无效,这是要手动调整单元格的高宽来适应文字显示。
加入HTML后的文字效果如下:

快逸报表单元格中使用html效果.PNG

就这么简单的就可以实现个性化文字的需求了。通过在单元格中嵌入HTML语言,可以使很多web报表用户通过强大的HTML语言对文字数据进行一些个性化的处理,达到更好的效果。

原文链接:单元格中用HTML控制显示个性化文字

Web报表单元格内容竖排显示的制作方法

01.29.2010 by hewei - 3 Comments - 0
Posted in web报表

需求说明
普通报表常常需要将文字从纵向方向竖着排列,Web报表自然也不例外有这个需求。
快逸报表单元格的内容默认情况下是横向显示的,如何实现竖排显示单元格内容呢,下面介绍两种制作方法。

一.宽度限制加自动换行

大致思路:将该单元格内容居中显示,并设置单元格的宽度使每行只能显示一个字,然后设置自动换行,就可以实现单元格内容竖排显示了。
新建一个空白报表,然后内建一个数据集,内建数据集的内容如下

Web报表单元格内容竖排显示的制作方法1.png

然后在单元格中输入:
A1: 编号
A2:案卷题名
B1:=ds1.select(案卷_档号)
B2:=ds1.案卷_案卷题名
把没有用到的单元格删除掉。
设置B1的扩展方向为”横向扩展”

Web报表单元格内容竖排显示的制作方法2.png

现在报表已经做好了,浏览报表,单元格的内容是横向显示的。如下图

Web报表单元格内容竖排显示的制作方法3.png

下面添加竖排显示的功能:
设置A、B列的宽度为8,使每列只能显示一个汉字。实际运用中的具体宽度要根据字体具体大小算出。

Web报表单元格内容竖排显示的制作方法4.png

勾选上A1、A2、B2单元格的”自动换行”,使每行只能显示一个汉字

Web报表单元格内容竖排显示的制作方法5.png

设置完成,发布报表,在IE中浏览报表,效果图如下

Web报表单元格内容竖排显示的制作方法6.png

二.缩进控制加自动换行


方法一只能把列的宽度设置的很小,可以一行显示一个汉字;如果把列的宽度加宽,就不会出现上图中的效果。如果要把列的宽度设置的比较宽,一行又只能显示一个字,该怎么制作呢。
大致思路:将该单元格内容居中显示, 调整单元格的缩进值,然后勾选上”自动换行”属性,就可以在比较宽的列中实现单元格内容竖排显示了。
这种制作方法和上面的方法基本上一样,现在就用上面做好的报表,把B列的宽度改为25,然后设置B2单元格的缩进值为10,如下图:

Web报表单元格内容竖排显示的制作方法7.png

设置完成,保存报表,然后在IE中浏览报表,效果图如下:

Web报表单元格内容竖排显示的制作方法8.png

从上面的两种效果图可以看出,第一种不能加宽列的宽度,第二种方法可以调整列的宽度。以后遇到类似的需求就可以用上面的方法实现了。

原文链接:Web报表单元格内容竖排显示的制作方法

关于报表基础知识

01.28.2010 by hewei - 1 Comment - 0
Posted in web报表

什么是报表

一提起报表,人们最经常联想到的就是财务报表,象资产负债表、现金流量表、报销单等。其实除了财务报表,工作生活里还有很多报表,比如课程表、成绩表、员工登记表、工资表、物料登记单,银行记账单、手机话费单等等,各行业中的业务报表更是数不胜数。那么,什么是报表?

报表就是将内容信息(一般是数据、文字、图片等)以某种形式组织起来,并将组织结果呈现出来的文件。

对中国用户而言,凡是能打印出来的都可以叫报表。

什么是报表软件

顾名思义,报表软件就是用来制作报表的系统工具,目的是使做表工作简单化,提高总体工作效率。

报表软件有什么用?

报表软件可以帮助用户快速开发出自己想要的报表。这里的用户主要是指企业级用户市场,是除个人桌面级应用以外的市场。

企业级的用户一般有这么几个特征:
(1)应用复杂。企业级用户因为所处行业以及业务的不同,其应用软件涉及到财务、人员、物料、生产等各环节;
(2)数据量大,因为日常的业务往来会产生大量的生产数据;
(3)报表多且种类不同,处于不同生产环节上的人对报表有不同程度的要求。

专业的报表工具可以帮助企业级用户迅速定制出业务需要的报表。

将数据库操作封装到Javabean

01.27.2010 by hewei - 3 Comments - 0
Posted in web报表

封装数据库操作,目的就是为了隐藏java.sql包内的类,在编码中去掉核心的数据库操作代码。以杜绝直接数据库操作容易带来的资源未释放问题。同时也减少了数据库操作的编码量。

   但是很多网友在封装时,却喜欢返回结果集(ResultSet对象),那么这个封装就没有意义了。

   1. 又是直接操作核心数据库类,跟封装前几乎没什么变化。

   2. 结果集总是依赖于它使用的连接(Connection)对象。因此当连接对象在方法内被关闭后,你返回的ResultSet就没有用了。

   如果真的要获得查询数据库的结果集,就把结果集对象内的所有数据,转储到以Map为元素的List对象内。

   当然,这种方式,不能适应大数据量的查询,不过如果真的碰到大数据量的查询,那用什么封装都不好,还是得直接数据库操作. :)))

   下面是简单的数据库操作Javabean的代码

   DbWrapper.java

   import java.sql.*;

   import java.util.*;

   public class DbWrapper

   {

   // 定义连接池对象为静态变量,将一直存在,直到工作目录关闭。

   private static DataSource ds = null;

   // 1.用连接池的方式获得连接

   // 如果不是做多数据库程序,推荐使用此方法

   // 相关内容:在tomcat管理界面配置连接池

动态行的自动计算

01.26.2010 by hewei - 3 Comments - 0
Posted in web报表

随着B/S方式应用的普及,数据填报也逐渐转移到了网页上进行。数据录入最常见的需求之一就是动态增删行与自动计算。

所谓的动态增删行,即用户录入的过程中可以删除一些已有的行,也可以添加一些新的行,新的行和已有的行除数据外别的属性基本完全相似。

所谓自动计算,是指根据用户录入的某些单元格的值,自动计算出另外一些单元格的值,从而简化用户的输入,同时避免错误数据的录入。

因此,对于可以增加删除行的填报表,同样存在自动计算的问题。新增加的行如何添加到自动计算表达式中,比如sum\count等;已经删除的行如何从自动计算表达式中去掉?

在传统的C/S模式下,增删行的自动计算问题实现较为容易,采用通行的算法(在大多数数据结构教程中都有介绍)编写表达式计算程序来分析处理表达 式,在取单元格时根据当前环境从某逻辑行中取出数据参与运算即可(著名开发工具PowerBuilder中的Datawindow即是这样实现的)。

但是,在HTML页面上完成同样的工作则要困难得多。在纯HTML页面上通行的编程技术只有解释执行的JavaScript语言(以下简称JS)。 理论上采用JS编写表达式计算程序仍然可行,但实践中却会因JS效率过于低下而无法实用;同时由于JS语言本身能力较弱,写出这种复杂功能程序的代码量会 相当大,导致页面过于庞大而不利于下载。因此,在实际应用中不可能在纯HTML页面上实施上面的思路。

所幸的是,JS中固化了一个eval函数可用于计算表达式。但eval计算的表达式中只能出现事先定义过的JS变量或函数,而不能由程序员自行编写重载代码动态地取出某逻辑行的单元格值。

在这种限制下,采用静态报表方案可以有限地解决HTML页面上的表达式计算问题。即在报表发布成HTML之前,由后台程序为所有逻辑行生成由发布后 报表上静态单元格构成的表达式,其中统计表达式都分解成发布后报表上单个单元格的运算。这样,在HTML页面上执行eval函数时将不会再出现未定义的变 量(单元格)从而可以完成计算。

但是,这种方案不允许报表在填写过程中再插入或删除行。新增逻辑行上的行内表达式无法自动被添加出来(用JS自行计算出变换后的表达式与用JS编写计算表达式程序的复杂度是一致的),且统计表达式中将缺少新增行中的单元格。这时计算将不能完整地进行。

对于动态报表填写(即填写过程中要再插入或删除行)上的表达式计算,目前只能采用针对性编程的方案,为每种报表编写一段JS代码,拼出该报表发生变化后需要增加或修改的表达式。但显然这种方案没有通用性。

经过深入研究,快逸报表发明了一种新的算法,可以很轻松地解决增删行的的自动计算问题,其实现步骤如下:

实现步骤

  1. 设计一个行式填报表
  2. 按照业务要求写入自动计算表达式
  3. 现发布,系统会自动实现增删行时的自动计算

效果演示:

auto_computer1.png

报表设计界面

auto_computer2.png

C3单元格里写入的自动计算表达式

auto_computer3.png

浏览界面(尚未添加新行)

auto_computer4.png

浏览界面(添加了新行)

引自:报表工具知识库
原文链接: 快逸报表行式填报:动态行的自动计算
相关文章:普及报表系统功能说明 ; 好用的java开发工具 ; 数据集由内建还原为sql后没有数据 ; 快逸报表在瑞星2009下填报编辑框无法使用的解决办法
其他相关内容:润乾报表 ; RAQSOFT ; 润乾商业智能解决方案web报表研究专业.net报表工具

动态行的自动计算

01.26.2010 by hewei - 2 Comments - 0
Posted in web报表

随着B/S方式应用的普及,数据填报也逐渐转移到了网页上进行。数据录入最常见的需求之一就是动态增删行与自动计算。

所谓的动态增删行,即用户录入的过程中可以删除一些已有的行,也可以添加一些新的行,新的行和已有的行除数据外别的属性基本完全相似。

所谓自动计算,是指根据用户录入的某些单元格的值,自动计算出另外一些单元格的值,从而简化用户的输入,同时避免错误数据的录入。

因此,对于可以增加删除行的填报表,同样存在自动计算的问题。新增加的行如何添加到自动计算表达式中,比如sum\count等;已经删除的行如何从自动计算表达式中去掉?

在传统的C/S模式下,增删行的自动计算问题实现较为容易,采用通行的算法(在大多数数据结构教程中都有介绍)编写表达式计算程序来分析处理表达 式,在取单元格时根据当前环境从某逻辑行中取出数据参与运算即可(著名开发工具PowerBuilder中的Datawindow即是这样实现的)。

但是,在HTML页面上完成同样的工作则要困难得多。在纯HTML页面上通行的编程技术只有解释执行的JavaScript语言(以下简称JS)。 理论上采用JS编写表达式计算程序仍然可行,但实践中却会因JS效率过于低下而无法实用;同时由于JS语言本身能力较弱,写出这种复杂功能程序的代码量会 相当大,导致页面过于庞大而不利于下载。因此,在实际应用中不可能在纯HTML页面上实施上面的思路。

所幸的是,JS中固化了一个eval函数可用于计算表达式。但eval计算的表达式中只能出现事先定义过的JS变量或函数,而不能由程序员自行编写重载代码动态地取出某逻辑行的单元格值。

在这种限制下,采用静态报表方案可以有限地解决HTML页面上的表达式计算问题。即在报表发布成HTML之前,由后台程序为所有逻辑行生成由发布后 报表上静态单元格构成的表达式,其中统计表达式都分解成发布后报表上单个单元格的运算。这样,在HTML页面上执行eval函数时将不会再出现未定义的变 量(单元格)从而可以完成计算。

但是,这种方案不允许报表在填写过程中再插入或删除行。新增逻辑行上的行内表达式无法自动被添加出来(用JS自行计算出变换后的表达式与用JS编写计算表达式程序的复杂度是一致的),且统计表达式中将缺少新增行中的单元格。这时计算将不能完整地进行。

对于动态报表填写(即填写过程中要再插入或删除行)上的表达式计算,目前只能采用针对性编程的方案,为每种报表编写一段JS代码,拼出该报表发生变化后需要增加或修改的表达式。但显然这种方案没有通用性。

经过深入研究,快逸报表发明了一种新的算法,可以很轻松地解决增删行的的自动计算问题,其实现步骤如下:

实现步骤

  1. 设计一个行式填报表
  2. 按照业务要求写入自动计算表达式
  3. 现发布,系统会自动实现增删行时的自动计算

效果演示:

auto_computer1.png

报表设计界面

auto_computer2.png

C3单元格里写入的自动计算表达式

auto_computer3.png

浏览界面(尚未添加新行)

auto_computer4.png

浏览界面(添加了新行)

引自:报表工具知识库
原文链接: 快逸报表行式填报:动态行的自动计算
相关文章:普及报表系统功能说明 ; 好用的java开发工具 ; 数据集由内建还原为sql后没有数据 ; 快逸报表在瑞星2009下填报编辑框无法使用的解决办法
其他相关内容:润乾报表 ; RAQSOFT ; 润乾商业智能解决方案web报表研究专业.net报表工具