试图找出默认成员添加到此scipt的内容
([DateTool].[Aggregation].[Previous Month]) =
iif(
([DateTool].[Aggregation].DefaultMember, ParallelPeriod(dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month],1,[dim_RPT_period].[Yr-Qtr-Month].currentmember)) = null,
NULL,
([DateTool].[Aggregation].DefaultMember,ParallelPeriod([dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month],1,[dim_RPT_period].[Yr-Qtr-Month].currentmember))
);
这是来自实用程序维度。计算脚本。
我得到了IIF,我得到了ParallelPeriod。
但是"(DefaultMember,ParallelPeriod)"会产生什么影响?有?
答案 0 :(得分:0)
它看起来像用来避免无限递归。这种技术用于这种动态计算。
假设我们使用WHERE [DateTool].[Aggregation].[Previous Month]
运行一些MDX脚本。
服务器从您的公式中获取此计算(不包含[DateTool].[Aggregation].DefaultMember
),它像往常一样使用ParallelPeriod
,但需要[DateTool].[Aggregation].[Previous Month]
作为其他维度的元组的一部分(我们的{{ 1}}过滤器),所以它一次又一次地使用这个公式...
所以我们总是需要一些固定的成员来避免无限递归。
这是我的理解,如果它在某处或完全错误,请更正。
答案 1 :(得分:0)
我的理解是,当切片器具有[dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month]
级别中的任何成员时,计算出的成员构建为仅具有值 。我的意见是模仿ISCROSSFILTERED
的 DAX
功能。
构建成员使得[DateTool].[Aggregation].[Previous Month]
仅在保留值时才会保留值
切片器的成员来自[dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month]
[DateTool].[Aggregation].DefaultMember
和[DateTool].[Aggregation].[ALL]
一样好
它与查询
[DateTool].[Aggregation]
层次结构一样好
如果切片器没有来自[dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month]
的成员,
然后[dim_RPT_period].[Yr-Qtr-Month].currentmember
与[dim_RPT_period].[Yr-Qtr-Month].[ALL]
一样好
本例中的前一个成员(由ParallelPeriod
函数返回)未定义,因此将返回NULL
。
如果切片器有成员,则会返回non null
成员。
进一步说明: (请仔细阅读评论)
([DateTool].[Aggregation].[Previous Month]) =
iif(
(
[DateTool].[Aggregation].[ALL],
ParallelPeriod([dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month],1,[dim_RPT_period].[Yr-Qtr-Month].currentmember)
) //If a member from dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month] level is not in slicer then it would evaluate to NULL
= null,
NULL, //In that case the previous month should evaluate to NULL
//Otherwise, it should give the "previous month"
([DateTool].[Aggregation].[ALL],
ParallelPeriod([dim_RPT_period].[Yr-Qtr-Month].[RPT Period Month],1,[dim_RPT_period].[Yr-Qtr-Month].currentmember))
);