s-s-rS 2008 R2 错误?仍然?动态隐藏列或 tablix 并导出为 CSV
Posted
技术标签:
【中文标题】s-s-rS 2008 R2 错误?仍然?动态隐藏列或 tablix 并导出为 CSV【英文标题】:s-s-rS 2008 R2 Bug? Still? Dynamically hiding column or tablix and exporting to CSV 【发布时间】:2015-07-14 19:11:16 【问题描述】:我最初认为这将是一项简单的任务,但经过几个小时的研究,我正在阅读在将隐藏字段导出到 CSV 时可能存在 s-s-rS 错误,这无法实现?
我想要做什么:
我有一份包含几列的报告(比如 50 列)。我有一个 REPORT_VERSION 的参数下拉列表,允许用户选择“标准”(所有 50 列)或“快速”(只有 10 列)。我已经能够正确显示这 2 个版本,但是当我将(快速版本)导出到 CSV 时,它会显示所有列(和/或 tablix),而不是结果的样子。
我已经阅读并尝试过:
如果我创建 2 个 tablix 并根据参数值隐藏一个,导出到 CSV 时仍会同时显示可见和隐藏的 tablix。
如果我使用 =IIF(Globals!RenderFormat.Name="CSV", True, False)
- 这不适用于 CSV 输出
更改 DataElementOutput = NoOutput。这会隐藏 CSV 输出中的列或表,但不能根据参数值动态更改。
这可以通过 vbscript 在“自定义代码”部分完成吗?
我阅读的许多文章和线程都可以追溯到 2010-2012 年,希望现在有解决方案吗?我真的在这里。
我们将不胜感激。谢谢
【问题讨论】:
能否将所有列添加到一个矩阵并设置列的隐藏属性。 我已经尝试过了,我可以让报告根据版本吐出正确的结果 - 我无法弄清楚的问题是将报告导出到“CSV”。当我尝试这样做时,它会忽略隐藏的列并显示所有违背整个目的的列。我还尝试过使用 2 个不同的 tablixes 并隐藏其中一个表。一样。它适用于报告结果,但是当我导出到“CSV”时,它会显示两个 tablix,甚至是隐藏在结果中的那个。谢谢! 只是一个想法,但如果将 Express 列的表达式设置为类似 --> =IIF(Globals!RenderFormat.Name="CSV", "",qryMain!Fields. MyField.Value) 嗨 lrb - 我尝试了你的建议(即 =IIF(Globals!RenderFormat.Name="CSV", "",Fields!FIELD_TO_HIDE.Value) 但我收到错误“使用的隐藏表达式在 tablix 中返回的数据类型无效”。在这种情况下,FIELD_TO_HIDE 只是一个常规的 varchar 字段。不确定我是否正确地按照您的建议进行操作。谢谢您的回复! 【参考方案1】:根据您的尝试 #2,我能够让它在 s-s-rS 2008 和 2012 中工作。我创建了一个带有数据源查询的虚拟报告
SELECT 'value1' as col1, 'value2' as col2
然后我将以下表达式添加到 Column Visibility 到 column2
=IIF(Globals!RenderFormat.Name="CSV", False, True)
请注意,true
和 false
与您的示例相反。生成报告时,第 2 列被隐藏,但在导出为 CSV 时,第 2 列存在。
要将您的参数合并到可见性表达式中,您可以执行以下操作
=Switch(
Globals!RenderFormat.Name="CSV", False,
Parameters!REPORT_VERSION.Value = "Standard", False,
True, True
)
如果呈现为 CSV,或者如果“REPORT_VERSION”参数设置为“标准”,这会将列的隐藏属性设置为 false
,否则隐藏该列。需要将此表达式添加到您要在“Express”版本的报告中隐藏的每一列的列可见性中。
编辑
好的,我现在理解这个问题并且可以复制它(我在概念上倒退了)。您可以将列的可见性显式设置为隐藏,并且它不会显示在 CSV 导出中。但是,当您尝试通过表达式控制此设置时,CSV 导出会忽略此设置。
基于数据的导出看起来由“DataElementOutput”属性控制。将此设置为“NoOutput”将从 CSV 输出中抑制该元素。不幸的是,它似乎不能由表达式控制。微软似乎没有任何改变这一点的计划(https://connect.microsoft.com/SQLServer/feedback/details/431073/s-s-rs-programatically-controlling-the-dataelementoutput-property)
Microsoft 连接请求提示创建两个 tablix,并根据提供的参数(即“Express”或“Standard”)过滤掉每个 tablix 的所有结果,另外根据参数值隐藏另一个 tablix。我试过这个,它工作了一半。虽然另一个 tablix 没有结果,但它仍然会导出列标题和一个空白行。
现在我很想知道这个问题有什么好的解决方案。
【讨论】:
嗨,谢恩!我非常感谢您对此的反馈。但是,我已经能够在报告结果中显示标准或快速版本(正确的列数) - 我正在努力解决的是当我导出到 CSV 时,快速版本(在结果中仅显示 10 列),导出所有列。我想要的是当我选择“标准”时显示所有 50 列并导出所有 50 列。当我选择“快速”显示 10 列并仅导出这 10 列时......问题是导出到“CSV”。这更有意义吗?在此先感谢,非常感谢您的帮助 Jay,我试图找到解决方案,但无法找到。我在对答案的编辑中提供了更多详细信息。 非常感谢您的跟进。不幸的是,这正是我最初发现的。 DataElementOutput 属性不能是动态的(带条件的表达式)并且 RenderFormat 表达式忽略 CSV ......因此这不可能完成?能够基于参数返回同一数据集的不同列似乎是一件非常标准的事情,我想只要它不是 CSV,这是可能的。我很困惑微软在这件事上丢了球,我不明白为什么。感谢您的帮助,希望有答案以上是关于s-s-rS 2008 R2 错误?仍然?动态隐藏列或 tablix 并导出为 CSV的主要内容,如果未能解决你的问题,请参考以下文章
s-s-rS 2008 R2 - 无法登录到 localhost/reports
如何使用 VS 2008 BIDS 创建 s-s-rS 2008r2 rdl