Archive for 12月, 2009

填报中的下拉多选列表框

12.31.2009 by hewei - 0 Comment - 0
Posted in web报表应用
快逸报表应用的填报页面中,下拉框是最常见的了。下拉选择框可以简化用户的输入,可以避免用户的错误录入,还可以轻松实现中文与代码的映射关系,可谓用途多多。 可是随着业务的越来越复杂,各种奇怪的需求均可能冒出来,比如说,数据库中的某个字段的取值,有可能同时存在多种,比如员工基本信息表里的擅长的外 语字段,有些人仅仅擅长一门外语,有些人擅长两门,有些人擅长三门、四门,甚至有些神童从小就精通七八门外语,如果一门外语搞一个字段,人家可能擅长七八 门外语,你岂不是要为他设计七八个外语字段,分别命名为外语1、外语2、外语3、……外语n,这样的表结构岂不是让人发疯? 但是,如果外语的下拉选择框允许多选(比如:下图中的多选效果),那么可以把擅长的多门外语用逗号分隔存入一个字段中,这样岂不是轻松地解决了这个问题? multi_select_input.png 这个功能看似很简单,做个多选框不就行了,可是仔细推敲,其实不然。 首先,网页上的多选框在form里提交后,后台request里接收到的是一个数组,你必须在后台写程序把数组拼成逗号分隔的串,然后才能存到数据库中; 其次,把数据取回来修改的时候,还需要把数据库中逗号分隔的串解析回数组,并展现在界面里。 更为复杂些的要求,就是当选项非常多的时候,不能用简单的多选框,而可能要用下拉树,把数据组织成树状结构,这样才方便选择,否则几千甚至几万个选 项,眼睛都要看花了。而下拉树要实现多选,那更是要费一番功夫。比如叶子节点允许多选,枝节点不允许多选等等五花八门的需求,会把人弄晕。 幸好注重细节的快逸报表把所有这些麻烦都解决了。它为下拉列表、下拉数据集、下拉树等编辑风格都提供了多选的选项,使用起来非常方便,步骤如下:

实现步骤

  1. 设计一个填报表,定义下拉列表、下拉数据集、下拉树等编辑风格
  2. 在这些编辑风格的属性编辑框里,把多选选项打勾
  3. 发布

引自: 报表工具知识库

原文链接:快逸报表:填报中的下拉多选列表框

相关文章: 普及报表系统功能说明 ; 好用的java开发工具 ; 数据集由内建还原为sql后没有数据 ; 快逸报表在瑞星2009下填报编辑框无法使用的解决办法

其他相关内容: 润乾报表 ; RAQSOFT ; 润乾商业智能解决方案 ; web报表研究 ; 专业.net报表工具

“确认”提示框的处理

