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

SSAS report action to pass multi-value list values to a SSRS report parameter

我搜索了很多小时试图找到解决此问题的端到端解决方案。

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

下面是 link 屏幕截图(由于缺乏声誉而无法嵌入),显示了 Excel 中的操作和维度结构。只要我 运行 它处于 帐户密钥 级别或以下,该操作就有效。我希望能够在更高级别 运行 它,例如 Account Major 并且仍然让它生成所有然后相关的 Account Key SSRS 报告参数的值。 运行 它在更高的 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,使其 return 所有 Account Keys Account[ 的任何属性=90=] 维度当 运行 来自任何度量单元格时,而不仅仅是当 运行 在自身和 帐户密钥 的子节点 table 中。

此外,如果有帮助,我可以在多维数据集上执行以下 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 KeyAccount 的任何属性 returned ]维度?
  • 我是否需要更改多维数据集中的 帐户 维度才能使其正常工作?

提前致谢。

编辑 1 - Adventure Works Cube 版本

我无法使用 "Exists" 函数获得建议的答案。为了更好地演示这个问题,我使用 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>

以下是重现问题的步骤。

  1. 连接到 Excel
  2. 中的多维数据集
  3. 添加维度 客户 -> 更多字段 -> 客户
  4. 添加度量 Internet 销售额 -> Internet 销售额
  5. 右键单击 Internet Sales Amount 单元格,select "Additional Actions" -> "Test Report Action" 并查看为 URL
  6. 创建的客户价值

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

现在我无法解决的部分

  1. 删除 Customer 维度并添加 Customer -> Demographic -> Education
  2. 右键单击 Internet Sales Amount 单元格,select "Additional Actions" -> "Test Report Action"

没有任何反应。如果我 运行 在 "Bachelors" 旁边的单元格上执行操作,我希望它构建构成 "Bachelors" 中所有 "Customers" 的所有列表=50=]Customer 维度作为报告参数的一部分。如果在该单元格的 Customer 维度的多维数据集中没有使用属性,那么我希望它为 return "All Customers",或类似的东西以显示所有客户包含在聚合中。

到目前为止,我不太了解 MDX。我想我需要以某种方式将 Customers 加入到 Internet Sales Amount 的生成函数部分。我已经尝试了 Customer 维度和 Internet Sales Amount 的几种不同组合,以及各种函数,看看我是否可以在没有成功。我希望对我更有了解的人会有解决方案。如果您需要更多详细信息,请询问,我会提供。

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

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

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

我最终做的是从退化维度获取值列表,我可以使用它传递给 SSRS 以获取报告的事务列表。下面是我如何做到这一点,与使用退化维度 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]

这将在文本字符串中获取 销售订单编号 的列表,Internet 销售[=]的每个度量由“&rp:OrderNum=”分隔28=]。这将允许我创建一个 SSRS 报告以返回每个 销售订单号 的详细信息。以下是一些示例结果。

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 ,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 ,231.62
May 18, 2007    SO50509&rp:OrderNum=SO50510 ,624.91

有了这个,我就可以在 SSRS 中创建一个参数值为

的报告操作
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=")
        )

我之前采用的方法是有缺陷的,因为我试图从用于构建度量值的每个维度获取粒度值列表,并将每个维度作为单独的参数传递。我只需要为每个代表值的事实度量交易设置一些唯一的东西,并将其用于 SSRS 报告的查询参数。