我可以看到有很多问题已经被问到同样的问题 像:
Binding a datasource to a rdl in report server programmatically - SSRS
SSRS using Xml datasource [WCF], its possible, but is it advisable?
和其他许多人......
但是,我真正想要的是在我开始之前得到你宝贵的意见,最后发现自己处于死胡同!
我们正在针对Web应用程序在 BIDS SSRS 2008 环境 VS 2010 中开发报告。
ReportViewer 10 ProcessingMode="Remote"
到目前为止,一切都很好..将参数传递给报告,与asp.net集成等等。我的意思是,通过SQL查询获取数据(有时通过参数过滤)。我可以使用存储过程,一切正常。
但是现在,有些报告需要动态生成,基于用户选择来自前端的数据(GridView),在asp.net网页上,然后在报告上显示该数据。
也就是说,如果用户在GridView上选择10行并点击打印按钮,那么只有那10行(以及其他一些报告特定数据)应该显示在报告中。这就是我们现在正在升级的遗留系统中的所有内容 当然,这不能仅通过传递参数来实现,因为GridView上的数据选择完全取决于用户,并且都是动态的。 ..我现在正在解决这个问题!
那么,对于这些情况,最好的方法是什么?
PS(编辑):有解决方案,但它们更多地与 .rdlc 相关,我说的是 .rdl
答案 0 :(得分:6)
最后我们像下面这样实现它。我想可能对其他人有用。所以我发布了我的解决方案:
这可以通过 XML 的实现来完成
首先将您的数据转换为 XML ,如下所示:
private void ConvertToXml(ref XmlDocument xm)
{
const string header = @"<ENVELOPE>";
var strenvelopes = "";
GridItemCollection selectedRows;
selectedRows = dgAddressList.SelectedItems;
if (selectedRows.Count > 0)
{
foreach (GridItem item in dgAddressList.SelectedItems)
{
strenvelopes += @"<ADDRESS>" +
"<NAME>" + "<![CDATA[" + ((object[])(item.DataItem))[2].ToString() + "]]>" + "</NAME>" +
"<CONTACT>" + "<![CDATA[" + ((object[])(item.DataItem))[1].ToString() + "]]>" + "</CONTACT>" +
"<STREET>" + "<![CDATA[" + ((object[])(item.DataItem))[3].ToString() + "]]>" + "</STREET>" +
"<SUBURBSTATE>" + "<![CDATA[" + ((object[])(item.DataItem))[4].ToString() + "]]>" + "</SUBURBSTATE>" +
"</ADDRESS>";
}
}
const string footer = @"</ENVELOPE>";
var envelopes = header + strenvelopes + footer;
xm.LoadXml(envelopes);
}
您需要替换 ((object[])(item.DataItem))[].ToString()
您自己的值
然后生成如下报告:
private void GenerateReport()
{
var xm = new XmlDocument();
ConvertToXml(ref xm);
var xml = xm.InnerXml.ToString();
rptViewer = ucrvEnvelope.FindControl("rptViewer") as ReportViewer;
if (rptViewer != null)
{
rptViewer.ProcessingMode = ProcessingMode.Remote;
rptViewer.ServerReport.ReportServerUrl = new Uri("http://localhost/MyReports");
rptViewer.ServerReport.ReportPath = "/Reporting/rptEnvelope";
rptViewer.PromptAreaCollapsed = true;
}
ReportParameter myParam = new ReportParameter("list", xml);
rptViewer.ServerReport.SetParameters(new ReportParameter[] { myParam });
rptViewer.ShowParameterPrompts = false;
rptViewer.ShowBackButton = true;
rptViewer.ServerReport.Refresh();
}
您应在报告中添加参数 "list"
。因为我们将通过以下数据集将整个XML内容传递给 "list"
,
现在将处理此 XML 的数据集:
通常,我们做的是你在数据集中编写一些存储过程或编写一些查询,因为我们的是 XML ,需要处理 XML方式,
使用 Query Type: Text
编写以下查询来处理 XML数据
DECLARE @docHandle int DECLARE @xmlDocument varchar(max); DECLARE @listXML nvarchar(max)
SET @listXML = @list
SET @xmlDocument = @listXML EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
SELECT * FROM OPENXML (@docHandle, N'/ENVELOPE/ADDRESS') WITH
(
NAME nvarchar(max) 'NAME',
CONTACT nvarchar(max) 'CONTACT',
STREET nvarchar(max) 'STREET',
SUBURBSTATE nvarchar(max) 'SUBURBSTATE'
)
字段 NAME
, CONTACT
等应该与您首先创建XML文档的内容相同顶部 ConvertToXML
所以最重要的是,你没有通过数据库中的strored过程传递数据报告,但你是从aspx页面中获取数据 - 代码隐藏并将其转换为XML并通过此传递给报表服务器报告数据集
那么背后的代码中的内容会传递给您的报告 .. voila !
答案 1 :(得分:0)
最有可能的是,您可能需要在Web应用程序的上下文中运行它们,并手动将数据从数据源提取到报告中。
几年前我做了this项目,并且不介意让它恢复运行,最后完成支持MVC / Web Forms / Win Forms / WPF /等。以及让它更健壮。这可能会让你走上正轨。