2

我正在编写一些客户端代码以与 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,然后生成新查询。任何人都可以确认这一点,或提供替代方法吗?

4

1 回答 1

4

您可以使用带有RECURSIVE标志的DrilldownMember函数。

例如:

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
}
于 2013-09-10T16:28:58.287 回答