2017-04-26 27 views
0

我在ASPX页面的ReportViewer控件中有大量的报告作为ServerReport运行。在代码中设置报告数据集参数

每个报告使用相同的3个共享数据集。每个数据集至少有一个参数。

我需要传递一个值(在运行时)到每个这些数据集的参数,但无法想象如何这样做。

我尝试使用ReportViewer1.ServerReport.GetDataSources()但它撒谎,说有零个数据集时,我知道有一些...

我知道我可以隐藏参数添加到每个报告,但是这意味着几十修改的报告所有在完全相同以同样的方式,这令我打破了DRY原则 ...

任何建议,好吗?

+0

您是如何设法将参数传递给报表中的数据集的,而报表本身没有参数? – Rich

+0

共享数据集有一个参数(传递给底层存储过程),默认为NULL。这工作。 – radders

+0

它的工作原理是它执行,但没有报告传入参数,这可能意味着报告无法影响数据集,即使在SSDT中预览也是如此。 – Rich

回答

0

这里有几个选项发生在我身上。

选项1:按照您的建议将参数添加到报告中。我不认为这是违反任何原则的,因为报告是封装的单位,并且您设计的报告本身是可参数化的(或不是)。作为C#报告的调用者,您不需要知道幕后的数据集,因为它是您与之交互的报告。

或者,你需要找到一种方式,该报告是不知道该数据集在运行时参数化,所以......

选项2:制作一个存储过程,采用参数,确实数据集做什么,并将结果放在一个表格中。在调用任何报告之前,以编程方式调用它。报告数据集然后可以从结果表中获取他们的数据。

选项3:在运行时将运行时参数弹出到临时表中,以便数据集可以从数据库中为自己选择它,而不需要它作为数据集的参数。

选项4:探索caching Shared Datasets。 这听起来像可能是一个死胡同,但你有可能找到一种方法让所有的报告都使用新的缓存版本的数据。

+0

谢谢丰富。选项0将是我的选择 - 将值传递给数据集,但这似乎不可能...认为我坚持选项1作为2和3似乎更多的工作,收益甚微。选项4并不能解决问题,但在用户可能看到大量报告时有其优点... – radders

+0

“...报告是封装的单位...” - 我认为它不是当使用共享数据集...当然,该对象成为最低共同分母? – radders

+0

如果您可以通过编程方式调用数据集而不通过报告,那么您的参数将是有效的。但报告为您的调用代码提供了唯一的接口 - 它如何获取其数据取决于报告。恰巧,报告的设计者决定进一步分解这一实现。就C#调用而言,该报告是封装的单位,因为这就是与它进行交互的一切。同样,如果一堆报告选择使用共享程序集来决定颜色,那么这取决于报告,而不是调用代码。 – Rich

相关问题