将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作

Posted

技术标签:

【中文标题】将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作【英文标题】:SSAS report action to pass multi-value list values to a s-s-rS report parameter 【发布时间】:2015-03-06 22:35:26 【问题描述】:

我已经搜索了好几个小时,试图找到解决这个问题的端到端解决方案。

我想在 SSAS OLAP 多维数据集中创建一个报告操作,该操作生成一个格式化值列表,以传递给接受多值参数列表的 s-s-rS 报告参数。这将应用于 SSAS 操作中的 cell 级别。我找到了一个解决方案,可以帮助我大部分时间:How to Pass Multiple Values from an SSAS Report Drill Through Action to an s-s-rS Multi-Value Parameter,但不完全是。该操作确实出现在 Excel 中并且有效如果我从位于或低于要为其生成列表的维度属性的单元格运行操作,在这种情况下,帐户键.

下面是一个屏幕截图的链接(由于缺乏信誉,无法嵌入),显示了 Excel 中的操作和维度结构。只要我在 Account Key 级别或以下级别运行该操作,该操作就会起作用。我希望能够在更高级别运行它,例如 Account Major 并且仍然让它为 s-s-rS 报告参数生成所有相关的 Account Key 值。在较高的 Account Major 级别运行它不会触发报告运行。

Excel 操作屏幕截图:http://i.stack.imgur.com/QCGSp.png

下面是我用来生成报告参数值的 MDX:

UrlEscapeFragment(
    GENERATE(
        DESCENDANTS(
            [Account].[Account Key].CurrentMember, 
            [Account].[Account Key].[Account Key]
        ),
        [Account].[Account Key].CURRENTMEMBER.Name,
        "&rp:Account="
    )
)

我希望我能以某种方式修改上面的 MDX,使其在从任何度量单元运行时返回 Account 维度的任何属性的所有 Account Keys,不仅仅是在数据透视表中的 Account Key 的 self 和 children 处运行时。

另外,如果有帮助,我可以在多维数据集上执行以下 MDX 查询并获得我正在寻找的结果。

WITH MEMBER [Measures].[Account Key List] as 
GENERATE(
    DESCENDANTS([Account].[Account].CurrentMember, [Account].[Account].[Account]),
    [Account].[Account].CURRENTMEMBER.NAME,
    "&rp:Account=")

SELECT [Measures].[Account Key List] on 0,
([Account].[Account Company Number].[Account Company Number],[Account].[Account Major].[Account Major]
)  on 1
FROM  [Company 10 Action Demo]

以下是部分结果:

10.116&rp:Account=10.116.010
10.117&rp:Account=10.117.010&rp:Account=10.117.020
10.120&rp:Account=10.120.005&rp:Account=10.120.006&rp:Account=10.120.010&rp:Account=10.120.020&rp:Account=10.120.030&rp:Account=10.120.040&rp:Account=10.120.050&rp:Account=10.120.060&rp:Account=10.120.380&rp:Account=10.120.999
10.123
问题 我可能需要做些什么来为 Account 维度的任何属性返回 Account Key? 我是否可能必须更改多维数据集中的 Account 维度才能使其正常工作?

提前致谢。

编辑 1 - Adventure Works Cube 版本

我无法通过“存在”功能获得建议的答案。为了更好地演示这个问题,我使用 Adventure Works Cube 重新创建了它。

我将关注 Customer 维度,特别是 CustomerEducation 属性。我创建了一个名为 Test Report Action 的报告操作。下面是在多维数据集中为其创建的 XML。

    <Action xsi:type="ReportAction" dwd:design-time-name="f35ad5ee-5167-4fb8-a0e0-0a74cc6e81c6">
      <ID>Report Action 1</ID>
      <Name>Test Report Action</Name>
      <TargetType>Cells</TargetType>
      <Target></Target>
      <Type>Report</Type>
      <ReportServer>SQLSERVER</ReportServer>
      <Path>ReportServer?/Test Report</Path>
      <ReportParameters>
        <ReportParameter>
          <Name>Test Customer Existing</Name>
          <Value>UrlEscapeFragment(
    GENERATE(
       EXISTING DESCENDANTS(
            [Customer].[Customer].CurrentMember, 
            [Customer].[Customer].[Customer]
        ),
        [Customer].[Customer].CURRENTMEMBER.Name,
        "&amp;rp:Customer="
    )
)</Value>
        </ReportParameter>
      </ReportParameters>
      <ReportFormatParameters>
        <ReportFormatParameter>
          <Name>rs:Command</Name>
          <Value>Render</Value>
        </ReportFormatParameter>
        <ReportFormatParameter>
          <Name>rs:Renderer</Name>
          <Value>html5</Value>
        </ReportFormatParameter>
      </ReportFormatParameters>
    </Action>

以下是重新创建问题的步骤。

    在 Excel 中连接到多维数据集 添加维度客户 -> 更多字段 -> 客户 添加度量Internet Sales -> Internet Sales Amount 右键单击 Internet Sales Amount 单元格,选择“其他操作” -> “测试报告操作”并查看为 URL 创建的客户值

此时使用 Customer 运行操作时,我看到在显示的消息框中的 URL 中创建的值(因为在指定位置没有 s-s-rS 报表服务器)。

现在我无法解决的部分

    删除 Customer 维度并添加 Customer -> Demographic -> Education 右键单击 Internet Sales Amount 单元格,选择“附加操作”->“测试报告操作”

什么都没有发生。如果我在“单身汉”旁边的单元格上运行该操作,我希望它在 Customer 维度中构建构成“单身汉”的所有“客户”的所有列表作为一部分报告参数。如果在该单元格的 Customer 维度中的多维数据集中没有使用任何属性,那么我希望它返回“所有客户”,或类似的东西以显示所有客户都包含在聚合中。

到目前为止,我还不太精通 MDX。我想我需要以某种方式将 Customers 加入到 Generate 功能部分中的 Internet Sales Amount 中。我已经尝试了 Customer 维度和 Internet Sales Amount 的几种不同组合,以及各种功能,看看我是否可以让它工作但没有成功。我希望有比我更了解的人有一个解决方案。如果您需要更多详细信息,请询问,我会提供。

【问题讨论】:

只是想知道您是否可以将其翻译到 AdvWrks 以便人们更容易玩? 我已经考虑过安装 AdventureWorks DW 和多维数据集,因为有很多示例引用它。明天我会知道你建议的答案是否有效。如果不是,我将使用 AdventureWorks 重新表述这个问题。谢谢。 【参考方案1】:

也许mdx 需要通过EXISTING 关键字了解当前单元格上下文?

UrlEscapeFragment(
    GENERATE(
        EXISTING DESCENDANTS(
            [Account].[Account Key].CurrentMember, 
            [Account].[Account Key].[Account Key]
        ),
        [Account].[Account Key].CURRENTMEMBER.Name,
        "&rp:Account="
    )
)

【讨论】:

我试过你的建议,发现它不起作用。此后,我以 Adventure Works 立方体演示为例更新了该问题。谢谢 @ShayneEphraim 您也应该将此问题发布到 MSDN SSAS 论坛 - 它是活跃的,并且有几位著名的 MDX 专家在该站点上回答了帖子。 这个问题也已经发到MSDN SSAS Forum,供参考。如果那里发布了答案,我会看看那个人是否也想在这里添加它,或者我会转移它。【参考方案2】:

我终于找到了解决问题的方法。 @wytheq 与 MDX Exists 走在正确的轨道上,如果可以的话,我会投票赞成他的答案。

我最终做的是从退化维度获取值列表,我可以使用它传递给 s-s-rS 以获取报告的交易列表。下面是我如何做到这一点,与使用退化维度 Internet Order Details 的 Adventure Works 多维数据集相关。

WITH MEMBER [Measures].[Order Param List] AS
    GENERATE(
        EXISTS([Internet Sales Order Details].[Sales Order Number].[Sales Order Number].Members, ,
            "Internet Sales"),
    [Internet Sales Order Details].[Sales Order Number].CurrentMember.Name,
    "&rp:OrderNum=")

SELECT [Measures].[Order Param List], [Measures].[Internet Sales Amount] ON 0
    ,([Date].[Calendar].[Date]) ON 1
FROM [Adventure Works]

这将获得一个文本字符串中的销售订单号列表,互联网销售的每个度量用“&rp:OrderNum=”分隔。这将允许我创建一个 s-s-rS 报告来返回每个销售订单号的详细信息。以下是一些示例结果。

May 16, 2007    SO50493&rp:OrderNum=SO50494&rp:OrderNum=SO50495&rp:OrderNum=SO50496&rp:OrderNum=SO50497&rp:OrderNum=SO50498&rp:OrderNum=SO50499&rp:OrderNum=SO50500 $12,157.80
May 17, 2007    SO50501&rp:OrderNum=SO50502&rp:OrderNum=SO50503&rp:OrderNum=SO50504&rp:OrderNum=SO50505&rp:OrderNum=SO50506&rp:OrderNum=SO50507&rp:OrderNum=SO50508 $13,231.62
May 18, 2007    SO50509&rp:OrderNum=SO50510 $4,624.91

有了这个,我可以在 s-s-rS 中创建一个参数值为

的报告操作
UrlEscapeFragment(
    GENERATE(
            EXISTS([Internet Sales Order Details].[Sales Order Number].[Sales Order Number].Members, ,
                "Internet Sales"),
        [Internet Sales Order Details].[Sales Order Number].CurrentMember.Name,
        "&rp:OrderNum=")
        )

我之前的做法存在缺陷,因为我试图从用于构建度量值的每个维度中获取粒度值列表,并将每个维度作为单独的参数传递。我只需要为每个事实度量交易设置一些唯一的东西,这些交易代表价值,并在 s-s-rS 报告的查询参数中使用它。

【讨论】:

以上是关于将多值列表值传递给 s-s-rS 报告参数的 SSAS 报告操作的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 中的可选多值参数

需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理

TSQL 将列中的逗号分隔值与逗号分隔参数进行比较

s-s-rS 多值参数

s-s-rS 打开带有提供参数的子报告

s-s-rS 多值参数只返回最后一个值