目前J2EE技术在国内的B/S应用开发中占主导地位,对JAVA的支持也是报表开发工具的一个重要考查指标。从这个意义上讲,报表开发工具可以分为纯JAVA和非纯JAVA两种。
纯JAVA报表软件具有明显的优势。产品能够与J2EE应用完全无缝结合、安装部署很轻松简单。同时,还可充分利用J2EE应用服务器的集群平衡负载及共享管理的能力,适合支持用户数众多的大型应用系统。
由于JAVA的跨平台能力,还能让整个应用系统轻松地从低端体系向高端体系迁移,系统容量变大时只要更换硬件、操作系统及数据库等系统部件而无需或很少需要重写软件。
非纯JAVA报表软件则相反,经常只能在Windows下运行、同样的应用在不同规模下可能需要两套解决方案;不能和J2EE的应用无缝结合,沟通需要沟通额外的网络协议,导致运行效率较低。
由于不能享受应用服务器的集群机制,难以支持多用户的大型应用。
除了采用的技术外,技术的原创程度也是个较重要的指标,它能够在某种程度上体现公司的研发能力以及产品的后续升级能力。手中不掌握原创技术的厂商无法对产品完全控制,其发展将严重受制于人。
参见:报表分类-绘制方案、报表分类-数学模型、Web报表软件的集成方案。
« Previous Entries Next Entries »
Web报表填报功能是快逸报表软件的一大特色。不同于其他产品只能生成可以填写的HTML,我们在产品开发过程中分析了大量的Web报表,总结出以下几点。如果你有填报的需求,在选择Web报表工具时,可以参考以下:
1、Web报表工具能够处理数据入库。开发者不用为每个报表编写入库程序,数据能自动写入事先设计好的、能反映业务规则的数据结构中,而不是报表工具指定的固定数据结构。需要填写的Web报表可能是行式的或交叉式的,数据入库的规则在报表定义时应当只定义一行(或一格),其它行(格)能够自动按规则重复。
2、填报方案能够支持多级汇总填报,即填报表格首先是从基层数据库汇总而来,然后再回填入上级数据库中,而不是总是对着一个空表填写。
3、能支持离线填写,即不联网时也可以填写,联网后再上报数据。
4、提供合法性检查,判断事先定义好的检查条件是否满足,如不满足则拒绝接收数据且给出提示。在页面端提供类EXCEL的自动计算功能,某个数据修改后,关联的数据立即变动,计算关系可以在报表中事先定义。合法性检查和自动计算关系都与入库定义类似需要能够自动按规则重复而不必为每个字段单独设计。
5、提供多种编辑风格,如编辑框、下拉框、CheckBox等;下拉框的内容可以是固定列表,也可以来自数据库。另外,还应当支持两个下拉框之间的关联过滤(如部门和子部分之间自动过滤)。
« Previous Entries Next Entries »
快逸报表提供两种打印方法:
(1)将Web报表导出成 PDF 或 Excel 文件后,再打印。
快逸报表可以将Web报表无失真地导出Excel和PDF文件,但 对于分页机制要求比较高的中国式报表,Excel和PDF打印还是无法满足,可作为打印的备选方案或者用于简单报表的打印。
(2)Applet 控件打印。
快逸报表提供了一个 Applet 打印控件,专供实现复杂的Web报表打印需求。
JAVA 有很完备的安全控制机制,相比较二进制的 ActiveX 控件, Applet 不存在安全方面的风险。
快逸报表的 Applet 控件提供了很多复杂报表的打印选项,包括:
A、纸张大小 :既可以按照 A4 、 B5 等定义纸张,也可以自定义纸张的宽、高、页边距;
B、自由定位 报表在纸张的位置――左、右、居中、分栏等;
C、分页机制 :按纸张尺寸、数据行数、行 / 列后分页,每页显示的数据行 / 列数等;
D、打印布局 :一纸打多页报表时,每张纸打印的行、列数、打印顺序等;
E、固定 左表头(快逸报表特有)、上表头;
F、报表是否 可缩放 ;
G、套打报表 :在 html 中是否显示背景图、打印背景图;
H、无须预览, 直接打印 。

