【发布时间】:2018-02-08 04:46:39
【问题描述】:
我被要求根据父报表的名为 Projects 的多值参数向钻取报表添加一个组。
该组在父图表上完美运行,但是在深入查看子图表时,尽管出现在列表中,但并未选择依赖于项目的其他参数。
例如,项目参数控制另一个多选团队参数的可用选项。选择多个项目时,您可以在多个团队中运行报告,当从分组的报告中选择单个项目时,只限制孩子中的团队过滤器,尽管有些原始参数来自主节目中的主要报告,则无需选中。 .
将参数传递给钻取报告时,我可以从根据分组项目参数过滤的父团队参数生成子列表吗?
伪 LINQ 示例:
=Parameters!TeamIds.Where(t => t.ProjectId == Fields!ProjectId.Value)
或者,是否有任何方法可以将完整的团队列表传递给子报告,并让报告选择与所选项目匹配的团队?
编辑
父报表和子报表中 Project 参数的可用值:
select id, header from projects
父报表和子报表中 Team 参数的可用值:
select t.id, t.header from teams t where t.ProjectId = @ProjectId
在运行报表时,我们会在分组网格中显示大量数据,并带有运行另一个报表的操作。
此钻取通过了完整的团队列表。这会停止子报表,因为传入的某些团队不是有效值。然后子报表不会自动运行并强制用户重新选择团队。
尽管钻取隐含地从主要参数设置团队。 我认为这是由于子报告无法处理最初在主报告中选择的多个团队项目而造成的。
我的问题是我该怎么做:
a) 过滤团队参数以仅包含我选择钻取的项目
或
b) 使子报表接受传入其中的团队的完整列表,并仅根据单个项目从新过滤的团队列表中选择适当的团队
编辑 2
Public Function GetTeamsForProject(ByVal ItemWithProjectInHeader as Parameter, ByVal ProjectHeader as String) as Collection
Dim s as new Collection
For i as integer = 0 to ItemWithProjectInHeader.Count-1
if ItemWithProjectInHeader.Label(i).Contains(ProjectHeader)
s.Add(ItemWithProjectInHeader.Value(i))
End If
Next
Return s
End Function
开始尝试整理一些代码来挑选团队,但我似乎无法让集合恢复工作,现在我这样称呼它
=Code.GetTeamsForProject(Parameters!TeamIds,CSTR(Parameters!ProjectId.Label(0)))
这只是在我正在使用的文本框中返回#Error。 希望有人至少能发现这方面的“故意”错误。 谢谢
编辑 3
我也在尝试这样的事情
Public Function GetItemsForProject(ByVal ItemWithProjectInHeader as Parameter, ByVal ProjectHeader as String) as Collection
Dim s as new Collection
For i as integer = 0 to ItemWithProjectInHeader.Count-1
if INSTR(1,ItemWithProjectInHeader.Label(i), ProjectHeader,1) > 0
s.Add(ItemWithProjectInHeader.Value(i))
End If
Next
Return s
End Function
并称它为...
=Code.GetItemsForProject(Parameters!TeamIds,Fields!ProjectId.Value)
【问题讨论】:
-
@aduguid 我已经稍微改进了这个问题,我可以创建一个示例报告来显示这一点,但老实说,这是一个非常简单的设置 - 团队在钻取列表时依赖于项目团队不再包括所有试图通过的团队,SSRS 也不再费心尝试选择它可以通过的团队。
-
打开子报表的 URL
-
编辑希望澄清。如果您认为我做了一些错误的假设,请回滚我的更改。
-
用户是否需要能够手动更改子报表上的参数?如果没有,您可以将其设置为隐藏并允许任何可能的值。
-
是的,理想情况下,由于父/子都是独立的报告,正常的用例是限制父级中的数据并钻入子级,但没有什么能阻止用户直接打开子级并且填写这些参数。
标签: reporting-services ssrs-2008