根据参数在s-s-rS中隐藏子报告(并且不执行存储过程)

Posted

技术标签:

【中文标题】根据参数在s-s-rS中隐藏子报告(并且不执行存储过程)【英文标题】:Hiding Sub report in s-s-rS based on Parameter (and not executing the Stored Procedure) 【发布时间】:2012-04-25 18:15:40 【问题描述】:

我有一个问题,我希望根据传递给主报告的参数隐藏/显示子报告。

我可以使用将隐藏/显示子报表的表达式设置隐藏属性,但我使用 SQL Profiler 发现,即使子报表被隐藏,子报表存储过程仍会执行.

除了更改存储过程本身之外,是否有人知道避免这种情况的方法。 如果没有,即使子报告被隐藏了,是否有人知道执行存储过程的原因?

【问题讨论】:

【参考方案1】:

s-s-rS 中的隐藏报表元素仍在处理中 - hidden 属性只是确定它们是否显示在输出中。

确保过程仅在条件下执行的一种方法是将数据集中存储过程的名称更改为表达式 - 类似于:

=iif(Parameters!RunMyDataset.Value="Y","sp_MyDataSet","sp_Dummy")

- 其中 sp_Dummy 是执行最少处理的存储过程(例如SELECT NULL)。

【讨论】:

虚拟 sp 是否不必返回与原始 sp 相同的列? @astander:如果没有,在 BIDS 中预览时,报告会生成许多警告(但没有错误)。因此,理想情况下,最好在虚拟过程中生成相同的列集(以防止生成这些警告),但这不是必需的。 这意味着我必须为每个子报表/sp 创建一个虚拟 sp,并且必须为每个需要隐藏的子报表维护 2 个 SP。您知道 MS 决定背后的原因是强制执行 SP 吗?无论如何,我将不得不考虑其他事情,因为我不希望 SP 内置显示逻辑以提高可见性。 @astander:正如我所说,这不是必需的。您可以使用单个虚拟存储过程而忽略警告(我不希望最终用户看到)。 对我来说仍然像是一个黑客。如果您可以完全根据要求避免 SP 调用,那就更好了。【参考方案2】:

有一种方法可以解决这个问题。根据您对问题的描述。例如,您有 4 个子报表并将它们命名为 page1 到 page4。主报告会将参数“Investor_ID”值传递给所有这 4 个页面。在主报表中,您需要创建 4 个布尔参数并设置子报表的隐藏属性来控制这 4 个子报表是否可见。

例如,使用表达式=iif(Parameters!Page1.Value = true, false, true),这样当您为参数page1 选择true 时,page1 将显示,否则将隐藏。

然后您需要在“子报表属性”中为子报表配置参数。

对于子报表所需的参数Investor_ID,在值中选择表示并使用=IIF(Parameters!Page1.Value = true, Fields!Investor_ID.Value, nothing)。这意味着如果您选择隐藏 page1,则 mainreport 不会将任何内容传递给子报表 page1。然后 Page1 将不会运行并会显示“错误:无法显示子报表”,因为 Investor_ID 参数为空。但是我们隐藏了那个子报告。所以page1不会出现。

通过这种方式,您可以控制隐藏的子报表是否执行。

【讨论】:

【参考方案3】:

    右键单击主报表中的子报表对象,然后选择“格式化子报表...”。这将打开格式编辑器。

    在格式编辑器中选择“子报表”选项卡。

    勾选“禁止空白子报表”复选框。

【讨论】:

以上是关于根据参数在s-s-rS中隐藏子报告(并且不执行存储过程)的主要内容,如果未能解决你的问题,请参考以下文章

子报告中的 s-s-rS 2008 交互式排序未按预期工作

RDLC 子报告

需要子报告上的页码从 s-s-rS 中的 2 开始

使用 C# 自定义代码从主报告 s-s-rS 调用子报告

子报表可见性

s-s-rS 有条件地运行 SQL/DataSet