九、BIRT嵌套报表以及参数的传递

9.1 表内的嵌套

我们新建报表MasterDetailOneReport_A.rptdesign,空白模板,示例数据库,sql选择查询数据集。

新建数据集Orders:

select *

from orders

新建数据集SingleOrderDetail

select *

from orderdetails

where ordernumber = ?

数据集参数默认值为10101。

新建静态文本报表参数ordernumber,默认值:10101

在报表编辑器中插入25列的表,在第一行分别拖入Orders数据集中如下的数据列:

九、BIRT嵌套报表以及参数的传递

合并第二行的前四列,在第五列中插入一个15列的表,分别拖入SingleOrderDetail的数据集:

九、BIRT嵌套报表以及参数的传递

作适当的美化,布局,最终如下:

九、BIRT嵌套报表以及参数的传递

选中表,编辑数据集绑定:

九、BIRT嵌套报表以及参数的传递

绑定数据集SingleOrderDetail参数至row["ORDERNUMBER"]

九、BIRT嵌套报表以及参数的传递

这样就完成了一个内嵌的报表,预览如下:

九、BIRT嵌套报表以及参数的传递

9.2 表外的嵌套

同上例子,我们新建报表MasterDetailOneReport_B.rptdesign,空白模板,示例数据库,sql选择查询数据集。

新建数据集Orders:

select *

from orders

新建数据集SingleOrderDetail

select *

from orderdetails

where ordernumber = ?

数据集参数默认值为10101。

新建静态文本报表参数ordernumber,默认值:10101

我们插入两个21列的网格:

第一个网格,第一行插入文本:

这个案例用于描述怎么从一个数据项,外嵌产生另一个报表,传入一个参数,方法如下:

reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]); 

dataSetRow["ORDERNUMBER"]

第二行插入一个15列的表,分别拖入Orders数据集的数据列:

九、BIRT嵌套报表以及参数的传递

其中ordernumber数据项用的表达式生成器,输入

reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]); 

dataSetRow["ORDERNUMBER"]

九、BIRT嵌套报表以及参数的传递

第二个网格,第一行输入文本:

这个表格用于从环境标量中获取参数,用于表的数据集的参数,方法如下:

reportContext.getGlobalVariable("ordernum");

第二行插入15列的表,分别拖入SingleOrderDetail数据集的数据列:

九、BIRT嵌套报表以及参数的传递

编辑表的绑定:

九、BIRT嵌套报表以及参数的传递

输入表达式生成器文本:reportContext.getGlobalVariable("ordernum");

九、BIRT嵌套报表以及参数的传递

预览,效果如下:

九、BIRT嵌套报表以及参数的传递

9.3 参数的传递

一、第一种方法:

1、在jspURL里面添加所要传递的参数:

http://localhost:8080/birt-web/frameset?__report=test.rptdesign&sample=parameter

2、在报表当中添加同名报表参数sample,数据集带有占位符参数,然后可以添加data set参数关联到报表参数sample,这样data set参数就可以得到从jsp页面传递过来的参数从而作为查询条件。

二、第二种方法:

1、在jspURL里面添加所要传递的参数:

http://localhost:8080/birt-web/frameset?__report=test.rptdesign&id=3

2、在报表当中添加同名报表参数id 

3、点击 Date Sets,在点中间的"Script"标签,选择BeforeOpen,写上

var id = params["id"].value;

if(id!=null){

this.queryText=this.queryText+" where id='"+id+"'";

}

三、第三种方法:

BIRT VIEWER本身虽然支持在里面书写java code,但不宜用于request setParameter,getParameter,或者session的方法,但提供了一个接口在jsp或者servelet中通过AppContextKeyAppContextValue键值对来传递,BIRT viewer能自动识别出。

Map<String, String> map=new HashMap<String, String>();

String name=request.getParameter("name");

String stime =request.getParameter("stime ");

String age=request.getParameter("age");

String sex=request.getParameter("sex");

HashMap appContext = new HashMap( );

appContext.put("stime",stime);

appContext.put("name",name);

appContext.put("age",age);

appContext.put("sex",sex);

request.getSession().setAttribute( "AppContextKey","numberWhere");

request.getSession().setAttribute("AppContextValue", appContext);

request.getRequestDispatcher( "/frameset?__report=testreport.rptdesign").forward(request,response);

report中用beforeOpen中取出即可:

var name=numberWhere.get("name");

var age=numberWhere.get("age");

var sex=numberWhere.get("sex");

说明:前两种,当传递中文参数的时候,可能会出现字符串长度超限,或者传递了encode之后的代码,这个时候需要进行如下的处理unescape(params["OrderNumber"].value):

九、BIRT嵌套报表以及参数的传递

如果参数中被添加了括号,则需要更复杂的处理,比如去掉前后方括号:

BirtStr.trim(unescape(params["trandate"].value).replace("[","").replace("]",""))

至于脚本的书写,后文再详细介绍。