【问题标题】:How do I dynamicaly create an SSRS Report?如何动态创建 SSRS 报告?
【发布时间】:2010-10-20 10:46:30
【问题描述】:

我正在尝试在 SSRS 中创建报告。该报告为其数据调用一个存储过程。我想在表格中显示数据。 但问题是,存储过程的结果有时会有所不同,因为每个客户都有自己的“模板”。这意味着客户 A 的结果可能是:

帐号 | 客户 ID
1234567890           0987654321
1579086421           1234565465
......................          ....................

对于客户 B 可能是:

客户名称 | 地址
客户 B          Teststreet 1
客户测试     Teststreet 2
......................      ....................

有 50 种不同的列可供选择。列的顺序也是可编辑的。我的存储过程负责这个。我唯一想要的是将存储过程的结果集 1:1 放入我的报告(标题+正文)中。你们知道怎么做吗?

如果那不可能,有 C# 解决方案吗?即在 C# 中创建报表对象,调整设置等。

谢谢

【问题讨论】:

    标签: c# reporting-services reporting service


    【解决方案1】:

    您可以根据存储过程返回的数据集动态创建 SSRS 报告。报告格式 (RDL) 已记录在案,并且是 XML 格式。因此,您可以使用 System.XML 命名空间来生成 RDL。另一种(且不受支持的)方法是引用 RDL 对象模型程序集 (Microsoft.ReportingServices.RdlObjectModel) - 您可以在 SSRS 2008 服务器计算机上找到该程序集并将其复制到本地计算机上。它提供了一个对象模型来读取/生成 RDL。

    我采用的方法是根据数据表动态生成 RDL(作为 XML),然后使用 Web 服务 API 在 SSRS 服务器上发布 RDL。

    【讨论】:

    • 如何根据存储过程返回的数据集创建动态报表?你能解释一下怎么做吗?通过报表设计器?生成 RDL 文件并不是真正的解决方案,因为 100 多个 ppl 正在与应该生成 rdl 文件的 webapp 同时工作,这意味着要在服务器上保存 100++(每天)rdl 文件。或者我得到你错了吗?
    • 如前所述,需要为RDL文件生成xml。例如,在设计器中创建示例列报表并在文本编辑器中打开 RDL。通过这种方式,您将了解报表列和字段如何映射到 RDL 文件中。现在基于数据集中的列,您需要生成一个 RDL 文件。在我们的例子中,我们确实生成了 RDL 文件,但没有在 SSRS 服务器上发布它们——而是在本地模式下使用 ReportViewer 控件来显示它们。生成的 RDL 文件在 temp 目录中创建并定期清理。
    • 继续,生成的 RDL 文件的数量将取决于使用情况。例如,如果您只能拥有一定数量的组合,那么您可以将这些 RDL 生成为模板,并在需要时使用它们。如果这不可行,那么您必须为每个可能的列(和订单)组合生成 RDL。
    • 我修好了 :)。我编写了一个 C# 应用程序,它动态生成 RDL 文件,并使用 ReportViewer 加载它
    • MaxiBlue - 我和你在同一条船上。我已经通过 XML 动态生成了 RDL 文件。你能给我一些关于如何使用reportviewer在本地模式下加载它的例子吗?谢谢
    【解决方案2】:

    一种解决方案可能是修改您的 SP,使返回的数据类似于:

    ColNameA       DataA       ColNameB    DataB
    AccountNumber, 1234567890, CustomerID, 948477586
    AccountNumber, 5466584426, CustomerID, 458852244
    

    然后,在 SSRS 中拖出一个表格。在 ColNameA 上创建一个组。在该组行中,将字段 ColNameA 放在第一列中,将 ColNameB 放在第二列中。

    在详细信息行中,将 DataA 放在第一列,将 DataB 放在第二列,应该如下所示:

    我使用的示例查询是:

    select 'AccountNumber' as ColNameA, 1234567890 as DataA, 'CustomerID' as ColNameB, 0987654321 as DataB UNION 
    select 'AccountNumber' as ColNameA, 5546488393 as DataA, 'CustomerID' as ColNameB, 4747599393 as DataB
    

    获取列的名称(AccountNumber、CustomerID 或 CustomerName、CustomerAddress)将是关键。您可以通过以下方式获得它们:

    select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'my_table_name'
    

    【讨论】:

      【解决方案3】:

      您可以使用报表设计器提供的 Rdlobjectmodel 来创建和更改报表。

      您可以将 Microsoft.ReportingServices.Designer.Controls 引用到您的项目中,但这也包括所有依赖项,即 20 多个程序集,或者您可以将以下一组 DLL 复制到项目根级别的单独文件夹中,并且使用它来引用 DLL

       Microsoft.ReportingServices.QueryDesigners
       Microsoft.ReportingServices.Designer.Controls
       Microsoft.ReportingServices.RdlObjectModel
       Microsoft.ReportingServices.ReportDesign.Common
       Microsoft.ReportingServices.RichText
       Microsoft.ReportingServices.RPLObjectModel
      
      
        private Report LoadReportTemplate()
        {
              const string docPath = "template.rdl";//path for your template report
              using (var fs = new FileStream(docPath, FileMode.Open))
              {
                  var report = Report.Load(fs);
                  return report;
              }
        }
      

      点击Documentation的链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        相关资源
        最近更新 更多