1

我可以看到已经有很多关于同一件事的问题被问到:

以编程方式将数据源绑定到报表服务器中的 rdl - SSRS

SSRS 使用 Xml 数据源 [WCF],这是可能的,但它是否可取?

和许多其他人......

但是,我真正想要的是在我开始做某事之前得到您的宝贵意见,最终发现自己陷入了死胡同!

我们正在BIDS SSRS 2008环境、VS 2010中为 Web 应用程序开发报告。使用ReportViewer 10ProcessingMode="Remote"

到现在为止,一切都很好.. 将参数传递给报告,与 asp.net 集成等。我的意思是,通过 SQL 查询获取数据(有时通过参数过滤)。我可以使用存储过程,一切正常。

但是现在,有些报告需要根据用户从前端(一个 GridView )中选择的数据,在 asp.net 网页上动态生成,然后在报告上显示该数据。

也就是说,如果用户在 GridView 上选择 10 行并单击打印按钮,那么只有这 10 行(以及其他一些特定于报表的数据)应显示在报表中。这就是我们现在正在升级的遗留系统中的内容。
当然,这不能仅仅通过传递参数来实现,因为GridView上的数据选择完全取决于用户,而且都是动态的。..我现在正在修复中!

那么,对于这些情况,最好的方法是什么?

PS(编辑):那里有解决方案,但它们更适合.rdlc,我说的是.rdl

4

2 回答 2

6

最后我们像下面这样实现它。我想它可能对其他人有用。所以我发布了我的解决方案:
这可以通过实现XML
First convert your data into 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"。因为我们将"list"通过以下数据集将整个 XML 内容传递给它,

现在将处理这个XML的 Dataset :
通常,我们所做的就是你写一些存储过程或在数据集中写一些查询,因为我们是XML,它需要以 XML 方式处理 ,下面的查询来处理XML数据
Query Type: Text

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'
    )

FieldsNAMECONTACT应与您最初在顶部创建的 XML 文档相同ConvertToXML

所以底线是,您不是通过数据库中的存储过程将数据传递给报告,而是实际上从 aspx 页面获取数据 - 代码隐藏并将其转换为 XML 并通过此数据集将其传递给您的报告服务器报告
所以什么在后面的代码中传递给您的报告..

于 2012-11-16T11:54:52.670 回答
0

最有可能的是,您最终可能需要在 Web 应用程序的上下文中运行它们,并手动将数据从数据源提取到报告中。

几年前我做了这个项目,不介意让它恢复运行,最终完成以支持 MVC/Web Forms/Win Forms/WPF/等。以及让它更健壮。

这可能会让你走上正轨。

于 2012-10-25T20:42:53.023 回答