代码之家  ›  专栏  ›  技术社区  ›  Shayne Ephraim

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

  •  2
  • Shayne Ephraim  · 技术社区  · 10 年前

    我花了很多时间试图找到解决这个问题的端到端解决方案。

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

    下面是一个屏幕截图的链接(由于缺乏信誉而无法嵌入),显示Excel中的操作和维度结构。只要我在 帐户密钥 级别或以下。我希望能够在更高级别运行它,例如 主要客户 并且仍然生成所有相关的 帐户密钥 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 Cube版本

    我无法使用“Exists”函数得到建议的答案。为了更好地演示这个问题,我使用AdventureWorksCube重新创建了它。

    我将专注于 顾客 尺寸,特别是 顾客 教育 属性。我创建了一个名为 测试报告操作 。下面是在多维数据集中为其创建的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销售金额”单元格,选择“其他操作” ->“测试报告操作”,并查看为URL创建的客户值

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

    现在我无法解决的部分

    1. 删除 顾客 标注并添加 客户->人口统计->教育
    2. 右键单击“Internet销售金额”单元格,选择“其他操作”->“测试报告操作”

    什么都没有发生。如果我在“单身汉”旁边的单元格上运行该操作,我会希望它在 顾客 维度作为报表参数的一部分。如果多维数据集中没有使用 顾客 维度,则我希望它返回“所有客户”,或类似于显示所有客户都包含在聚合中。

    到目前为止,我还不太懂MDX。我想我需要加入 客户 互联网销售金额 在Generate函数部分中。我尝试了几种不同的组合 顾客 尺寸和 互联网销售金额 ,以及各种功能,看看我是否可以让它在没有成功的情况下工作。我希望像我这样有知识的人能找到解决办法。如果您需要更多详细信息,请询问,我会提供。

    2 回复  |  直到 10 年前
        1
  •  0
  •   whytheq    10 年前

    也许 mdx 需要通过 EXISTING 关键字?

    UrlEscapeFragment(
        GENERATE(
            EXISTING DESCENDANTS(
                [Account].[Account Key].CurrentMember, 
                [Account].[Account Key].[Account Key]
            ),
            [Account].[Account Key].CURRENTMEMBER.Name,
            "&rp:Account="
        )
    )
    
        2
  •  0
  •   Shayne Ephraim    10 年前

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

    我最终所做的是从退化维度获取一个值列表,我可以使用它传递给SSRS,以获取报表的事务列表。下面是我是如何做到这一点的,关于使用退化维度的AdventureWorks立方体 Internet订单详细信息 .

    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=”分隔 互联网销售 。这将允许我创建一个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报告的查询参数中使用该属性。

    推荐文章