由于篇幅所限,本篇承接上一篇Eclipse图表工具Birt的使用技巧(二)继续介绍Birt的小技巧.html
4. 公共数据源java
项目制做中,多个报表文件可能须要使用同一个DataSet,Cube,DataSource这些东西,若是为每个rptdesign文件都配置很麻烦,并且修改繁琐. 数据库
可使用一个Library文件,统一集中处理这些数据源.如今项目中新建一个Library文件,如图: 服务器
建立好的rptlibrary文件盒报表文件很像,咱们直接在这个文件上新建数据源和数据集还有多维数据集.这里不显示了,和正常的建立同样. 函数
建立完毕后,咱们返回到一个正常的报表rptdesign文件,在Library Explorer窗口中找到刚才建立的那个library文件.此时能够快速的将Datasource,DataSet,Cube添加到咱们的报表文件中.如图: 工具
右键你要添加到当前报表的项,而后Add to Report 便可.若是之后Liberty文件的这些数据源信息有改变,对应的各个文件中的数据源也会有变化.添加成功后,再看报表中的数据源显示以下: this
和正常报表本身建立的数据源会有区别. url
5. 针对排序出现错误的问题. spa
这种问题一般可能会出如今相似这种情景里,好比药品,如今作一个图表,显示按季度为维度,每一个季度添加的药品数量,或者按照月份为维度,显示对应药品添加数量. .net
通常来说在数据库中不会有一个单独的字段去存储月份或者季度这样的信息,而是有一个日期的字段记录全部的这些信息.这里咱们能够利用SQL语句,经过SQL函数生成咱们须要的月份和季度的列.也可使用更加简单的方式,在BIRT的DataSet中,经过Computed Columns计算出咱们须要的列.(推荐)
如今经过计算出的列,获得季度和月份的列,表达式部分如图:
月份表达式:
如此,将计算出来的列做为维度,建立Cube,而后制做图表,看到效果以下:
能够看到结果是1,3,2,4的排序,不是咱们但愿的1,2,3,4.一样这种问题在月份为维度的时候也存在.在使用交叉表的时候,也会遇到这个问题.
这个缘由多是和字符串的排序有关,这里作一些处理,规避掉这种错误的顺序,首先改变DataSet中季度那一列的表达式,以下:
而后将图表中,X轴绑定的表达式以下书写:
再来看结果以下:
这时显示是正确的了,经过对表达式的操做,能够实现不少咱们须要的功能.
6. Birt标签在JSP中的使用.
<birt:viewer> 会显示分页和报表头上导出等一些按钮, 此时是对应会有一个frameset.
<birt:report> 对应一个preview的模式,不会有分页和报表头的那些导出项.
<birt:param> 做为上面二者的子标签,能够传递参数.
在页面上方引入tld标签库,<%@ taglib prefix="birt" uri="/birt.tld" %>
这个很容易设置是否显示工具栏,大小的一些设定,同时省去了咱们额外在JSP页面中添加iframe.
大致上能够以下书写:
<birt:report id="r1" reportDesign="/reports/r1.rptdesign" isHostPage="false" position="static" width="1800" height="2000" format="html"> <birt:param name="param1" value="1"/> </birt:report>
7. 统一数据源链接,从properties文件中读取配置信息链接数据源
在Birt与SSH集成后,由于数据库是同一个,要从一个配置文件读取配置信息.以一个报表文件为例,若是要从配置文件读取信息并建立数据源链接,首先要建立一个数据源链接,能够直接建立一个Birt内置的示例数据库或者是JDBC数据库,都没有关系.而后选中数据源,点击脚本页,在beforeOpen上写入如下代码:
importPackage( Packages.java.io,Packages.java.util,Packages.java.net ); importPackage( Packages.javax.servlet.http ); req = reportContext.getHttpServletRequest(); propPath = new String("/WEB-INF/con_db.properties"); if ( propPath.charAt(0) != "/" ) { propPath = "/" + propPath; } url = req.getSession().getServletContext().getResource(propPath); if ( url != null ) { props = new java.util.Properties(); props.load( url.openStream() ); this.setExtensionProperty("odaURL", props.getProperty("url")); this.setExtensionProperty("odaDriverClass", props.getProperty("driver")); this.setExtensionProperty("odaUser", props.getProperty("username")); this.setExtensionProperty("odaPassword", props.getProperty("password")); }
这样就能够了,可是接下来使用,在报表设计工具中会有各类错误,数据集,立方体都没法根据这个数据源建立,也就没法设计图表.缘由是这里面对于properties文件的读取,只支持盘符文件夹的绝对路径,咱们这里经过reportContext上下文将其定位到WebRoot的相对路径下,可是req须要运行时环境,因此在设计的时候会有一系列错误.
解决的方法是,开发中咱们建立一个库文件,存放各个数据源和数据集立方体等,全部的报表引用这个库数据源链接,直接连服务器,报表设计开发完毕后,直接将库数据源转为读取properties文件便可.