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

时间:2015-03-06 22:35:27

标签: excel reporting-services ssas mdx olap

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

我想在SSAS OLAP多维数据集中创建报告操作,该多维数据集生成格式化值的列表,以传递到接受多值参数列表的SSRS报告参数。这将应用于SSAS操作中的 cell 级别。我找到了一个解决方案,让我最重要的是:How to Pass Multiple Values from an SSAS Report Drill Through Action to an SSRS Multi-Value Parameter,但并不完全。该操作确实出现在Excel中并且工作如果我从维度属性处或低于维度属性的单元格运行操作我将生成列表,在本例中为帐户密钥

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

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,使其从任何度量单元格运行时返回帐户维度的任何属性的所有帐户密钥,不仅仅是在数据透视表中运行自己和帐户密钥的子项时。

此外,如果它有帮助,我可以在多维数据集上执行以下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
问题
  • 我可能需要做些什么才能为帐户维度的任何属性返回帐户密钥
  • 我是否可能需要更改多维数据集中的帐户维度才能使其生效?

提前致谢。

编辑1 - Adventure Works多维数据集版本

我无法通过" Exists"得到建议的答案。工作的功能。为了更好地演示此问题,我使用Adventure Works Cube重新创建了它。

我将专注于 Customer 维度,特别是 Customer Education 属性。我创建了一个名为测试报告操作的报告操作。下面是在多维数据集中为它创建的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. 添加维度客户 - &gt;更多字段 - &gt; 客户
  3. 添加度量互联网销售 - &gt;互联网销售额
  4. 右键单击“Internet销售金额”单元格,选择&#34;其他操作&#34; - &GT; &#34;测试报告行动&#34;并查看为URL
  5. 创建的客户价值

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

    现在部分我无法解决

    1. 删除客户维度并添加客户 - &gt;人口统计学 - &gt;教育
    2. 右键单击“Internet销售金额”单元格,选择&#34;其他操作&#34; - &GT; &#34;测试报告行动&#34;
    3. 什么都没发生。如果我在&#34; Bachelors&#34;旁边的单元格上运行操作,我希望它能够构建所有&#34;客户&#34;的所有列表。组成&#34; Bachelors&#34;在 Customer 维度中作为报告参数的一部分。如果该单元格的 Customer 维度没有在多维数据集中使用的属性,那么我希望它返回&#34;所有客户&#34;或类似的内容以显示所有客户都包含在内在聚合中。

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

2 个答案:

答案 0 :(得分:0)

可能mdx需要通过EXISTING关键字了解当前的单元格背景吗?

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

答案 1 :(得分:0)

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

我最终做的是从退化维度获取值列表,我可以使用该列表传递给SSRS以获取报告的事务列表。以下是我使用退化维度 Internet订单详细信息与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 Sales 的每个度量,以“&amp; rp:OrderNum =”分隔。这将允许我创建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 $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

通过这个,我可以在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报告的查询参数中使用它。