Birt 报表参数的使用.docx
- 文档编号:7183585
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:30
- 大小:698.01KB
Birt 报表参数的使用.docx
《Birt 报表参数的使用.docx》由会员分享,可在线阅读,更多相关《Birt 报表参数的使用.docx(30页珍藏版)》请在冰豆网上搜索。
Birt报表参数的使用
Birt报表参数的使用
2007年9月27日
Birt是一款非常流行的开源报表开发工具。
本文总结了Birt报表中参数机制,并结合实例详细地阐述了参数的各种使用方法,最后介绍了Birt报表的源代码级使用。
以期为Birt报表使用者提供一个有益的参考。
序言
参数是birt提供的一种很重要的机制,在birt中,参数具有变量的作用,它为birt报表的生成提供了一种灵活强大的机制。
本文基于Birt2.1.2讲述Birt报表中一些重要的用法以及birt源码级的参数使用机理,为报表开发者以及报表应用程序开发者提供一个参考。
本文的示例是基于BirtRCPdesigner2.1.2开发的,在阅读本文前,最好有eclipse相关经验,并且已经能够使用Birt插件制作一些简单报表,并了解Birt报表的一些基本概念,比如DataSource(数据源),DataSet(数据集)等。
基本报表制作过程可见developerworks相关文章"BIRT:
基于Eclipse的报表"。
本文示例使用Birt自带的Sample数据源,用到的数据基于图1所示的实体关系模型。
从这个模型中可以看出,文中示例用到三张数据库表分别为customers,orders和orderdetails。
其中customers表的customernumber字段作为外键出现在orders表中,而orders表的ordernumber字段做为外键出现在orderdetails表中。
图1.实体关系模型
1标量参数(Scalarparameter)
在使用BIRT参数的时候,首先要了解BIRT分为报表参数和数据集参数。
报表参数定义于整个报表内,而数据集参数定义于某个数据集(DataSet)中。
数据集参数使用的时候通常需要链接到某个报表参数或者利用绑定表(bindingtab)和一个嵌套表中的某个数据元素绑定。
标量参数是Birt报表中最简单也是最基本的一类参数,标量参数可以分为静态和动态两种,其中静态参数从用户界面获得用户输入的数据值,而动态参数则可以关联至某一个数据集,因此可以获得一个数据的集合,供用户选择。
下面分别介绍这两种参数。
1.1静态标量参数
右键点击Outline面板中的Reportparameter选项,在弹出的上下文菜单中点击“Newparameter”,弹出图2所示编辑参数对话框,在name域输入参数的名字,本例中使用的参数名字为“customernum”,此时Listofvalue项默认为static。
点击OK后返回到开发主界面。
图2.编辑参数
接下来定义DataSet。
DataSet定义的对话框如图3所示。
在这个对话框中首先定义“Query”。
我们可以看出Where条件中的customernumber字段通过”?
”代表的参数传入参数值。
图3.数据集中的“查询”定义
点击”Parameter”,弹出在数据集中定义参数的对话框。
数据集中的参数需要链接至某一个报表参数。
在本例中将数据集参数链接至前面定义的报表参数customernum。
点击OK,我们就完成了数据集中参数的定义。
当报表运行时,Birt会使用由报表参数customernum传入的值填充where条件,生成结果数据集。
如图4所示。
图4.数据集中的“参数”定义
1.2动态标量参数
动态参数可以提供一个数据值的列表供用户选择,这种功能能够极大增强报表设计用户界面的交互性。
在本例中,我们首先定义一个数据集,这个数据集不使用参数,它从订单表中查询出所有的订单号,为报表参数提供一个数据值的列表。
如图5所示。
图5.数据集“ordernum”
接下来,我们定义报表参数,这个参数链接至前面的ordernum,因此可以根据数据集中的参数ordernum动态的获得可选值。
如图6所示。
图6.报表参数“ordernumpara”
如图中所示参数的displaytype选成ComoBox,Listofvalue选择为Dynamic,其链接至的DataSet选择为前面定义的ordernum数据集,同时选定Selectvaluecolumn为数据集ordernum中的某个字段,这里ordernum数据集只有一个字段,故选择为ordernumber。
这样就将报表参数和数据集参数关联起来。
但这不是我们的最终目的,我们的目的是以报表参数ordernumpara为中介,向另一个数据集提供参数。
因此,我们定义图7所示的数据集。
图7.数据集“ordersdetail”
点击“Parameter”项,进入数据集参数定义界面,如图8所示。
图8.将数据集内的参数连接至报表参数“ordernumpara”
将本数据集的参数num链接至ordernumpara,就完成藉由一个报表参数为中介将一个数据集的字段值链接到另一个数据集的参数的功能。
2CascadingParameter
除了使用动态报表参数提供数据值的选择列表,报表开发过程中用户经常需要用到互相关联的参数。
比如要选择某个客户的某个订单号标识的所有订单的内容,用户并不愿意列出所有可能的订单号,比较理想的情况是给出一个客户编号的选择列表,根据这个列表的内容再给出每个客户的所有订单号的列表,这样用户就可以选择相应的客户对应的某个订单号,从而查询出此客户的这个订单号标识的所有订单的详细内容。
Cascadingparameter一方面增强了报表逻辑的功能;另一方面,通过将一部分应用逻辑转移到界面操作上,进一步降低了报表内部逻辑和SQL查询语句的复杂性。
首先定义一个customer数据集,这个数据集包含customernumber和customername两个字段。
如图9所示。
图9.数据集“customer”
接着定义一个名字为orders的数据集,如图10所示。
图10.数据集“orders”
在“Orders”数据集中使用一个数据集参数,这个数据集参数将要引用接下来将要定义的层叠参数中customer参数。
定义了以上数据集之后,我们就可以来定义层叠参数了。
右键点击Outline面板中的Reportparameter选项,在弹出的上下文菜单中点击“NewCascadingParameter”,弹出以下对话框,在CascadingParametername域输入参数的名字,本例中使用的参数名字为“custorder”,DataSetModel选择为MultiDataSet。
在紧接着的Parameters表中定义一个名为customer的参数,并将其关联至customer这个数据集,其取值为customer数据集中的customernumber字段,这样customer这个层叠参数的取值就是一个customernumber的列表。
Customer此时也成为一个动态参数。
如图11所示。
图11.层叠参数定义1
完成customer的定义后,我们紧接着定义另一参数order,方法和定义customer相同,最后order参数和数据集orders关联,其取值为orders数据集中的ordernumber字段。
由于数据集orders的局部参数需要和前面定义的customer参数关联后才能产生数据结果集合,因此,在下一步将数据集orders与参数customer完成关联后,order这个层叠参数也将成为一个动态参数,它也成为一个数据值的选择列表,这个列表的值是由某个customernumber决定的所有可能的订单号。
如图12所示。
图12.层叠参数定义2
接下来将orders数据集中的参数param1关联至层叠参数customer,如图13所示。
图13.关联数据集“orders”中的参数至层叠参数“Customer”
最后,定义生成报表的数据集orderdetail,如图14所示。
图14.数据集“orderdetail”
然后将其局部参数param1关联至层叠参数order,如图15所示。
这样我们就完成了具有Cascadingparameter功能的数据集的定义。
图15.关联数据集“Orderdetail”中的参数至层叠参数“Order”
从主开发界面中将orderdetail数据集拖拽到主开发面板上就完成了这个简单的报表的制作。
见图16
图16.层叠定义完成后的主开发界面
点击preview,会弹出如图17所示对话框。
从这个对话框中我们可以看到层叠参数customer的数据是customers数据库表中的所有客户,选定一个客户后,层叠参数order的列表将只出现客户TechnicsStoreInc的所有订单,选择其中一个订单后,就会从orderdetail数据表中选出这个订单号标识的所有订单的详细内容。
图17.层叠参数用户界面
3ParameterGroup
在某些情况下,在创建报表的时候需要提供大量的参数,为了在界面上更加有效地对这些参数进行组织,BIRT提供了parametergroup的功能。
用户可以使用parametergroup将相关的parameter组织在一起。
Parametergroup的使用比较简单。
首先需要创建一个parametergroup。
在outline视图中用鼠标右键点击reportparameters标签并选择newparametergroup。
创建完parametergroup后便可以为其创建parameter。
为一个parametergroup创建parameter有两种方式。
一种方式是用鼠标右键点击parametergroup标签并选择newparameter创建新的parameter;另一种方式是将已有的parameter添加入parametergroup,只需要使用鼠标将所需要的parameter拖拽入parametergroup中。
如图18所示是parametergroup的一个例子。
图18.ParameterGroup示例
4使用parameter实现nestedtables
前面的例子展示了如何将BIRT中的reportparameter与datasetparameter进行binding。
作为BIRTparameter的另一个例子,我们下面通过介绍datasetparameter与datacolummn的binding实现nestedtables。
本节将通过JDBCDataset和ScriptedDataset分别介绍实现过程。
Nestedtable主要用于存在外键关联的两个或几个表。
比如customer与order是1:
N的关系,order表中存在外键custmernumber。
有些时候,我们要将customer与相应order的信息一起进行展现,这时就需要使用nestedtable。
4.1使用JDBCDataSets
首先,在Birt数据源的基础上创建两个数据集CustomerSet(OuterSet)和OrderSet(InnerSet)。
CustomerSet用于获取所有Customer的信息,在layout视图下右键点击“DataExplorer”中的“DataSets”图标并选择“NewDataSet”,选择数据源并填写DataSet名称为CustomerSet;然后点击next填写数据源的query语句。
OrderSet用于获取指定Customer的Order信息,与CustomerSet的创建过程类似。
由于OrderSet作为内嵌表,需要关联参数CumtomerNumber,因此需要在创建OrderSet的时对查询语句提供where子句“whereCLASSICMODELS.ORDERS.CUSTOMERNUMBER=?
”。
CustomerSet和OrderSet的创建过程如图19,20所示。
图19.数据集CustomerSet
图20.数据集OrderSet
然后为其创建相应的datasetparameter,在“DataExplorer中”双击OrderSet,创建一个datasetparameter名称为CNo,设定其DataType为integer,DefaultValue为任意整数,如图21所示。
图21.数据集参数Cno
在创建好数据集的基础上,我们就可以在报表界面上面创建nestedtable了。
首先创建显示一个customer信息的外层OurterTable,编辑OuterTable的DataBinding并设置与其绑定的DataSet为CustomerSet,然后在OuterTable中并添加需要显示的字段信息并为nestedtable预留一个空白列。
如图22所示。
图22.外层表示意图及数据集绑定
下一步在OuterTable中空白列的detail行中创建显示order信息的InnerTable,设置与其绑定的DataSet为OrderSet,并添加需要显示的字段,如图23所示。
最后为InnerTable创建DataSetparameterbinding,在InnerTable的DataBinding对话框中点击“DatasetParameterBinding”按钮,设置参数CNo的value是row[“CUSTOMERNUMBER”],如图24所示。
图23.内嵌表
图24.数据集参数绑定
至此,nestedtable的创建过程完成,我们可以通过选择preview视图查看报表的输出结果如图25所示。
图25.程序执行结果
4.2使用ScriptedDataSets
本小节中将介绍如何使用两个SriptedDataset实现nestedtable。
仍然以customer和order为例,并以CustomerName作为关联外键。
第一步创建数据集。
首先创建一个ScriptedDataSource,然后以此创建两个数据集CustomerSet和OrderSet,在CustomerSet中创建两列CustomerNo和CustomerName,在OrderSet中创建三列OrderSet、Content和CustomerName。
最后为OrderSet创建一个DataSetParameterCName,DataType为String,Direction为Input,DefaultValue为任意整数,如图26所示。
图26.OrderSet的数据集参数CName
第二步在报表界面上创建外层表(OuterTable)和内嵌表(InnerTable),并设置与其绑定的Dataset分别为CustomerSet和OrderSet,步骤与4.1小节类似。
然后为InnerTable创建Datasetparameterbinding,设置参数CName的value为row[“CustomerName”]。
由于我们使用的是ScriptedDataSet,因此在本例中我们需要使用BirtSript构造一些数据,并实现数据集的数据获取。
首先,在报表的beforeFactory方法中构造数据,代码如下所示。
报表的beforeFactory方法
importPackage(Packages.java.util);
importPackage(Packages.java.lang);
varouterMap=newHashtable();
varinnerMap=newHashtable();
varcustomer=newArray
(2);
for(vari=0;i<2;i++){
vararray=newArray
(2);
array[0]=""+i;
array[1]="customer_"+i;
customer[i]=array;
}
outerMap.put(1,customer[0]);
outerMap.put(2,customer[1]);
varorder=newArray(5);
for(vari=0;i<5;i++){
vararray=newArray
(2);
array[0]=i;
array[1]="order_"+i;
order[i]=array;
}
varorderList1=newArrayList();
orderList1.add(order[0]);
orderList1.add(order[1]);
varorderList2=newArrayList();
orderList2.add(order[2]);
orderList2.add(order[3]);
orderList2.add(order[4]);
innerMap.put(customer[0][1],orderList1);
innerMap.put(customer[1][1],orderList2);
reportContext.setPersistentGlobalVariable("outerMap",outerMap);
reportContext.setPersistentGlobalVariable("innerMap",innerMap);
然后,为CustomerSet和OrderSet添加script代码。
CustomerSet的open方法代码如下所示。
CustomerSet的open方法
outerMap=reportContext.getPersistentGlobalVariable("outerMap");
iter=outerMap.entrySet().iterator();
CustomerSet的fetch方法代码如下所示。
CustomerSet的fetch方法
if(iter.hasNext()){
customer=iter.next().getValue();
row["CustomerNo"]=customer[0];
row["CustomerName"]=customer[1];
returntrue;
}else{
returnfalse;
}
OrderSet的open方法代码如下所示,其中inputParams[“CName”]就表示了绑定的DetasetparameterCName的值。
OrderSet的open方法
i=0;
customerName=inputParams["CName"];
iMap=reportContext.getPersistentGlobalVariable("innerMap");
orderList=iMap.get(customerName);
OrderSet的fetch方法如如下所示。
OrderSet的fetch方法
if(orderList==null)
returnfalse;
if(i order=orderList.get(i); row["OrderNo"]=order[0]; row["Content"]=order[1]; row["CustomerName"]=customerName; i++; returntrue; } else returnfalse; 至此,使用Scripted数据源的nestedtable的创建过程完成,我们可以通过选择preview视图查看报表的输出结果如图27所示。 图27.程序执行结果 5源代码级的参数使用 对于报表应用程序开发者而言,有时他们需要在源码一级控制报表参数。 接下来我们将讲述birt报表在源代码一级是怎样处理报表参数的。 下面的程序片段是使用birt提供的API进行应用程序开发的一个基本框架,如果想获得更加详细的内容,请参考BirtAPI的源代码。 清单1主要是进行报表引擎的设置和初始化,其主要目的是将BirtHome设置为Birtruntime下ReportEngine的安装目录。 清单1 //创建一个报表引擎配置对象 EngineConfigconfig=newEngineConfig(); //设置BIRT报表引擎的安装路径 config.setEngineHome("C: /birt/"); 清单2就是打开一个报表设计文件。 报表设计文件就是指我们利用Birt报表开发工具开发的XML格式的,以.rptdesign为后缀的文件。 清单2 //创建一个报表生成引擎 ReportEngineengine=newReportEngine(config); //打开一个报表设计文件 IReportRunnabledesign=engine.openReportDesign("C: /temp/test.rptdesign"); 清单3、4、5是处理报表参数,清单6是创建生成报表的任务,清单7是将处理好的参数设置给报表。 清单8是进行一些输出选项的设置,比如生成什么格式(pdf,html等)的报表,结果输出到哪里(文件,输出流等),最后就是运行生成报表。 其中清单3、4、5负责处理参数。 清单3使用前面一步创建的设计文件对象生成一个IGetParameterDefinitionTask类型的paramTask,paramTask调用getParameterDefns方法获得报表中所有参数的定义,注意这里参数使用false,其效果是将报表中的parametergroup扁平化,从而以标量的形式返回所有的参数。 这样可以将参数处理的复杂性进行封装,为应用程序开发者提供简单的使用接口。 清单4是属于用户定制的步骤,因此本文没有给出相关源码。 在这一步里,用户可以通过GUI对话框或者HTML表单动态的输入参数值,参数值一般存储到一个HashMap中。 清单5主要负责将第四步获得参数值赋给清单3中获取的参数定义。 这三部分合起来就构成了birtAPI中处理参数的主要步骤. 清单3 //以打开的报表设计文件为参数,创建一个获取参数的对象 IGetParameterDefinitionTaskparamTask=engine.createGetParameterDefinitionTask(design); //获取报表设计文件中的参数定义 Collectionparameters=paramTask.getParameterDefns(false); 清单4 接受由html表单或G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Birt 报表参数的使用 报表 参数 使用
![提示](https://static.bdocx.com/images/bang_tan.gif)