我可以动态创建RDLC并将其传递给报表查看器而不是使用文件吗?

时间:2013-11-18 22:42:47

标签: reporting-services reportviewer rdlc dynamic-rdlc-generation

我的问题是我需要带有变量查询和变量内容/列/等的Ad-Hoc报告。为每个用户定制和保存,我还没有解决方案。

我有一个带有SQL Server数据库的MVC 4 C#应用程序,我有SSRS可用。

我正在使用visual studio报告查看器显示报告。

This是将reportViewer放入Web表单页面的MVC应用程序的简单示例。

报告查看器可以通过更改reportViewer的源数据集ReportPath和ReportServerURL来显示不同的报告

在代码中,我看到示例like this,其中我可以覆盖数据集和RDLC文件的路径,但我想要做的只是将动态生成的数据集和RDLC文件传递给查看器。这样我就可以灵活地在数据库中构建和保存用户的报告模板,然后只需调用它并运行报告。

这可能吗,还是我在错误的树上狂奔?

2 个答案:

答案 0 :(得分:0)

我从这里开始拍摄,可能有一个更好的解决方案,但基本上一个ssrs报告是一个XML文件,

我怀疑你可以根据你的标准(很多痛苦)动态生成这个XML,将文件保存为temp.rdl或rdlc文件(我忘记了哪个),然后从你的reportviewer中调用它控制

如果您的用户负责构建报告,那么只需在报告生成器生成的文件中读取并且将其保存到数据库中就不存在痛苦。

如果您喜欢使用报表服务器,可以与SSRSReportService Web服务连接,有很多选项可以上传报表,分配权限等,希望您能看到我的目标。

希望其中一个选项可以帮助您:)

答案 1 :(得分:0)

我实际上在我工作的一个项目中这样做。我动态生成xml并将其加载到内存流中,然后将其加载到查看器中。我还创建数据集并同时加载它们。 stackoverflow上有一个动态rdlc生成标记,可能还有一些有趣的问题/答案可供查看。

//GenerateRdl returns memory stream of dynamically constructed xml
MemoryStream report = GenerateRdl(rep.fields, selected);
//rvMain is my report viewer on the page            
rvMain.LocalReport.LoadReportDefinition(report);

//this is the main dataset for the report.  I don't do any subreports
//for the reports I generate
ReportDataSource reportData = new
  ReportDataSource("ReportData", ds.Tables[0]);

//I use this for the company logo I'm placing at the top of each report
ReportDataSource logo = new ReportDataSource("LogoDS", GetLogoDataSet().Tables[0]);

rvMain.LocalReport.DataSources.Clear();

rvMain.LocalReport.DataSources.Add(reportData);
rvMain.LocalReport.DataSources.Add(logo);
rvMain.LocalReport.Refresh();