BI最佳实践:BIRT直方图模型分解

来源:互联网 发布:js判断display属性 编辑:程序博客网 时间:2024/04/29 16:47
直方图是一种最普通也最易懂的报表模型,但这种模型会受页面宽度限制,比如X轴的系列值过多,无法在一排完全显示出来,有人会想到将X、Y轴做翻转,但这又太难看了,另外也有可能翻转后在一页里仍然显示不完,这时客户一般会想到,将一个图表放不下的数据折行显示,这样一直纵向地连续铺展下去,笔者当初只是有这样一个想解决这类问题的想法,晚上跳舞回来没事动手就实现了,我先把效果图贴上(注意我只设计一个直方图,并不是三个):

实现步骤如下(实验的业务模型是ORACLE里SCOTT模式的EMP员工表):
1、先把业务数据做一个分页数据集(1),即把已分组的数据进行分段,因为做过WEB或数据库开发的人都知道分页算法的原理,我就不赘述了(不了解的直接谷歌或SO.COM吧),将分段起点和终点设置成参数
附代码:
select rn, deptname, total_emps
  from (select t.*, rownum rn
          from (select deptno, deptname, count(*) total_emps
                  from SCOTT.S_EMP
                 group by deptno, deptname
                 order by deptno) t
         order by rn)
where rn between ? and ?

2、虚拟一个层级查询的数据集(2),这个查询的最大值是:最终你要折几次行完全显示的行数,比如每行放10个系列值,总共是100个系列组,那这个层级数据集的内容将是1,2,3……10;通过这个数据集你可能计算出(1)中的数据集分段起点和终点值,可做为另外两列假设为:N1和N2,比如第一段的起点、终点为1和10,第二段为11和20……,第10段为99和100
附代码:
select level n, 10 * (level - 1) + 1 n1, 10 * level n2
  from dual
connect by level <= (select ceil(count(distinct deptno) / 10) from s_emp)

3、插入一个表格,和数据集(2)绑定,再在明细里插入直方图,数据来源为数据集(1)

4、这时候因为数据集(1)是含参的,所以将分段起点和终点参数与数据集(2)的N1和N2对接,至此就基本完成了。

注意事项:
1、因为用到虚拟的层级查询数据集,所以数据库一定要支持层级查询,我很熟悉的ORACLE和POSTGRESQL均支持
2、数据集(1)查询里的排序应该和图表里系列值排序一致,这样防止分段错乱

总结:

这里用到的核心算法其实非常简单,一个简单的分页原理加上一个层级虚拟查询,但将二者在BIRT中结合便产生了一个BI的最佳实践,供大家参考。


birt用脚本javascript创建数据源,并从配置文件中读数据库信息

可以用script往解决第一个题目。
可以定义一个参数往指定properties文件的路径,然后创建datasource。
在datasource的script中编辑beforeOpen事件,参考下面的代码:

=======================================
importPackage( Packages.java.io );
importPackage( Packages.java.util );

fin = new java.io.FileInputStream( new String(params["propFile"]) );
props = new java.util.Properties( );
props.load(fin);

extensionProperties.odaURL = new String(props.getProperty("url"));
extensionProperties.odaDriverClass = new String(props.getProperty("driver"));
extensionProperties.odaUser = new String(props.getProperty("userid"));
extensionProperties.odaPassword = new String(props.getProperty("password"));

fin.close();

这样就可以从properties文件中动态读取数据源配置信息。

原创粉丝点击