2012/3/6更新,解决提示设置默认值之后报 [nQSError: 22023] 正在对非数值类型执行算术操作 的问题。
今天群里有人提出了一个需求,简单来说就是动态切换指标的显示单位,当从提示中选择“元”的时候,以元为单位显示金额;当提示选择“万元”的时候,以万元为单位显示金额(即原始值除以10000)。
最终效果如下:
另外还有一个情况就是,由于需要更改的报表大约有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为来源的逻辑表,并建立关联,如下图所示:
注:之所以要建两张逻辑表是为了通过一致性检查,因为逻辑层至少需要两张表,我们实际上只会使用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成整型即可!