图 24. 数据集参数绑定
至此,nested table的创建过程完成,我们可以通过选择preview视图查看报表的输出结果如图25所示。
图 25. 程序执行结果
4.2 使用Scripted Data Sets
本小节中将介绍如何使用两个Sripted Dataset实现nested table。 仍然以customer和order为例,并以CustomerName作为关联外键。
第一步创建数据集。 首先创建一个Scripted Data Source,然后以此创建两个数据集CustomerSet和OrderSet,在CustomerSet中创建两列CustomerNo和 CustomerName,在OrderSet中创建三列OrderSet、Content和CustomerName。 最后为OrderSet创建一个DataSet Parameter CName,Data Type为String,Direction为Input,Default Value为任意整数,如图26所示。
图 26. OrderSet的数据集参数CName
第二步在报表界面上创建外层表(OuterTable)和内嵌表(InnerTable),并设置与其绑定的Dataset分别为CustomerSet和OrderSet,步骤与4.1小节类似。 然后为InnerTable创建Dataset parameter binding,设置参数CName的value为row[“CustomerName”]。
由于我们使用的是Scripted Data Set,因此在本例中我们需要使用Birt Sript构造一些数据,并实现数据集的数据获取。 首先,在报表的beforeFactory方法中构造数据,代码如下所示。
报表的beforeFactory方法
importPackage( Packages.java.util ); importPackage( Packages.java.lang ); var outerMap = new Hashtable(); var innerMap = new Hashtable(); var customer = new Array(2); for(var i=0;i<2;i++) { var array = new Array(2); array[0] = \
array[1] = \ customer[i] = array; }
outerMap.put(1, customer[0]); outerMap.put(2, customer[1]); var order = new Array(5); for(var i=0;i<5;i++) {
var array = new Array(2); array[0]=i;
array[1]=\ order[i]=array; }
var orderList1 = new ArrayList(); orderList1.add(order[0]); orderList1.add(order[1]);
var orderList2 = new ArrayList(); 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(\reportContext.setPersistentGlobalVariable(\
然后,为CustomerSet和OrderSet添加script代码。
CustomerSet的open方法代码如下所示。
CustomerSet的open方法
outerMap = reportContext.getPersistentGlobalVariable(\iter = outerMap.entrySet().iterator();
CustomerSet的fetch方法代码如下所示。
CustomerSet的fetch方法
if( iter.hasNext() ) {
customer = iter.next().getValue(); row[\row[\return true; } else {
return false; }
OrderSet的open方法代码如下所示,其中inputParams[“CName”]就表示了绑定的Detaset parameter CName的值。
OrderSet的open方法 i = 0;
customerName = inputParams[\
iMap = reportContext.getPersistentGlobalVariable(\orderList = iMap.get(customerName);
OrderSet的fetch方法如如下所示。
OrderSet的fetch方法
if (orderList == null) return false;
if (i < orderList.size()) { order = orderList.get(i);