6.6、计算成员避免无限循环与solve_order

计算成员避免无限循环与solve_order

 

1          Avoiding Infinite Recursion 避免无限循环

计算成员如下:

with
member [Date].[Month Num Of Year].[hours] as
         ([Hour].[HourKey].&[11])+([Hour].[Hour Key].&[12])
 
select
         [Measures].[In Count]on 0
         ,[Date].[Month Num OfYear].allmembers on 1
from
         [Park]

         该计算成员挂在层次结构[Date].[MonthNum Of Year]下,目的是计算两个局部元组【11时】与【12时】的和。但是执行后,我们会发现计算成员报错了,点击单元格后提示【检测到无限递归。依赖关系循环是: hours -> hours

         这是为什么呢?我们必须从【计算成员的实现原理】来分析。因为计算成员[hours]挂在[Date].[Month Num Of Year]【层次结构】下,所以当使用[Date].[MonthNum Of Year].allmembers时,将访问到[hours]成员,结合select后生成一个局部元组,补齐后如下:

(
          [Date].[Month Num Of Year].[hours],
          [Measures].[In Count],
          [Hour].[Hour Key].[ALL],
          ……
)

         由于[hours]计算成员由两个局部元组构成,所以以上的局部元组将被拆分成两个局部元组,而根据【引用当前环境下没有的引用】这点来补齐元组的话,只有[Hour].[Hour Key].[ALL]成员会被替换,结果如下:

(
          [Date].[MonthNum Of Year].[hours],
          [Measures].[In Count],
          [Hour].[Hour Key].&[11],
          ......
)
+
(
          [Date].[MonthNum Of Year].[hours],
          [Measures].[In Count],
          [Hour].[Hour Key].&[12],
          ......
)

         我们发现[Hour].[HourKey].[ALL]被替换了,但是[Date].[Month Num Of Year].[hours]计算成员仍然在,那么ssas又要对其进行解析,如此又陷入了上面的过程,从而出现循环错误

         而要解决这样的冲突也很简单,就是把计算成员层次结构下的成员引用到局部元组中即可,如下

with
member[Date].[Month Num Of Year].[hours] as
         ([Hour].[Hour Key].&[11], [Date].[Month Num Of Year].[All])
         +
         ([Hour].[Hour Key].&[12], [Date].[Month Num Of Year].[All])
 
select
         [Measures].[In Count] on 0
         ,[Date].[Month Num Of Year].allmemberson 1
from
         [Park]

 

2          Solve_order 控制计算成员的执行顺序

有时候,行的计算结果必须依赖列的计算结果,或者反过来,这时可以通过solve_order来控制计算成员的执行顺序,否则会引发数据错误,如下:

with
member[Date].[Month Num Of Year].[total] as
         sum([Date].[Month Num Of Year].members)
,solve_order=1
member [in-out] as
         [Measures].[In Count]/[Measures].[OutCount]
,solve_order=2
 
select
         {
                   [Measures].[In Count],
                   [Measures].[Out Count],
                   [in-out]
         } on 0
         ,[Date].[Month Num Of Year].allmemberson 1
from
         [Park]


 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值