如何在SSRS中表示未知数量的列?

时间:2009-05-20 15:34:23

标签: reporting-services sql-server-2000

我正在使用Sql Server Reporting Services中的一个相当复杂的报告。我的SP返回动态数量的列,每列都是动态命名的。

基本上考虑一下保持应用的时间。动态的每个列表示为该团队收取时间的时间段。如果在报告涵盖的时间段内没有向该桶收取时间,则不显示。每个桶都有自己的标识符,我需要将其作为列标题。

我有一个返回这一切的SP。它是通过使用exec语句执行一些动态SQL来实现的(丑陋我知道,但我在SQL 2000上,所以PIVOT选项不起作用)

我可以拥有无​​限数量的桶,任何或所有可能会显示。

我发现了这个 - http://www.codeproject.com/KB/reporting-services/DynamicReport.aspx - 这是有帮助的,但在例子中他有无限数量的列,他只是根据哪些有值来隐藏或显示它们。在我的情况下,我有一个可变数量的列,所以我需要报告来添加列。

有什么想法吗?

6 个答案:

答案 0 :(得分:10)

只要您知道最大列数,就可以在时尚之后执行此操作。

首先,使用查询结果命名列,以便将其传递给查询或在那里派生。其次,只需将报告构建为具有最大列数,并在它们为空时隐藏它们。

例如,我必须建立一份报告,报告长达一年的月度销售数字,但月份不一定从1月份开始。我在一列中传回了月份名称,然后是我的报告的数字。在.rdl上,我构建了12组列,每个月可能有一列,并且只使用表达式来隐藏列,如果它是空的。结果是报告似乎扩展到所需的列数。

当然,它并不是真正的动态,因为它可以在不知道上限的情况下扩展到你需要的范围。

答案 1 :(得分:8)

这可以做到。我这样做了,它工作正常。 您不必知道最大列数或在我的方法中显示和隐藏列。使用矩阵并修改sp以将动态数据返回到此博客文章http://sonalimendis.blogspot.com/2011/07/dynamic-column-rdls.html

中提到的结构

答案 2 :(得分:4)

构建2个相关数据集,第一个用于报告内容,第二个用于列标签列表。

报告内容的数据集必须具有固定数量的列和名称。您可以分配一些最大列数。

在此示例中,我将前2列固定,或始终可见,最多4列可通过多值参数选择显示,或取决于查询条件。像往常一样,我们也可能有一个总数。所以,它可能看起来像这样:

Fixed01, Fixed02, Dyna01, Dyna02, Dyna03, Dyna04, Total

第二个数据集及其值将如下所示:

Name    Label
----    -----
Dyna01  Label01
Dyna02  Label02
Dyna03  Label03

我省略了第4个标签,以证明某个查询条件并未使用所有列。请记住,两个数据集都与同一个查询相关。

现在创建一个名为@columns的参数;使用第二个数据集填充其可用值和默认值。

对于这4个动态列中的每一列,使用以下表达式设置列可见性:

=IIf(InStr(join(Parameters!columns.Value,","),"Dyna01"),false,true)

对于每个列标题文本框,请使用以下表达式:

=Lookup("Dyna01", Fields!Name.Value, Fields!Label.Value, "dsColumns")

至于Total,这里是其可见性的表达式:

=       IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), false, true)
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), false, true)
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), false, true)
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), false, true)

这是为了它的价值观:

= IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), Fields!C01.Value, 0)
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), Fields!C02.Value, 0)
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), Fields!C03.Value, 0)
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), Fields!C04.Value, 0)

这就是全部,希望它有所帮助。

Bonus,第二个数据集dsColumns也可以包含其他列属性,例如:颜色,宽度,字体等。

答案 3 :(得分:4)

我认为最好的方法是添加表格中的所有列,并在你从SP获得的参数的帮助下编辑它的可见性属性。这将解决动态列的目的,但在查看时报告中您将获得大量空白区域,您可以使用SSRS - Keep a table the same width when hiding columns dynamically?解决该问题,并且您的报告已准备就绪

答案 4 :(得分:0)

我过去需要这样做,而我得出的结论是“你不能”,但我对此并不乐观。如果你找到了解决方案,我会来听取它。

需要考虑的一个问题是,您需要使用您将从存储过程中返回的列的名称来定义报告,如果您不知道这些名称或有多少名称,您如何定义报告?

我对如何做到这一点的唯一想法是通过C#动态创建报告定义(.rdl文件),但当时我无法找到MS API这样做,我怀疑一个存在了。我发现了一个开源的,但我没有追求那条路。

答案 5 :(得分:0)

现在如果列数不确定,如果我将日期作为列名,可以根据报告的选择标准, 例如列可以是:    name,[2013-05-03],[2013-05-04],[2013-05-05] .....