1

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

我无法解决这个问题,所以我决定将报告的下半部分移到子报告中。因此,我从一份庞大的、无响应的报告开始,以两份易于管理的小型报告结束——令人惊讶的是,这确实有效。

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

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

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

4

6 回答 6

3

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

为子报表提供数据 - SubreportProcessing 事件 要为子报表提供数据,您必须处理 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()));
}

如果您的报表有多个子报表,您可以查看 SubreportProcessingEventArgs 的 ReportPath 属性并为相应的子报表提供数据。您可能还想检查 SubreportProcessingEventArgs 的 Parameters 属性的值,并仅返回与子报表参数对应的数据子集,如此处所述。

于 2012-05-05T16:44:36.847 回答
0

我很确定你不能。您可能最好寻找完全重新设计报表的方法,使其不那么大......更不用说导出到excel时子报表的各种问题。

于 2009-02-20T21:09:42.330 回答
0

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

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

于 2009-03-04T10:17:21.127 回答
0

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

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

希望这可以帮助,

账单

于 2009-05-18T22:39:27.757 回答
0

您可以使用虚拟参数来做到这一点:

一世。在主报告“MyData”中创建一个参数并勾选“internal”

ii. 将“MyData”的默认值设置为您的数据集

iii. 用表达式设置子报表参数

=Parameters!MyData.Value

希望这会有所帮助,邓肯

于 2009-07-03T17:06:28.567 回答
0

如果你创建一个表格,你可以合并明细行的所有单元格,并把一个子报表作为内容。然后将子报表的参数设置为要对其运行子报表的字段。

杰森

于 2009-07-29T20:09:39.220 回答