九、BIRT嵌套报表以及参数的传递
9.1 表内的嵌套
我们新建报表MasterDetailOneReport_A.rptdesign,空白模板,示例数据库,sql选择查询数据集。
新建数据集Orders:
select *
from orders
新建数据集SingleOrderDetail
select *
from orderdetails
where ordernumber = ?
数据集参数默认值为10101。
新建静态文本报表参数ordernumber,默认值:10101
在报表编辑器中插入2行5列的表,在第一行分别拖入Orders数据集中如下的数据列:
合并第二行的前四列,在第五列中插入一个1行5列的表,分别拖入SingleOrderDetail的数据集:
作适当的美化,布局,最终如下:
选中表,编辑数据集绑定:
绑定数据集SingleOrderDetail参数至row["ORDERNUMBER"]
这样就完成了一个内嵌的报表,预览如下:
9.2 表外的嵌套
同上例子,我们新建报表MasterDetailOneReport_B.rptdesign,空白模板,示例数据库,sql选择查询数据集。
新建数据集Orders:
select *
from orders
新建数据集SingleOrderDetail
select *
from orderdetails
where ordernumber = ?
数据集参数默认值为10101。
新建静态文本报表参数ordernumber,默认值:10101
我们插入两个2行1列的网格:
第一个网格,第一行插入文本:
这个案例用于描述怎么从一个数据项,外嵌产生另一个报表,传入一个参数,方法如下:
reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]);
dataSetRow["ORDERNUMBER"]
第二行插入一个1行5列的表,分别拖入Orders数据集的数据列:
其中ordernumber数据项用的表达式生成器,输入
reportContext.setGlobalVariable("ordernum", dataSetRow["ORDERNUMBER"]);
dataSetRow["ORDERNUMBER"]
第二个网格,第一行输入文本:
这个表格用于从环境标量中获取参数,用于表的数据集的参数,方法如下:
reportContext.getGlobalVariable("ordernum");
第二行插入1行5列的表,分别拖入SingleOrderDetail数据集的数据列:
编辑表的绑定:
输入表达式生成器文本:reportContext.getGlobalVariable("ordernum");
预览,效果如下:
9.3 参数的传递
一、第一种方法:
1、在jsp的URL里面添加所要传递的参数:
http://localhost:8080/birt-web/frameset?__report=test.rptdesign&sample=parameter
2、在报表当中添加同名报表参数sample,数据集带有占位符参数,然后可以添加data set参数关联到报表参数sample,这样data set参数就可以得到从jsp页面传递过来的参数从而作为查询条件。
二、第二种方法:
1、在jsp的URL里面添加所要传递的参数:
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中通过AppContextKey和AppContextValue键值对来传递,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):
如果参数中被添加了括号,则需要更复杂的处理,比如去掉前后方括号:
BirtStr.trim(unescape(params["trandate"].value).replace("[","").replace("]",""))
至于脚本的书写,后文再详细介绍。