12.30.2009 by hewei - 0 Comment - 0
Posted in web报表应用
快逸报表不仅是一个强大的报表工具,也提供了强大的数据填报功能。web填报常常遇到的问题,快逸报表都可以解决:单选按钮、下拉列表、自动计算、自动生成流水号、实时数据合法性检查、多选批量操作等等。 在用户填报完成点击”提交”的时候,系统可以弹出一个”确认”的提示框,那么是否可以定制这个提示框呢? 解决办法: 比如:想在提示框中添加”取消”等。 设置标签:promptAfterSave=”no” 然后自己写js实现提交按钮和弹出对话框,例如: <input type=”submit” name=”Submit2″ value=”提交” onclick=”firm()” /> function firm() { //利用对话框返回的值 (true 或者 false) if(confirm(”是否保存”)) { //如果是true ,则调用_submitTable( report1 ) _submitTable( report1 ); return true; } else { //否则则取消 //alert(”你按了取消,那就是返回false”); return false; } } </script>
引自: 报表工具知识库
原文链接: 快逸填报:输入为空时候的合法性校验
相关文章: 普及报表系统功能说明 ; 好用的java开发工具 ; 数据集由内建还原为sql后没有数据 ; 快逸报表在瑞星2009下填报编辑框无法使用的解决办法
其他相关内容: 润乾报表 ; RAQSOFT ; 润乾商业智能解决方案 ; web报表研究 ; 专业.net报表工具

行式填报

12.29.2009 by hewei - 0 Comment - 0
Posted in web报表应用

任务背景

输入页面的动态增删行是个比较头痛的问题。用户在录入数据的时候,往往希望可以动态插入、删除、添加记录,这样操作起来比较方便。 对于比较简单的清单式报表,有这样的要求,但是对于比较复杂的分组报表,或者是分片输入的报表,也同样会提出类似的要求。此时要求能够选择报表区域,针对某个区域进行增删行的操作。 新增加的行要求能够自动生成对应的编辑风格、自动计算、合法性检查等功能

面临困难

如果编程实现上述的功能,面临如下困难: - 需要记录每条记录的修改、删除、新增状态 - 需要写复杂的javascript,实现动态增删的功能 - 对于分组报表和分片输入的报表,还需要智能识别用户需要增删的是哪个报表区域,从而对相应区域进行操作。 动 态增删需要考虑的细节非常多,决不是表面上的增删行那么简单,在增加行的时候需要把编辑风格、自动计算、合法性检查等属性动态解析到新增加的行,这是一个 最复杂的功能,因为每一行的编辑风格、自动计算、合法性检查等属性不会完全一样,因为这些属性往往和当前行的一些数据值有关系。而且还有一些全局的自动计 算,可能和所有行都有关系,例如对所有行的sum操作等,这些自动计算的表达式都要动态的解析和变化。 当然,新增加的行还会有缺省值等属性,例如动态流水号等等,这些功能必然会遇到。 考虑到直接编程实现上述功能太麻烦,建议采用润乾报表的行式填报,快逸报表的行式填报从根本上解决了动态增删行的问题,不仅仅可以对分组报表、分片 输入的报表实现多区域的插入删除,还能够动态解析编辑风格、自动计算、合法性检查等属性,实现了很智能的流水号、缺省值等功能,实现步骤如下:

实现步骤

  1. 设计一个填报表,把报表样式设为”行式报表”
  2. 根据业务需要,添加编辑风格、自动计算、合法性检查、流水号等属性
  3. 在jsp中发布时,往tag里添加insertRowLabel、appendRowLabel、deleteRowLabel等属性,即插入、添加、删除按钮。

于是,功能完美的行式填报完成了,请看效果图:

效果演示

row_report_input.png

引自:报表工具知识库

原文链接:谈谈行式填报

相关文章:普及报表系统功能说明 ; 好用的java开发工具 ; 数据集由内建还原为sql后没有数据 ; 利用内建数据集方便地进行快逸报表调试

其他相关内容:润乾报表 ; RAQSOFT ; 润乾商业智能解决方案 ; java报表研究

连接不上sqlserver2005数据库的一个解决办法

12.28.2009 by hewei - 0 Comment - 0
Posted in web报表应用
快逸报表连接sql2005报错:到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

解决方案

原因:sqlserver2005默认情况下禁用了tcp/ip连接。 手工启动tcp/ip连接的方法, 打开 \Microsoft SQL Server 2005\配置工具\目录下的SQL Server Configuration Manager,选择mssqlserver协议,右边窗口有个tcp/ip协议,启动它。之后要重启sqlserver服务,即可连接成功。
引自: 报表工具知识库
原文链接: 快逸报表:连接不上sqlserver2005数据库的一个解决办法
相关文章: 普及报表系统功能说明 ; 好用的java开发工具快逸报表数据源找不到的一个原因五种常用web服务器jvm参数设置
其他相关内容: 润乾报表 ; RAQSOFT ; 润乾商业智能解决方案

实现查询条件的保存

12.27.2009 by hewei - 0 Comment - 0
Posted in web相关技术

任务背景

在带参数的报表应用中,在查询的应用中,同一个用户每次查询所用的参数值或者查询条件往往是相同的,或者说常用的总是那几种查询条件,如果每次都让用户输入相同的条件值,用户会觉得很烦,于是用户往往会提出:能否提供查询条件保存的功能。

面临困难

所谓的查询条件的保存,乍一听似乎很简单,实际做起来并不容易。最直接的是要和用户关联,因为某个用户输入的查询条件,只能提供给该用户使用,不能 让别的用户看见。其次,要考虑和报表模块、查询模块关联,因为同一个用户在不同的报表模块、查询模块里用的查询条件是不同的。 另一个要考虑的是查询条件的存储格式,因为不同模块的参数个数、参数名均不相同,所以查询条件的存储格式要能够灵活扩充灵活解析。除了存储格式,还需要考 虑存储位置,由于和用户关联,很多人直接想到的是采用cookies来实现,可是由于是WEB应用,客户端的机器可能随时会发生变化,比如用户可能在办公 室上网,也可能在家里上网,在家里用另一台机器,于是预先存储的查询条件就没了。另外,由于每一个模块用户都可能存储多个查询条件供选择,cookies 用起来还是不方便。因此,查询条件最好保存到服务器上。 接着,还需要考虑界面上的制作,在原先的参数输入页面上,要提供一个历史查询条件的下拉选项,该下拉选项从服务器存储的查询条件里读取;其次还需要做一个 查询条件是否保存的选项,如果保存,则提供保存名称的编辑框。 做好这些之后,服务器端的程序还需要写不少,首先根据客户端的输入情况,判断使用历史查询条件还是使用当前的输入值,如果使用历史查询条件,则到库中读 取;如果使用当前的输入值,还需要处理是否保存查询条件。 总之,做起来非常麻烦!而所有这些程序还要考虑通用性,否则每个模块写一遍,那不是累死了!基于以上的考虑,建议还是采用快逸报表的 参数模板+参数处理类 来实现,简单方便许多,具体步骤描述如下:

实现步骤

  1. 设计一个参数模板,该模板里增加三个多余的参数:是否保存参数值,保存名,历史查询。
  2. 在参数处理类里,如果读取到需要保存参数值,则将参数值按名字存入一张预先设计的参数值表中,该表的结构为:用户名、报表名、保存名、参数名与值,建表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) )
    
  3. 用户访问该参数模板的时候,可以输入新的参数值,并选择是否把新输入的参数值保存下来,也可以选择历史保存的参数值进行查询,不需要重复的输入。
  4. 如果用户选择的是历史保存的参数值,那么在参数处理类里,从数据库中取出历史保存的参数值来进行查询。

