计算成员避免无限循环与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]