作为Eclipse图表工具Birt的使用技巧(一)的后续,上一篇主要说明了Birt报表创建和使用的基本步骤和过程,本文旨在介绍一些常用的技巧,都是比较实用而且经过我本人实践可行的,希望能给需要的人带来一些帮助.
1. 报表参数传递
参数传递的应用场景比较广泛,在Birt设计器中有两个位置涉及到参数,一个是DataSet数据集创建的时候,有一个Parameters选项,另外就是在Data Explorer中有一个Report Parameters,这里主要介绍后者.因为Birt参数的对外接口就是Report Parameters,数据集中的参数也要通过这个报表参数去设置.
首先新建一个报表参数,如图:
这里创建一个默认名称的参数,其中Display type表示这个参数的显示类型,与它边上的hidden选项对应,如果hidden不打勾,说明这个参数会以Birt默认的View界面的形式表现.可以是多种形式,就是弹出一个窗口,要用户输入,这不符合项目的需要,所以通常我们将参数hidden.如下:
这时创建好了参数,说一点,这个参数的可作用范围是整张报表的rptdesign文件,在可以输入脚本和表达式的地方都可以通过params["NewParameter"].value使用.上面hidden复选框上面还有一个Is Requeired选项,如果勾选,意味必须要传递这个参数,否则报表会出错.
现在用这个参数,动态的改变一下数据集合,参数传递主要涉及几个问题,一个是URL传参,一个是同request传参,这是主要的两种传参方式,都会说明一下.
下面列出主要代码,分别书写在jsp页面(可以跳转到报表页)和数据集的脚本页.
jsp页面:
<a href="javascript:fun()">View Report (reports/demo_report1.rptdesign)</a>
<script>
var str =
"<%=basePath%>"+"frameset?__report=reports/report1.rptdesign&__format=HTML&NewParameter='";
str = str + escape(encodeURI("二十五味地黄金刚大力丸")) + "'";
function fun(){
window.location = str ;
}
</script>
DataSet Script页面:
importPackage(Packages.java.lang);
var sample = java.net.URLDecoder.decode(params["NewParameter"].value,"UTF-8");
System.out.println("-----------------------" + sample + "-----------------------");
if(sample == null){
this.queryText +=" where ITEM_NAME= '治糜康栓'";
System.out.println("-----------------------" + this.queryText + "-----------------------");
}
else {
this.queryText +=" where ITEM_NAME=" + sample ;
}
上面就是URL地址栏传参的方式,在Script引入lang包是为了在控制台可以通过System.out进行输出,因为Birt内置脚本不支持alert等一些调试方法.它可以混合Java和Javascript脚本同时使用.
同时需要注意的是,URL传参会受到大小的限制,它和form表单的get提交时同一个道理.另外如果参数是中文需要进行特殊的函数处理,比较麻烦.
jsp页面:
<%
request.getSession().setAttribute("NewParameter","二十五味鬼臼丸");
%>
DataSet Script页面:
importPackage(Packages.java.lang);
importPackage(Packages.javax.servlet.http);
var request = reportContext.getHttpServletRequest();
var sample = request.getSession().getAttribute("NewParameter"));
System.out.println("-----------------------" + sample + "-----------------------");
if(sample == null){
this.queryText +=" where ITEM_NAME= '治糜康栓'";
System.out.println("-----------------------" + this.queryText + "-----------------------");
}
else {
this.queryText +=" where ITEM_NAME=" + sample ;
}
这里我是通过request的Session进行传递的参数,request也支持其他的方式.这种方式传参没有长度限制和中文转码的要求.
2. 报表维度动态变换
维度变化的应用场景在项目中应该也是比较多的,比如一个柱图根据用户下拉列表的选择不同,根据不同的维度统计一个度量.
如果按照Birt之前的做法需要为每个维度制作一个报表,这明显不符合我们的需要.这个功能之前在网上没有找到具体的资料,尝试过通过Birt Char API和图表表达式拼凑的种种方式,最后试验出现在通过数据集计算列这种方式实现,大家也可以自己尝试下别的方法.
继续用之前的报表文件,修改它的数据集,定义一个计算列,这个列通过参数不同,绑定不同的真实列.如图:
例子写的比较简单,如果传入的参数是1,那么这个计算的列的实际值就是ITEM_CLASS否则就是CLASS_ON_MR.最后数据集中如图:
数据集修改完毕,现在去修改Cube,在Cube里我们实际上需要的是dimension_parma这个维度,但是必须要将所有涉及到的维度,就是这个dimension_parma条件中包含的维度都加入到cube的维度中.如下:
现在Cube修改完毕,去修改图表里面的数据绑定.直接将dimension_parma绑定到X轴.如图:
现在测试一下,使用最简单的URL传参所以部署一下,将项目发布到Tomcat,访问结果如下:
首先传入参数值为1
改变,传入参数值为2
这样就可以实现同一张报表,根据参数不同,显示不同维度的结果,同样的操作除了图表,还适用于交叉表格,这里就不演示了.
3. 报表钻取
BIRT的钻取说白了就是网页上的超链接,点击链接会出现另一个页面而已,而需要注意的就是它可以以当前报表上的数据为查询条件进行查询,并在下一个页面中进行显示。
说明其步骤分为如下两步:
一、 准备两张报表,当然两个报表某些地方是需要有关联关系的.
我准备了两张报表,1是告警种类的统计信息,其参数为别为起始时间与结束时间。2是统计信息的明细信息,其参数为超时间、结束时间及主机名称。两个报表是通过报表1的主机名及输入报表的起止时间为关联进行关联的。
二、 为两张报表建立关联关系.
1、 选择要关系的数据字段并在属性编辑器中选择‘超级链接’。
2、 点击编辑,在弹出的对话框中选择钻取功能。
3、 在‘第1步’中选择报表文件。
4、 确定后在在下面的‘报表参数’处会变成白色,在参数下的第一行单击鼠标左键会出现下拉列表,在其中选择要使用的参数,要注意的是有的版本只能逐行的这么点击,点击其它地方是没有反应的。
5、选择好参数后点击值处会变成如下形式,点击出现的按钮为参数设值,如果没有为参数设置必须的值那么点击主页面的链接后会弹出报表2的参数输入框要求输入必须的参数。
5、 在弹出的表达式生成器中的类别会有可供选择的几个大类型,一般我用的是头两个,其中第一个是主报表用的数据集中可用的数据,如下图所示,第二个是报表参数,就是主报表中输入的参数。
6、 这是我设置好的参数,确定后报表的链接部分便结束了。
最后发两张报表的运行效果图。
1、这是主报表,告警数量后会进行钻取。
2、这是钻取后显示的页面。
上面就是报表钻取的方式,这里的超链接也可以设置在图表的Format Chart这个部分,这里有交互的相关设置.
因为页面大小篇幅限制的原因,本文就先介绍参数传递,维度变换和报表钻取三个技巧,另开一篇Eclipse图表工具Birt的使用技巧(三)继续介绍,未完待续.
来源:oschina
链接:https://my.oschina.net/u/723632/blog/194704