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

来源:互联网 发布:钱咖淘宝返利 编辑:程序博客网 时间:2024/06/06 01:42

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

 

1          Avoiding 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]

 

2          Solve_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]


 

 

 

 

 

0 0
原创粉丝点击