和使用Fields一样,parameters也需要在创建的时候定义它的数据类型。parameters的数据类型是标准的java的Object。
在ireport中,Parameters的机制是允许用户通过应用程序传递参数致报表当中。在jasperreort中的某个对象中的expression可以通过下面的语法来访问一个当前ireport中存在的parameter:
$P{parametername}。
如果应用程序没有为报表中定义的parameter赋值,那么parameter将会取我们在定义它的时候设置的defaultvalue的值。parameters是一个JavaObject,所以如果它的类型是Object类型,我们在其defaultvalue里写下面的表达式就是错误的:
0.123
你必须要创建一个Object,如:NewDouble(0.123)这种写法就是正确的。在查询中使用Parameters
Parameters可以用来做SQL查询的条件参数的传递。如果你想根据部门编号(dept_id)得到客户的详细信息(设计的时候我们是不知道这个部门编号的具体值是多少的).此时我们可以这样组织查询语句:
select*fromemployeewheredept_id=$P{deptId}
此时SQL查询引擎将会采用PreparedStatement来处理传入的deptId值以此作为查询条件参数。
如果你想直接通过parameter值来作为SQL语句的一部分,那么你可以使用下面的特殊语法:$P!{parametername}。这种写法允许你在查询时用parameter的值来替换parametername。例如,如果我们有一个参数名为MyWhere其值为:wheredept_id=D11,查询写法如下:
Select*fromemployee$P!{MyWhere}
查询时实际提交的字符串是:
Select*fromemployeewheredept_id=D11在程序里使用Parameters
在应用程序里,如果想把某个值传递到我们的报表中parameters时,我们可以把相关的值放入一个扩展java.util.Map接口类里,然后传入到ireport里。如下面的代码:
...
Maphm=newHashMap();
...
JasperPrintprint=
JasperFillManager.fillReport(fileName,hm,new
JREmptyDataSource());
fillReport是一个关键的方法,它允许你通过一个文件名,一个参数集来传递到我们要调用的报表当中。例-如通过下面的处理方法我们可以让一个处部的传入值作为我们报表的title。
下面的是一个例子:
a).声明一个parameter.这个parameter是java.lang.String类型,名字为:name_report:
b).将这个parameter拖到page中的titleband.修改上面的程序代码如下:
HashMaphm=newHashMap();hm.put(“name_report”,”reporttitle”);
...
JasperPrintprint=
JasperFillManager.fillReport(fileName,hm,
newJREmptyDataSource());
运行时效果如下:
一般情况下,我们不需要为报表中的每一个parameters传递一个值,除非某一个parameter一定要从外部程序传入时我们才需为一个parameter设
置一个值。如果一个parameter外部门程序没有为其赋值那么ireport将使用DefaultValueExpression来对一个parameter进行初始化,如果连DefaultValueExpression没有设置那么它的值就是null。
事实上,对于一个parameters我们不仅仅可以传递一个
String,Integer,Boolean等java中小的对象,同时我们还可以利用parameters来传递一些足够大足够复杂的对象,比如一个图像(java.awt.Image),或者通过一个parameters来为一个为子报表提供的datasource连接等。在用Map类型传递参数时我们要注意传递的参数要与report里的parameters类型保持一致,否则会抛出ClassCastException。
ireport内嵌的Parameters:
ireport提供了一些内建的parameters,这些parameters对于用户来说是只读的。内嵌的parameters列表如下:
参数名
说明
它是一个java.util.Map类型的对象,可以通过它来传给填充报表去填充报表里所有的parameters,在这
个参数里还包含用户定义的parameters.一个JDBC的Connection参数,报表可以根据传入的JDBCConnection来获到相应的数据为报表中的Connection提供一个DataSource。外部传入的时候类型也要是DataSource类型
REPORT_PARAMETERS_MAP
REPORT_CONNECTIONREPORT_DATASOURCE
报表生成时使用的Scriptlet实例,如果没有指定
REPORT_SCRIPT
LET
ScriptLet,那么这个parameters将使用
net.sf.jasperreports.engine.
JRDefaultScriptlet.
通过这个参数你可以控制分页功能是打开还是关闭。默认情况下,分页是打开的。但是如果导出为HTML
或EXCEL时不进行分页处理。
它被用来设置报表所处的地区。如果没有提供地区,
那么将采用系统默认的地区。
IS_IGNORE_PAGINATION
REPORT_LOCALE
REPORT_TIME_Z
ONEREPORT_RESOURCE_BOUNDLE
设置报表的时区,如果没提供的话采用系统默认的。
为报表指定要加载的资源文件,在国际化一章中介
绍了如何使用资源文件来构建报表。
同为比较常用的java报表生成工具,FineReport对参数的解读和使用方法与ireport有所不同,具体实现思路和步骤如下,供ireport使用者借鉴:
在大多数情况下,我们并不需要报表把数据库中所有的数据都呈现出来,而是要根据一些条件来过滤出我们想要的数据,这就是参数查询。
FineReport报表中就是使用参数来动态的过滤数据的,实现用户和数据的实时交互,如下图:
注:鼠标移至参数界面的中间区域会出现收缩按钮,折叠或展开参数查询界面。
如何实现参数查询
几乎所有的统计报表都会有类似上图的统计条件,传统的做法是使用如ext、html等编程实现,工作量大且维护成本高。
Finereport报表只需要通过参数的定义,添加参数控件绑定数据、参数过滤和参数面板样式三个步骤便可以轻松实现参数查询,零代码,维护简单。实现步骤
FR报表提供了参数界面的概念,让用户快速制作出参数表单界面,制作参数查询界面的步骤如下:
参数定义:设置参数名称,添加参数,根据实际情况的不同添加不同种类的参数,详细请查看参数的种类与区别。
添加控件绑定数据:FineReport参数查询,是在参数面板中添加控件,使控件名字与参数名称一样,通过该控件将其控件值传递给参数,实现动态修改参数值得效果,可为控件绑定数据,直接选择;
参数面板样式设定:设置参数界面中控件的位置,参数面板的位置,背景等等。
参数应用实例之URL给参数传递中文值
虽然我们建议模板名称、参数变量名称都用英文,但是对于中国式的复杂报表,参数肯定有中文情况。
使用ie浏览器通过url给参数赋值为中文时,会发现中文值会出现乱码,如下图所示
问题原因
因为浏览器编码与服务器编码不一致,导致中文url输入会产生乱码,无法被正常识别。
解决方案
通过url给参数赋值一般应用在报表已经集成到项目中,希望点击某个链接将某个值传递给报表;而在浏览器中直接给参数赋值呢,一般是做测试使用的,此时可以将浏览器换成火狐或者谷歌。
集成到项目中,可以使用FR.cjkEncode()方法,如点击某个链接给col赋值为地区,此时可以使用如下方法:
1.window.location=\"http://localhost:8080/WebReport/ReportServer?reportlet=doc/Parameter/DynamicCol/DynamicCol.cpt&col=\"+FR.cjkEncode(\"中文名称\")
因篇幅问题不能全部显示,请点此查看更多更全内容