我正在使用SQL Server Reporting Services和Visual Studio附带的报表设计器。我有一个非常大的报告。它实际上是如此之大以至于Visual Studio挂起(有时一次持续数小时)或者当我进行更改时崩溃。
我无法解决问题,所以我决定将报告的下半部分移到子报告中。所以,我从一个巨大的,无反应的报告开始,最后得到两个小的,可管理的报告 - 令人惊讶的是,这确实有效。
一个问题:我的子报表使用与主报表相同的数据。现在,它通过重新查询数据库来填充其数据集。额外的数据库往返会导致报告生成时间的两倍;生成从45分钟到1.5小时。
我想避免再次访问数据库,而是在两个报告中使用相同的数据集。
如何在报表和子报表之间共享或传递数据集?
答案 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)
如果创建表,则可以合并详细信息行的所有单元格,并将子报表作为内容。然后将子报表的参数设置为要运行子报表的字段。
杰森