效果演示

saveed_query_condition.png

引自:报表工具知识库

原文链接: 用快逸报表轻松实现查询条件的保存

相关文章:如何将多个报表导入同一个Excel中的多个sheet中; 好用的java开发工具用快逸报表不写代码实现Web应用中的下拉日历web报表的扩展功能高效易用的低端JAVA报表工具

其他相关内容:润乾报表 ; Java报表工具 ; 润乾商业智能解决方案商业智能BI联盟

jboss中部署报表的一个异常解决

12.26.2009 by hewei - 0 Comment - 0
Posted in web相关技术
在jboss中使用快逸报表,会出现一个异常: log4j:ERROR A “org.jboss.logging.util.OnlyOnceErrorHandler” object is not assignable to a “org.apache.log4j.spi.ErrorHandler” variable… 解决办法 对于jboss4.0.x解决方法是把/server/default/jbossweb-tomcat55.sar/META-INF/jboss-service.xml 中的以下两个属性改成true <attribute name=”Java2ClassLoadingCompliance”>true</attribute> <attribute name=”UseJBossWebLoader”>true</attribute> 对于jboss4.2.x,则把/server/default/jboss-web.deployer\META-INF/jboss-service.xml 中的那两个属性改成true。 更改后的两个属性及其注释摘录如下: <!- Get the flag indicating if the normal Java2 parent first class loading model should be used over the servlet 2.3 web container first model. -> <attribute name=”Java2ClassLoadingCompliance”>true</attribute> <!- A flag indicating if the JBoss Loader should be used. This loader uses a unified class loader as the class loader rather than the tomcat specific class loader. The default is false to ensure that wars have isolated class loading for duplicate jars and jsp files. -> <attribute name=”UseJBossWebLoader”>true</attribute> <!-

