BIEE 11g 新特性Double Colunm案例一则 动态切换金额显示单位

2012/3/6更新,解决提示设置默认值之后报 [nQSError: 22023] 正在对非数值类型执行算术操作 的问题。

 

今天群里有人提出了一个需求,简单来说就是动态切换指标的显示单位,当从提示中选择“元”的时候,以元为单位显示金额;当提示选择“万元”的时候,以万元为单位显示金额(即原始值除以10000)。

 

最终效果如下:

BIEE 11g 新特性Double Colunm案例一则 动态切换金额显示单位_第1张图片

 

 

 

另外还有一个情况就是,由于需要更改的报表大约有200张左右。

 

 

基于以上情况,我给出的方案是直接在RPD逻辑层采用变量,然后在前端使用提示来完成。

 

基本思路如下:

定义名为unit的session变量(必须为session变量);然后修改逻辑列映射,在原有映射基础上除以这个变量,然后在前端使用提示以便用户能改变变量值,

以达到切换单位的目的。

由于前端的提示呈现的是“元”、“万元”,而我们的变量需要参与运算,在10G中 我们只能把unit变量定义为字符型,通过case when来判断,当为“元”时,除以1,

当为“万元”时除以10000。很明显这个方法的拓展性不高,一旦以后新增加单位(如 千万) 那我们必须得更改逻辑层的case when句话,加入新的判断条件。

 

现在,在11G中,我们有了更为灵活的办法,那就是使用11G的新特性---------Double Colunm

该特性简单来说就是可以做到提示在显示的时候显示说明性的文字(比如 上面的“万元”),而实际参与运算的则是数值型(如对应的10000)。

 

另外,这个解决方案中还需要用到的是请求变量(这也就是为什么前面必须定义session变量的原因)

注:所谓请求变量就是与会话变量同名的变量,用于在请求过程中“更改”会话变量的值,当请求结束后,会话变量仍旧是原值。由于其生命周期是在整个请求期间,

故被称为请求变量。会话变量的生命周期则是在整个会话期间。

 

介绍了背景知识,下面让我们来一步一步实现这个方案吧!

 一、设置Double Colun

首先在DB中创建一张表,用于存放单元描述及其对应值,并填充数据 

create table unit
(
 unit_value int primary key,
 unit_name varchar2(10)
);


insert into unit values(1,'元');
insert into unit values(10000,'万元');


 

接下来将该表导入RPD物理层,新建一个命为Parameter的逻辑业务模型,生成两张以unit为来源的逻辑表,并建立关联,如下图所示:

 

BIEE 11g 新特性Double Colunm案例一则 动态切换金额显示单位_第2张图片

 

 

注:之所以要建两张逻辑表是为了通过一致性检查,因为逻辑层至少需要两张表,我们实际上只会使用UNIT这张逻辑表。

 

双击UNIT的UNIT_NAME列,把“描述符ID列”设置为UNIT_VALUE

 

 注:这一步就是在设置Double Colunm,在前端用UNIT_NAME建立提示,实际参加运算的则为UNIT_VALUE

 

最后在展现层建Parameter主题域,将UNIT逻辑表拖过去即可。

 

 

 

二、创建变量

接下来创建名为unit的session变量,设置好相关的初始化块,并设置默认值为1,详细步骤略。

接下来创建名为unit的session变量,设置好相关的初始化块,并设置默认值为'1',详细步骤略。

2012/3/6修改  注:之前默认值是设置为1,即为整型,后来在使用过程中发现有小问题,详情请见文末。

三、修改指标映射

将之前的"Sample App Lite Data"."".""."F10 Revenue Facts (Order grain)"."Revenue"

修改为  "Sample App Lite Data"."".""."F10 Revenue Facts (Order grain)"."Revenue" /VALUEOF(NQ_SESSION."unit")

 修改为  "Sample App Lite Data"."".""."F10 Revenue Facts (Order grain)"."Revenue" /CAST(VALUEOF(NQ_SESSION."unit") as INTEGER)

2012/3/6修改  注:之前默认值是设置为1,即为整型,后来在使用过程中发现有小问题,详情请见文末。

四、创建仪表盘提示

创建列提示,选择Parameter主题的UNIT表,UNIT_NAME列

 

如下图所示

 

 然后设置“请求变量”,变量名一定要和前面的session变量名相同!

 

保存!最终效果参见文章起始处。

 

2012/3/6修改

今天网友反映,按照之前的办法(unit设为整型,默认值为1),当他给提示设置默认值的时候,比如万元,报表在第一次访问时会报错:

从 OBIS 返回消息。 [nQSError: 22023] 正在对非数值类型执行算术操作

 

经过仔细发现,当给double colunm提示设置默认值的时候,会给对应的ID列值加上引号,导致以上错误。

SET VARIABLE QUERY_SRC_CD='Report',SAW_DASHBOARD='/shared/demo/_portal/test',SAW_DASHBOARD_PG='t2',

SAW_SRC_PATH='/shared/demo/test',unit='10000';SELECT

注意红色部分,而当你通过下拉列表进行选择的时候,则如下:

SET VARIABLE QUERY_SRC_CD='Report',SAW_DASHBOARD='/shared/demo/_portal/test',SAW_DASHBOARD_PG='t2',

SAW_SRC_PATH='/shared/demo/test',unit=10000;SELECT

 

所以问题出在这里,变通的解决办法就是将unit的类型改为字符型,然后在计算列公式中cast成整型即可!

 

你可能感兴趣的:(session,report,Integer,query,insert,报表)