使用SQL Server Reporting Services将数据集传递到子报表

时间:2009-02-20 20:49:48

标签: reporting-services report-designer

我正在使用SQL Server Reporting Services和Visual Studio附带的报表设计器。我有一个非常大的报告。它实际上是如此之大以至于Visual Studio挂起(有时一次持续数小时)或者当我进行更改时崩溃。

我无法解决问题,所以我决定将报告的下半部分移到子报告中。所以,我从一个巨大的,无反应的报告开始,最后得到两个小的,可管理的报告 - 令人惊讶的是,这确实有效。

一个问题:我的子报表使用与主报表相同的数据。现在,它通过重新查询数据库来填充其数据集。额外的数据库往返会导致报告生成时间的两倍;生成从45分钟到1.5小时。

我想避免再次访问数据库,而是在两个报告中使用相同的数据集。

如何在报表和子报表之间共享或传递数据集?

6 个答案:

答案 0 :(得分:3)

我认为这可以帮到你: http://www.gotreportviewer.com/subreports/index.html

  

为子报表提供数据 - SubreportProcessing事件To   提供您必须处理的子报告的数据   SubreportProcessing事件。请注意,此事件位于LocalReport上   宾语。您可以添加如下事件处理程序:

private void MainForm_Load(object sender, EventArgs e)
{
    this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(MySubreportEventHandler);
}
     

以下是事件处理程序的示例。在这个例子中   LoadSalesData被定义为返回DataTable。

void MySubreportEventHandler(object sender, SubreportProcessingEventArgs e)
{
    e.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()));
}
     

如果您的报表有多个子报表,则可以查看ReportPath   SubreportProcessingEventArgs的属性和提供的数据   相应的子报告。您可能还想检查的值   SubreportProcessingEventArgs的参数属性,仅返回   与子报表参数对应的数据子集,如   这里提到。

答案 1 :(得分:0)

我很确定你做不到。您可能最好还是寻找完全重新设计报表的方法,以便它不会那么大......更不用说在导出到Excel时子报表的各种问题了。

答案 2 :(得分:0)

我有几个报告说SQL很复杂,因为当我尝试编辑它时它会锁定Visual Studio。在这些报告中,我直接进入代码视图并直接编辑XML,这是有效的。当Visual Studio神秘地使列比我设置的稍宽时,我也会这样做。但是,如果您过多地编辑报表的布局,我怀疑您是否想要沿着这条路走下去。

是否可以使用两个报告都使用的存储过程构建表,而不是在报表中运行查询?第一个报告运行存储过程来构建表,然后两个报告只是查询报告。如果报告可以由多个用户运行,请注意并发问题。

答案 3 :(得分:0)

您是否尝试过使用列表中的列表,其中两个列表都使用相同的数据集,然后过滤内部列表以仅显示链接到外部列表的记录?

就执行时间而言,45分钟似乎是一个非常长的时间。我假设您已经对执行计划进行了一些分析,以验证您的查询或存储过程是否正在使用有意义的索引?

希望这有帮助,

比尔

答案 4 :(得分:0)

您可以使用虚拟参数:

我。在主报告“MyData”中创建一个参数并勾选“内部”

II。将“MyData”的默认值设置为数据集

III。使用表达式

设置子报表参数
=Parameters!MyData.Value

希望这有帮助, 邓肯

答案 5 :(得分:0)

如果创建表,则可以合并详细信息行的所有单元格,并将子报表作为内容。然后将子报表的参数设置为要运行子报表的字段。

杰森