【问题标题】:SSRS dynamic report generation, pdf and subscriptions?SSRS 动态报告生成、pdf 和订阅?
【发布时间】:2015-08-09 05:07:12
【问题描述】:

如果这个问题被认为是不合适的,因为它没有特定的代码问题,而且更像是“我是不是在正确地吠叫”,请在更好的地方告诉我。

如果不是,我是一个没有 SSRS 经验的全栈 .NET Web 开发人员,我唯一的知识来自过去 3 个不眠之夜。我的团队正在开发的应用程序要求最终用户能够通过创建十几个预定义小部件类型的实例来创建任意数量的自定义仪表板。一些小部件与图表或表格一样简单,用户将小部件配置为显示从较大集合中选择的可能字段的子集。我们有一些组合的小部件。 Web 客户端都是 Angular 的,并且使用一个 restful Web api。

还有两个要求,即可以根据要求或在预定时间以 PDF 报告的形式下载每个小部件的合理传真。这个要求有几种解决方案,所以我不是在寻找替代解决方案。如果 SSRS 可以工作,它将使我们不必构建调度程序,或者找到一种利用现有角度模板的方法,或者根据它们创建视图,填充它们并将其转换为 pdf。我正在寻找的是他将了解报告生成最佳实践以及它们如何与 .NET 程序集交互。

我的具体任务是调查 SSRS 是否可以基于复合小部件创建报告并将其下载为 PDF 或将其安排为一个,如果可以,则基于包含 2 个折线图和一张桌子。 PDF 版本不需要以与图形在同一行且表格在下方的 UI 相同的方式显示。只要显示顺序是阅读顺序,我就可以单独显示每个图表。 (从左到右,然后到下一行)

一个示例可能是,第一张图表显示了去年 x-box 的销量。它旁边的折线图显示了去年 X-Box 的新版本数量。下表中的报告显示了去年销售的 X-box 配件数量,按配件类型(控制器、耳机等)和月份分组,按每月总销售额排序。

上面的示例需要 3 个查询。查询对于该特定仪表板上该小部件的该用户特定实例是唯一的。用户可以对列进行分组、选择排序列和其他任何适用的内容。

如何创建这些查询不是我的任务(至少现在还没有。)所以假设一个神奇的查询引擎会在数据库中正确地创建和存储这些 sql 查询。

我的目标数据库是 sql 2012 及其报告服务。我很失望它只支持 2.0 clr。 OI 有一个粗略的计划大纲,但鉴于我缺乏经验,我们将不胜感激。

看来我可以使用 Soap 服务进行调度和管理。这是直截了当的。

我的计划的其余部分听起来很疯狂。欢迎任何更正,指导和更好的建议。或者也许是一种不同的方法。报表服务器是一个很大的安全漏洞,如果我可以仅通过引用报表名称来满足要求,请指出正确的方向。如果没有,这是我经过 3 天的研究和一些 msdn 简单教程拼凑起来的过程。如下:

要成功创建报表定义,我需要引用整个可用超集中的每个可能字段。目前尚不清楚 table 的超集是否与 graph 的超集相同,但对于这个 POC,我会假设它们是相同的。这样,我只需要一个带有输入参数的存储过程,该参数可以识别正确的查询,我将选择并执行该查询。结果集将是可能字段的一小部分,但存储过程将返回每个字段,省略字段的每一行都为空值,以便报告了解每个字段。糟糕的。我可能会返回 5 列数据和 500 个空值。一定有更好的方法。想到性能上的影响让我感到恶心,但这很容易。现在我有一个可部署的报告。我不知道如何处理摘要。它们会是我将附加到结果集中的附加查询吗?也许神奇的查询引擎知道。

现在是一些额外的丑陋。我必须使用标识正确查询的查询字符串来请求报告 url。我猜我也可以使用正确的参数设置调度程序。但是伙计,我有问题吗。我可以使用 httpWebRequest 调用 url 进行下载,但调度程序究竟是如何工作的?我想它会以类似的方式创建报告,我应该能够告诉它以什么格式呈现。但是对于下载,我将流式传输 html。我将如何告诉报表服务器将其转换为 pdf,然后将其流式传输?可以在部署之前在报告定义中设置吗?当我在报表服务器上玩时,转换没有问题。但至少我找到了一种通过 Web api 访问报表服务器来保护报表服务器的方法。 然后是清理空列的问题。有扩展点,例如数据处理扩展。我认为这些几乎类似于网页生命周期中的一个步骤,但不确定是否准确,否则它们将被称为事件。我需要找到正确的,这样我就可以删除饼图上的空数据列或标签,如果这不会破坏报告的话。我需要在它仍然是 rdl 的时候做。也许如果我还没有找到方法,请将 rdl 转换为 pdf 并更改内容类型。看来我可以在扩展点添加 .net 程序集。但这是否正确?我像开发人员一样思考,而不是像经验丰富的 SSRS 专业人士。我正在尝试,但任何帮助我朝着正确的方向前进将不胜感激。

【问题讨论】:

    标签: asp.net reporting-services sql-server-2012 reportingservices-2005


    【解决方案1】:

    我在问之前已经尝试过十几次修改这个问题,但它似乎仍然难以理解。也许我自己的答案会让我自己的问题变得清晰,并希望其他人不必经历我所做的事情,或者至少从开发人员的角度快速深入了解 SSRS。 创建典型的 SSRS 报告涉及(快速 40,000 英尺概览) 1. 创建您的数据连接 2. 创建一个或多个可以参数化的 SQL 查询。 3.查询结果将填充的数据集 4. 将数据集列映射到报表项;图表、表格等 然后构建报表并将其部署到报表服务器,可以通过 url 请求报表,并使用任何 SQL 参数值添加为查询字符串: http://reportserver/reportfolder/myreport?param1=data

    它的工作原理是生成一个 RDL 文件(报告定义语言),它只是一个具有特定架构的 XML 文档。 RDL 有两个与我相关的元素,以及 .顾名思义,第一个包含查询,后者包含报表中的图形、图表、表格等以及与数据集中列的映射。

    当请求报表时,它会通过报表服务器上的处理管道。通过在报告服务命名空间中实现接口,可以创建可以在管道的各个阶段转换 RDL 的 .NET 程序集。

    Reporting Services 也有两个报告 API。一个用于管理报告,另一个用于呈现。还有一个 reportserver 控件,它是一个功能非常丰富的 .NET Webforms 控件,可以用于创建和呈现报表,甚至不需要报表服务器实例。控件可以生成的报告文件是 RDLC 文件,其中 C 代表客户端。

    凭借所有这些知识,我找到了几个解决方案路径,但所有这些路径都不是我的最佳目标,因此我转向了一个根本不涉及报告服​​务或 RDL 的解决方案。但这些可能对其他人有用。

    我可以在 RDL 文件通过管道时对其进行转换。性能不是很好,因为这涉及写入实际的物理文件,然后在渲染后删除修改。我也在使用 SQL Server 2012,它只支持 2.0/3.5 框架。

    然后是服务。使用任一服务,我都可以从我的应用程序中检索 RDL 模板作为字节数组。我在这里不受 CLR 版本的限制。使用管理服务器,我可以修改 RDL 并将其部署到报表服务器。我只需要修改一次 RDL,但考虑到我需要的文件数量以及必须在远程服务器上管理它们,通过客户端/用户/仪表板/ReportWidget 创建文件结构看起来很丑。

    另外,我不部署 RDL 模板,为什么不将它们以字节数组格式存储在数据库中。当我需要一个特定的实例时,我可以获取 RDL 模板,将我的查询和映射添加到模板中,然后将它们传递给执行服务,然后执行服务将呈现它们。然后我可以将生成的 RDL 保存在数据库中。我在那里管理会容易得多。但是现在报表服务器没用了,我需要自己的服务来管理和创建订阅并邮寄它们我需要一个队列服务和一个 SMTP 邮件程序,删除我从报表服务器获得的所有额外内容,需要编写大量自定义代码,但仍受 RDL 约束。所以我会创建 RDLM,RDL 混乱。

    这是一个错误的工作工具,但这是一个有趣的练习,我从各个角度了解了有关 Reporting Services 的更多信息,并且大部分时间都获得了报酬。也许博客文章会是一个更好的场所,但我需要更详细地介绍。

    【讨论】:

    • 感谢分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多