参见:Java报表的套打功能。
« Previous Entries Next Entries »
现在在市场上能看到的 Web 报表工具软件的绘制方案有两种: Excel 式和拖拽式(也有称画布式)。
前者与EXCEL类似,由单元格组成报表,单元格的边框组成报表的格线。
拖拽式则是通过控件摆放,用控件的矩形边框重合摆出报表的格线。
国内报表对样式要求非常复杂而且严格,它决定了报表样式的复杂度和绘制效率,以及导出 EXCEL 的能力(这是用户很强调的功能)。
Excel式在这方面有明显的优势,能够画出样式很复杂的报表,绘制效率也比控件拖拽式高出10倍以上,而且导出 EXCEL 时格式上不会失真,个别产品还可以直接读入 EXCEL 画好的表以进一步提高效率。
拖拽式则显得非常笨拙,常见的复杂多层表头画起来非常繁琐,某些纵向合并格甚至无法绘制出来,屏幕上对齐的表在打印时或在 WEB 上显示时又可能不整齐,生成 EXCEL 时经常丧失格式或导致格线太多太细而无法应用,读入 EXCEL 格式则更是完全不可能有的功能。
更多参考:Excel式设计、报表分类-数学模型、报表分类-实现技术。
« Previous Entries Next Entries »
任务背景:
输入页面的动态增删行是个比较头痛的问题。用户在录入数据的时候,往往希望可以动态插入、删除、添加记录,这样操作起来比较方便。
对于比较简单的清单式报表,有这样的要求,但是对于比较复杂的分组报表,或者是分片输入的报表,也同样会提出类似的要求。此时要求能够选择报表区域,针对某个区域进行增删行的操作。
新增加的行要求能够自动生成对应的编辑风格、自动计算、合法性检查等功能
面临困难:
如果编程实现上述的功能,面临如下困难:
- 需要记录每条记录的修改、删除、新增状态
- 需要写复杂的javascript,实现动态增删的功能
- 对于分组报表和分片输入的报表,还需要智能识别用户需要增删的是哪个报表区域,从而对相应区域进行操作。
- 动态增删需要考虑的细节非常多,决不是表面上的增删行那么简单,在增加行的时候需要把编辑风格、自动计算、合法性检查等属性动态解析到新增加的行,这是一个最复杂的功能,因为每一行的编辑风格、自动计算、合法性检查等属性不会完全一样,因为这些属性往往和当前行的一些数据值有关系。而且还有一些全局的自动计算,可能和所有行都有关系,例如对所有行的sum操作等,这些自动计算的表达式都要动态的解析和变化。
- 当然,新增加的行还会有缺省值等属性,例如动态流水号等等,这些功能必然会遇到。
考虑到直接编程实现上述功能太麻烦,建议采用快逸报表的行式填报,快逸报表的行式填报从根本上解决了动态增删行的问题,不仅仅可以对分组报表、分片输入的报表实现多区域的插入删除,还能够动态解析编辑风格、自动计算、合法性检查等属性,实现了很智能的流水号、缺省值等功能,实现步骤如下:
实现步骤:
- 设计一个填报表,把报表样式设为“行式报表”
- 根据业务需要,添加编辑风格、自动计算、合法性检查、流水号等属性
- 在jsp中发布时,往tag里添加insertRowLabel、appendRowLabel、deleteRowLabel等属性,即插入、添加、删除按钮。
于是,功能完美的行式填报完成了,请看效果图:
效果演示:

« Previous Entries Next Entries »
任务背景:
在带参数的报表应用中,在查询的应用中,同一个用户每次查询所用的参数值或者查询条件往往是相同的,或者说常用的总是那几种查询条件,如果每次都让用户输入相同的条件值,用户会觉得很烦,于是用户往往会提出:能否提供查询条件保存的功能。
面临困难:
所谓的查询条件的保存,乍一听似乎很简单,实际做起来并不容易。最直接的是要和用户关联,因为某个用户输入的查询条件,只能提供给该用户使用,不能让别的用户看见。其次,要考虑和报表模块、查询模块关联,因为同一个用户在不同的报表模块、查询模块里用的查询条件是不同的。
另一个要考虑的是查询条件的存储格式,因为不同模块的参数个数、参数名均不相同,所以查询条件的存储格式要能够灵活扩充灵活解析。除了存储格式,还需要考虑存储位置,由于和用户关联,很多人直接想到的是采用cookies来实现,可是由于是WEB应用,客户端的机器可能随时会发生变化,比如用户可能在办公室上网,也可能在家里上网,在家里用另一台机器,于是预先存储的查询条件就没了。另外,由于每一个模块用户都可能存储多个查询条件供选择,cookies用起来还是不方便。因此,查询条件最好保存到服务器上。
接着,还需要考虑界面上的制作,在原先的参数输入页面上,要提供一个历史查询条件的下拉选项,该下拉选项从服务器存储的查询条件里读取;其次还需要做一个查询条件是否保存的选项,如果保存,则提供保存名称的编辑框。
做好这些之后,服务器端的程序还需要写不少,首先根据客户端的输入情况,判断使用历史查询条件还是使用当前的输入值,如果使用历史查询条件,则到库中读取;如果使用当前的输入值,还需要处理是否保存查询条件。
总之,做起来非常麻烦!而所有这些程序还要考虑通用性,否则每个模块写一遍,那不是累死了!基于以上的考虑,建议还是采用润乾报表的 参数模板+参数处理类 来实现,简单方便许多,具体步骤描述如下:
实现步骤:
- 设计一个参数模板,该模板里增加三个多余的参数:是否保存参数值,保存名,历史查询。
- 在参数处理类里,如果读取到需要保存参数值,则将参数值按名字存入一张预先设计的参数值表中,该表的结构为:用户名、报表名、保存名、参数名与值,建表SQL如下:
CREATE TABLE param (
userName varchar(100) not null ,
reportName varchar(100) not null ,
saveName varchar(100) not null,
argName varchar(100) not null,
saveValue varchar(200) )
- 用户访问该参数模板的时候,可以输入新的参数值,并选择是否把新输入的参数值保存下来,也可以选择历史保存的参数值进行查询,不需要重复的输入。
- 如果用户选择的是历史保存的参数值,那么在参数处理类里,从数据库中取出历史保存的参数值来进行查询。
效果演示:

« Previous Entries Next Entries »
当一个单元格中的数据集表达式过滤条件是从另外一个单元格扩展出来的数据中取数时,需要用到 in用法,例如:=ds2.select(id,false,!(id in A1[`0]{})),但是如果从过滤条件是除从扩展单元格扩展出来的数据以外的数据进行过滤,那么改怎么写呢?也就是not in 的用法,这样实现比较方便:=ds2.select(id,false,!(id in A1[`0]{})) 具体请参考附件in.rar。
« Previous Entries Next Entries »
分栏报表要做到格线对齐,这个与报表的奇偶行数有关系,如果正好这个分栏报表又是主子表,每一栏对应一个子表,每个子表的记录数还不确定,做出工整的分栏效果就更困难了。
比如:在页面显示时,不管主表数据有多少条,都需要分四栏显示,如果正好是五栏,那么第二排就是只显示一栏,后面对应的三栏显示空白。该报表可以通过固定四栏,子表中动态补足空行的方式实现,至于如何使多出的栏不显示空栏,而显示空白区域,这个可以通过“是否可见”属性控制,具体实现方法,可以参考附件中报表例子(附件:fldq.rar)。
« Previous Entries Next Entries »
有些报表用户在开发的时候没有配置数据源和连接池,而是通过jdbc的方式直接连接的数据库,这样的项目在集成快逸的产品时,<reportConfig></reportConfig>之间加入如下配置:

其中数据库类型的取值参考如下:
com.runqian.base4.util.DBTypes 的取值
public static final int ACCESS 7
public static final int DB2 9
public static final int ESSBASE 101
public static final int FOXBAS 8
public static final int FOXPRO 6
public static final int INFMIX 5
public static final int KINGBASE 11
public static final int MYSQL 10
public static final int OLAP 100
public static final int ORACLE 1
public static final int SQLANY 4
public static final int SQLSVR 2
public static final int SYBASE 3
public static final int UNKNOWN 0
这样可以解决jdbc的直连问题,但是这样的方式降低了报表计算的效率,建议报表用户采取配置数据源和连接池的方式部署自己的应用。
« Previous Entries Next Entries »
当发布包中存在自定义类,在从一个操作系统发布到另一个操作系统时有的时候会出现自定义的那个类无法识别的问题,例如:
java.lang.LinkageError: LinkageError while defining class: test.reportServletFilter
Could not be defined due to: (test/reportServletFilter) constant pool index out of range at offset=2338
This is often caused by having a class defined at multiple locations within the classloader hierarchy. Other potential causes
include compiling against an older or newer version of the class that has an incompatible method signature.
本例中的问题:windows操作系统下发布到websphere没有问题,发布到linux操作系统的websphere出现如上报错信息。
主要原因是有两种:一种是编译自定义类的jdk与服务器的jdk不一致,也就是说两种操作系统下的服务器中的jdk版本不一致,另一种是由于自定义的类在服务器中存在重复定义。
第一种问题可以对.java文件在相应的jdk下重新编译。
第二种问题可以修改自定义类的名字来解决。
« Previous Entries Next Entries »