繁体   English   中英

SSRS动态报告生成,pdf和订阅?

[英]SSRS dynamic report generation, pdf and subscriptions?

如果此问题由于没有特定的代码问题而被认为是不合适的,并且更像是“我在树上吠叫”,请在一个较好的地方告诉我。

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

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

我的特定任务是调查SSRS是否可以基于复合窗口小部件创建报告并以PDF格式下载或将其安排为一个报告,如果是,则基于包含2个折线图和一个表格的复合窗口小部件来创建POC。 PDF版本不需要以与UI相同的方式显示,其中图形位于同一行,而表格位于下方。 只要显示顺序为阅读顺序,我就可以自己显示每个图形。 (从左到右,然后向下到下一行)

例如,第一个图表显示了去年同期X盒的销量。 它旁边的折线图显示了X-Box去年新发行的数量。 下表中的报告显示了去年出售的X-box配件的数量,按配件类型(控制器,耳机等)分组,并按月分组,并按每月的总销售额排序。

上面的示例将接受3个查询。 这些查询对于该特定仪表板上的该窗口小部件的用户特定实例是唯一的。 用户可以分组,选择排序列以及其他适用的内容。

如何创建这些查询不是我的任务(至少现在还不是。)因此,有一个假设,即魔术查询引擎可以在数据库中正确创建和存储这些sql查询。

我的目标数据库是sql 2012及其报表服务。 我很失望,它仅支持2.0 clr。 OI拥有计划的粗略大纲,但是鉴于我缺乏经验,对此将有所帮助。

看来我可以使用Soap服务进行计划和管理。 这很简单。

我计划的其余部分听起来很疯狂。 任何更正,指导和更好的建议都将受到欢迎。 也许是另一种方法。 报表服务器是一个很大的安全漏洞,如果我仅参考报表名称步伐就可以满足要求,请指出正确的方向。 如果没有,这是经过3天的研究和一些msdn简单教程之后我拼凑的过程。 开始:

为了成功创建报告定义,我将需要引用整个超集中所有可能的字段。 目前尚不清楚表的超集是否与图形的超集相同,但是对于此POC,我将假定它们是相同的。 这样,我只需要一个带有输入参数的存储过程即可识别正确的查询,我将选择并执行该查询。 结果集将是可能字段的一小部分子集,但是存储过程将返回每个字段,对于省略的字段的每一行都为空,以便报表了解每个字段。 可怕。 我可能会返回5列包含数据和500个空值。 一定有更好的方法。 考虑性能下降让我感到不安,但这很容易。 现在,我有一个可部署的报告。 我不知道如何处理摘要。 它们是我将附加到结果集的其他查询吗? 也许魔术查询引擎知道。

现在再说一些丑陋的事情。 我必须请求带有标识正确查询的查询字符串的报告URL。 我猜我也可以使用正确的参数设置调度程序。 但是男人我有问题。 我可以使用httpWebRequest来调用下载的url,但是调度程序如何工作? 我可以想象它会以类似的方式创建报告,并且我应该能够以哪种格式告诉它。 但是对于下载,我将流式传输html。 我如何告诉报表服务器将其转换为pdf,然后将其作为流传输? 可以在部署之前在报告定义中进行设置吗? 在报表服务器上播放时,转换没有问题。 但是至少我已经找到了一种通过Web api访问报表服务器的方法来保护报表服务器的安全。 然后是清理空列的问题。 有扩展点,例如数据处理扩展。 我认为这些几乎类似于Web页面生命周期中的一个步骤,但不能完全确定,否则将其称为事件。 我需要找到合适的一个,这样我就可以删除饼图上的空数据列或标签(空百分比),如果这不会破坏报告的话。 而且我仍然需要在rdl时执行此操作。 也许如果我仍然找不到方法,请将rdl转换为pdf并更改内容类型。 看来我可以在扩展点添加.net程序集。 但是,这是正确的吗? 我在想像开发人员,而不是经验丰富的SSRS专业人士。 我正在尝试,但是任何将我推向正确方向的帮助将不胜感激。

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

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

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

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

掌握了所有这些知识之后,我发现了几种解决方案路径,但是对于我的目的而言,它们都不都是最佳的,因此我转向了完全不涉及报告服​​务或RDL的解决方案。 但是这些可能对其他人有用。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM