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

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

1Avoiding Infinite Recursion 避免无限循环

计算成员如下:

withmember [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 1from [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又要对其进行解析,如此又陷入了上面的过程,从而出现循环错误

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

withmember[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 1from [Park]

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

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

withmember[Date].[Month Num Of Year].[total] as sum([Date].[Month Num Of Year].members),solve_order=1member [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 1from [Park]

没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。

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

相关文章:

你感兴趣的文章:

标签云: