一、前言
根据8月份帖子问题的总结,Cube的维度处理问题成为了论坛朋友关注的焦点,尤其是当要计算同比、环比问题需要用到时间维度的相对时间层处理。 鄙人也私下研究了此问题,同比、环比运算运用非常频繁,至少目前国内企业项目的报表开发。
二、目的
演示在 Report Studio 提示中使用Transformer的相对时间类别的方法。如何创建默认值为相对时间类别的提示,同时允许用户使用任何其他时间类别, 如下图所示
三、案例
月份环比计算将会用到相对时间(Relative Time)[CurrentMonth],但是我们在开发时候遇到一个棘手问题“CurrentMonth”所在的hierarchy和真实时间所在 的hierarchy不同,如下列表达式:
if (?P_ChosenMonth? = "Current") then
([sales_and_market].[Years].[Current Month].[Current Month]->:[PC].[@MEMBER].[Current Month])
else
([sales_and_market].[Years].[Years].[Month]->?P_ChosenMonth?)
编译表达式肯定无法通过,因为if else语句要求处理的数据项必须在同一个hierarchy, 那么该怎么处理呢?
四、步骤
1、定义ValuePrompt“值提示”,如下图中所示:
使用值 是“Month MUN”;输入 一个静态值 “Current”,默认值=Current
2、将一个数据项添加到查询中,名称为[CurrentMonthToRealMonth]表达式定义为:
linkmember( firstchild( [sales_and_market].[Years].[Current Month].[Current Month]->:[PC].[@MEMBER].[Current Month] ),[sales_and_market].[Years].[Years].[Month])
linkmember是Cube库函数,返回某个成员在其它hierarchy相同值的成员,这也是解决该问题的关键突破点。firstChild可以用item([Current Month],0)代替,因为Current Month只有一个成员。如下图:
3、将另一个数据项添加到查询中,名为 [ChosenedMonth],表达式定义为:
if ( ?P_ChosenMonth?= 'Current' ) then ( [CurrentMonthToRealMonth] )
else
(#substitute('Current','[2004/Jan]', prompt( 'P_ChosenMonth','token','Current') ) #)
//[2004/Jan]是任意该层的成员,实际上用不到它,因为当选择值为Current时返回 [CurrentMonthToRealMonth]。如下图
4、将另一个数据项添加到查询中名为 [PreviousMonth],表达式定义为:
prevMember([ChosenedMonth])
现在,我们可以随意选择月份,通过这个通用表达式,均可得到正确的结果。展示结果如下
相信已经解决了你的问题,有时一些idea实践起来就遇到很多困难。欢迎留言和鄙人一起讨论!