2009-02-20 68 views
1

我正在使用SQL Server Reporting Services和Visual Studio附带的报表设计器。我有一个真的很大报告。实际上Visual Studio的挂起时间很长(一次有时需要几个小时),或者只是在进行更改时崩溃。将数据集传递给SQL Server Reporting Services的子报表

我可以做的很少,我可以解决这个问题,所以我决定将报告的下半部分转换为子报告。所以,我从一个巨大的,反应迟钝的报告开始,并以两个小巧,可管理的报告结束 - 令人惊讶的是,这实际上是有效的。

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

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

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

回答

0

我很肯定你不能。你可能更愿意寻找方法来完全重新设计报告,这样它就不会那么大了......更不用说在导出到excel时子报表存在的各种问题。

0

我有几个报告说,SQL是如此复杂,因为它试图编辑它时会锁定Visual Studio。在这些报告中,我直接进入代码视图并直接编辑XML,这是可行的。当Visual Studio神奇地让列比我设置的更宽时,我也会这样做。不过,如果您要编辑报告的布局太多,我怀疑你会想要沿着这条路走下去。

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

0

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

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

希望这有助于

比尔

0

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

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

ii。将默认值'MyData'设置为您的数据集

iii。用表达式设置报表参数

=Parameters!MyData.Value 

希望这有助于 邓肯

0

如果你创建一个表,你可以合并的细节行的所有细胞,并把报表的内容。然后将子报表的参数设置为您想要运行子报表的字段。

杰森

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的参数属性 的值,并且仅返回 与子报表参数对应的数据子集,如 在此提及。

相关问题