我正在编写一些客户端代码以与ActivePivot集成。作为其中的一部分,我需要能够处理向下钻取请求并生成适当修改的MDX查询,然后再将其提交给服务器。
以下是使用ActivePivot沙箱多维数据集的简单示例。假设基本查询是:
SELECT
{
Hierarchize
(
{
[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember],
[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
}
)
} ON COLUMNS,
{
Hierarchize
(
{
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
}
)
} ON ROWS
FROM [EquityDerivativesCube]
当用户向下钻取“2M”男高音时,我需要生成:
SELECT
{
Hierarchize
(
{
[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember],
[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
}
)
} ON COLUMNS,
{
Hierarchize
(
{
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].[2M].Children
}
)
} ON ROWS
FROM [EquityDerivativesCube]
现在,对于上面那些更简单的查询,我可以在基本查询中定义一个替换点,并向其中注入向下钻取的路径。例如,上面的基本查询将是:
SELECT
{
Hierarchize
(
{
{0}
}
)
} ON COLUMNS,
{
Hierarchize
(
{1}
)
}
ON ROWS FROM [EquityDerivativesCube]
(显然替代点需要他们的花括号逃脱,但你明白了)
但是对于更复杂的查询,例如轴上有多个成员的查询,这种方法很快就会崩溃。例如,以下是列维上有两个成员的查询:
SELECT
Hierarchize(
Union(
CrossJoin(
{[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember]},
{[Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember]}
),
Union(
CrossJoin(
{[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember]},
[Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
),
Union(
CrossJoin(
[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
{[Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember]}
),
CrossJoin(
[Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
[Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
)
)
)
))
ON COLUMNS,
{Hierarchize(
{[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children})}
ON ROWS
FROM [EquityDerivativesCube]
我需要能够检测任何可钻取成员的向下钻取请求,并在重新提交之前相应地修改查询。
所以我想知道如何去做这件事?我最初的希望是MDX本身定义了一些标准机制,以根据您传递的一些参数提供深入查询。但是,我找不到这样的东西。
因此,我担心我唯一的办法是自己解析查询并将下钻信息动态地注入AST,然后生成新查询。任何人都可以证实这一点,或提供替代方法吗?
答案 0 :(得分:4)
您可以将DrilldownMember功能与 RECURSIVE 标志一起使用。
例如:
DrilldownMember({ [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember]}, { [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember], [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].[2M]}, RECURSIVE)
它将返回与
相同的成员{
{[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember]},
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
[TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].[2M].Children
}