在eclipse工程中无法打印的原因

12.25.2009 by hewei - 0 Comment - 0
Posted in web相关技术
快逸报表加入eclipse工程中,发布后没法打印,点击打印没有反应。经测试后,发现报表应用在独立的demo是可以打印,只要放到eclipse工程里就不能打印。 解决办法 这个问题的原因是用户的eclipse工程里没有导入runqianReport4Applet这个负责打印的jar包。看似很简单但是很难发现, 因为eclipse目录里显示已经有这个包了。但是eclipse可能会没有导入工程,需要手动导入。对于这种情况的建议:不要只看eclipse目录里 有这个包就认为没问题了,应该到eclipse集成的应用服务器(比如tomcat)里的目录里确认是否有 runqianReport4Applet.jar包。
引自:报表工具知识库
原文链接: 快逸报表:在eclipse工程中无法打印的原因
相关文章:按宽度缩放在A4纸上打印; Web报表的打印方案后台批量打印报错vpn外网打印报表web报表的扩展功能
其他相关内容: 润乾商业智能解决方案商业智能BI联盟 ; Java报表 ; 报表工具

利用超链接传递下拉数据集的值作为参数

12.24.2009 by hewei - 0 Comment - 0
Posted in web相关技术
Web报表下拉数据集中的数据常常被当作参数来选择,然后再传递到用到参数的地方,在一般情况下,报表参数是通过参数表单传递的,但有的时候,参数是从超链接里传递过来的,那么超链接传递的过程该怎么实现呢? 在快逸报表中实现这个功能,需要分三步走: 第一步是制作一个下拉数据集 第二是获取下拉数据集的值 第三是通过超链接把获取到的值传递出去 第一步: 制作一个下拉数据集,并做一个超链接。 快逸报表设计器界面.PNG 设置B1单元格的填报属性-编辑风格为下拉数据集,如下图: 快逸报表下拉数据集设置.PNG B1的单元格变量名为param: 快逸报表变量名设置.PNG 设置B2单元格为超链接为调用JavaScript函数:javascript:getValue(),如下图: 快逸报表超链接设置.PNG 第二步: 需要建立一个jsp,这个jsp是为了展现下拉数据集报表用的。在此jsp上还要包含之前提到的javaScript函数,用来获取下拉数据集的值。 下拉数据集报表的jsp写法:(参考: \quieeReport\documents\zh\学习教程\应用开发\jsp–1.1.1.a.jsp)。 < script launguage=”javascript”> function getValue(){ var B1Vlalue = document.all['report1_B1′].value; //获取B1单元格的值 window.location.href=”test1.jsp?param=”+B1Vlalue; //超链接至test1.jsp } < /script> 第三步: 建立一个上面提到的test1.jsp,这个jsp的作用是用来展现从超链接传递过来的参数。 test1.jsp的写法: < %@ page contentType=”text/html;charset=GBK”%> < %@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report”%> < html> < head> < title>例子jsp< /title> < /head> < body> < % String param = request.getParameter( “param”); //通过request取超链接中的参数 out.println(”传递过来的参数是:”+param); //展现到页面中 %> < /body> < /html> 在页面上展现的效果: 1.选择下拉数据集数据的界面: 快逸报表超链接传参前效果.PNG 2.传参后的效果展示界面: 快逸报表超链接传参后效果.PNG 例子中仅仅是把传递过来的参数用jsp作了简单的展现处理,实际应用中jsp文件是发布报表的载体,jsp接受到的参数会被传到报表中作相应的计算并最终展现相应的报表,如接受的参数为”颖静”报表就会自动计算并显示”颖静”的相关信息。 通过超链接传参,简单灵活,调试方便。在一些参数表单和主报表不在一张jsp上的时候,用参数池的方式取参数会比较繁琐,用超链接的方式可以轻而易举的把参数通过地址栏传递到目标jsp,再通过目标jsp获取参数,用不同的方法实现了同样的传参功能。 附注:参数传递的方法教程:设计器-帮助-学习教程-应用开发教程-2.1.2 参数

快逸报表用自定义函数实现字符串的特殊转化

12.23.2009 by hewei - 0 Comment - 0
Posted in web报表应用
快逸报表提供了大量的内置函数,但是再多的函数也无法完全满足五花八门的业务需求,于是快逸提供了丰富的二次开发接口,以便让报表用户自己来自定义函数,通过自定义函数来轻松方便的解决web报表业务问题,下面就是一个利用自定义数据集运算函数实现特定功能的例子。 需求如下: 使用自定义函数需求图.png 下图所对应的是创建报表模版: 快逸报表模版.png 对应的实现效果图: 自定义函数实现效果图.png 实现思路: 1:A2扩展后就是一个字符串,把字符串传入数据集函数,代码中用split方法分解并放入String数组中。 2:将数据集中的字符串和值对应放入HashMap中。 3:遍历数组,如果数组中数据和HashMap中的key相等,则取出value值利用StringBuffer拼好返回值。 自定义函数的用法可以参照:快逸应用开发教程- 3.4.1 自定义函数介绍章节 本示例的自定义数据集运算函数代码如下: package com.runqian; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.runqian.base4.resources.EngineMessage; import com.runqian.base4.resources.MessageManager; import com.runqian.base4.util.ReportError; import com.runqian.report4.dataset.DataSet; import com.runqian.report4.dataset.DsValue; import com.runqian.report4.dataset.Group; import com.runqian.report4.model.expression.DSFunction; import com.runqian.report4.model.expression.Expression; import com.runqian.report4.model.expression.Variant2; import com.runqian.report4.usermodel.Context; public class CharZhuan extends DSFunction { @Override public Object calculate(Context ctx, boolean isInput) { // TODO Auto-generated method stub if (this.paramList.size() < 1) { MessageManager mm = EngineMessage.get(); throw new ReportError(”paramater:” + mm.getMessage(”function.missingParam”)); } // 取得第一个参数,默认为表达式,需要把该表达式算出来,结果才是函数的参数值 Expression param1 = (Expression) this.paramList.get(0); if (param1 == null) { // 判断参数是否为空 MessageManager mm = EngineMessage.get(); throw new ReportError(”paramater:” + mm.getMessage(”function.invalidParam”)); } // 算出第一个参数值 Object result1 = Variant2.getValue(param1.calculate(ctx, isInput), false, isInput); System.out.println(result1.toString()); // 判断第一个参数值是否为空 if (result1 == null) { return null; } // 判断第一个参数值的数据类型 if (!(result1 instanceof String)) { MessageManager mm = EngineMessage.get(); throw new ReportError(”parameter:” + mm.getMessage(”function.paramTypeError”)); } Group group = null; DsValue cur = this.ds.getCurrent(); group = (Group) cur; DataSet ds = group.getDataSet(); int countRow = ds.getRowCount(); // 将码表的对应值放到hashmap中 Map map = new HashMap (); for (int i = 1; i <= countRow; i++) { int j = 1; //获得某位置的数据 map.put(ds.getData(i, j).toString(), ds.getData(i, j + 1) .toString()); } StringBuffer sb = new StringBuffer(); // 对第一个参数进行split分解. String[] str = ((String) result1).split(”-”); System.out.println(str[0] + str[1]); Set keySet = map.keySet(); //以下for循环为每个字符串找相应的汉字,并用-连接起来 for (int i = 0; i < str.length; i++) { //遍历HashMap找key与目标字符串相等的值 for (String key : keySet) { if (key.equals(str[i])) { //如果相当,则获得与key对应的value,append到StringBuffer中 sb.append(map.get(key)); sb.append(”-”); } } } return sb.delete(sb.length() - 1, sb.length()).toString(); } } 总结:通过上面自定义函数和对函数的调用就可以实现本文开头的特殊业务需求了,可见自定义函数功能的强大,然而本文中的例子也仅仅是自定义函数的一 个普通应用,快逸报表提供的普通函数和数据集运算函数的接口能够处理的业务需求远不止此,更强大更实用的功能还等待我们去尝试。

没有参数模板的参数报表

12.22.2009 by hewei - 0 Comment - 0
Posted in web报表应用
需求说明 快逸报表提供的参数模板例子通常都是分两张报表做的(如reportFiles\基础报表:参数报表.raq和参数报表_arg.raq),参数输入模板为一张报表,查询展现结果为另一张报表,然后通过showreport.Jsp文件把两个报表在一个页面中展现。 但是有些报表用户想在一个报表模板里就实现这两张报表的功能,快逸报表支持这样的方式吗? 本文就来介绍一下快逸报表是如何解决这个需求的。 大致思路 在报表中创建一个超链接按钮,点击按钮触发onClick()事件,然后onClick()事件中定义页面跳转的url,并且把参数和参数值添加到url中,通过onClick()事件实现页面的调转。 下面是具体的实现步骤: 1. 首先连接demo数据源,制作一张空白填报表 2. 创建一个数据集ds2,用于查询表单中的下拉数据集,数据集中的内容将被选择作为参数传递。sql语句:SELECT 订单.订单ID FROM 订单 在A2单元格中输入”选择订单ID”,创建一个查询连接,把C2单元格的数据类型设为html,输入”< a href=’#'>查询< /a>”。如下图: 快逸报表单表带查询参数和查询结果的制作过程 3. 设置B2单元格可写,并且为它设置的下拉数据集。勾选B2单元格填报属性中的”是否可写”,并且设置它的下拉数据集为刚才新建的数据集ds2,显示列为”订单ID”,数据列也为”订单ID”,如下图: 快逸报表单表带查询参数和查询结果的制作过程 4. 新建一个参数用于接收B2单元格选择的订单ID。新建参数”dingdan”,如下图: 快逸报表单表带查询参数和查询结果的制作过程 5. 新建一个数据集ds1,用于根据订单ID查询订单详细信息,sql语句:SELECT 订单.订单ID,订单.货主名称,订单.运货商,订单.货主地区 FROM 订单 WHERE 订单.订单ID =? 在SQL编辑器中增加一个参数”dingdan”,表格中填写如下: 快逸报表单表带查询参数和查询结果的制作过程 6. 到现在报表已经做完了,下面给单元格C2增加onClick()事件,在onClick事件中先取B2单元格的显示值,然后定义页面跳转的url。修改showReport.jsp,增加如下javascript代码 < script language=”javascript”> //给C2单元格定义onClick事件 document.getElementById(”report1_C2″).onclick=function() { //用document中提供的方法取B2单元格的显示值 var value=document.getElementById(”report1_B2″).innerText; //定义页面跳转的url,并且把参数和参数值添加到url中 window.location=”showReport.jsp?raq=baobiao.raq&dingdan=”+value; } < /script> 7. 启动设计器中内置的tomcat,在IE中浏览此报表。选择订单ID,然后点击”查询”,结果如下: 快逸报表单表制作查询参数和查询结果_浏览结果 需求到此解决完毕,以后再遇到类似的需求只在一张报表就实现参数模板功能的问题就可以根据本文的做法去解决了。