需求描述
最近开发了一个BIEE分析报表,报表需求原型来自HFM,和BIEE的维度和度量的方式匹配不上。
解决方法
想了很多办法也无法用数据仓库的思维解决,最后只好采取比较极端的方式解决,即在后台将所有数据先计算好,BIEE的分析仅仅是作为展现使用。计算好的数据存放在Global Temporary 表中。
方法描述
创建会话级别的全局临时表
Global Temporary Table有两种类型,一种是会话级别,一种是事务级别,具体应用场景这里不多说了,在这里我们是创建会话级别的全局临时表,例如:
CREATE GLOBAL TEMPORARY TABLE test
(column1 varchar2(10),
....
column10 varchar2(10))
ON COMMIT PRESERVE ROWS;
创建准备报表数据的存储过程
在数据库里创建存储过程,存储过程的功能是将报表数据准备好,插入上一步创建的临时表中。利用这个存储过程,无论报表逻辑有多复杂都可以实现了。
设置资料库调用存储过程
设置步骤如下:
1 右键点击连接池,点击属性,进入连接脚本页签, 点击查询前执行部分的新建按钮
2 在物理sql处填写调用上一步准备好的存储过程
例如:
begin
cux_test(p_user => 'VALUEOF(NQ_SESSION.USER)');
fhfm_icp_prepare_data(p_entity_code => 'VALUEOF(NQ_SESSION.HFMENTITY)',
p_icp_code =>'VALUEOF(NQ_SESSION.HFMPARTNER)',
p_year =>'VALUEOF(NQ_SESSION.HFMYEAR)',
p_period =>'VALUEOF(NQ_SESSION.HFMPERIOD)',
p_user => 'VALUEOF(NQ_SESSION.USER)'
);
end;
创建资料库模型
以全局临时表为事实表,再加上其他相关维表,创建物理模型,业务模型和表示层模型,这一步是OBIEE资料库的基本开发方法,不多说了。
注意:全局临时表在物理层需要设置为不可高速缓存,否则查询报表时数据不刷新的问题。
创建分析展示数据
这一步根据报表展示内容正常创建分析即可,本文中的报表因为连合计都是事先计算好的(主要是因为合计计算公式很奇葩,无法使用聚合规则),所以做了‘假’的合计行展示。
1 合计行的颜色字体等均和数据行不同,采用条件格式实现,例如
2 全局临时表需要增加一个分组字段,准备数据时计算好的合计行要和组内数据的这个分组字段要填入同样值,创建的分析要把这个分组字段放在第一列
3 有这种‘假’的合计行的分析用户不能按列排序,所以要把分析属性相关列排序等属性去掉