SSRS 钻取相关分组参数
SSRS Drilling through on dependent grouped parameters
有人要求我根据父报表的名为项目的多值参数向钻取报表添加一个组。
该组在父图表上完美运行,但是当深入到子图表时,尽管出现在列表中,但依赖于项目的其他参数未被 selected。
例如,项目参数控制另一个多select 团队参数的可用选项。当多个项目被 selected 时,您可以 运行 跨多个团队的报告,当 select 从分组报告中编辑单个项目时,这限制了子项中的团队过滤器,尽管有一些子 none 中可用的主报告的原始参数是 selected.
将参数传递给钻取报表时,我能否从按分组项目参数过滤的父团队参数生成子列表?
伪 LINQ 示例:
=Parameters!TeamIds.Where(t => t.ProjectId == Fields!ProjectId.Value)
或者有什么方法可以将完整的团队列表传递给子报告,并将报告传递给 select 与 selected 项目匹配的团队?
编辑
父报表和子报表中项目参数的可用值:
select id, header from projects
父报告和子报告中团队参数的可用值:
select t.id, t.header from teams t where t.ProjectId = @ProjectId
当 运行 生成报告时,我们会在分组网格中显示大量数据,并对 运行 另一个报告进行操作。
此钻取传递完整的团队列表。这会停止子报告,因为传入的某些团队不是有效值。然后子报告不会自动运行并强制用户重新select团队。
尽管 Drillthrough 从主要参数隐式设置团队。
我认为这是由于子报告无法处理最初 select 在主报告中编辑的多个团队项目而导致的。
我的问题是如何:
a) 过滤团队参数以仅包括我select已钻取
的项目
或
b) 使子报告接受传递给它的完整团队列表,并且仅 select 来自基于单个项目
的新筛选团队列表中的适当团队
编辑 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
开始尝试整理一些代码来挑选团队,但我似乎无法让集合 return 工作,现在我称之为
=Code.GetTeamsForProject(Parameters!TeamIds,CSTR(Parameters!ProjectId.Label(0)))
这只是 return我正在使用的文本框中的#Error。
希望有人至少可以发现 'deliberate' 错误。
谢谢
编辑 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)
正如您所建议的,核心问题似乎是传递给子报告的参数被子报告认为无效。
似乎有两个方向可以解决此问题:一,过滤掉您发送的作为父级参数值传递的内容,或者二,允许所有传入的值。似乎不知道报告的结构像其中的第二个更容易。如果您在子报告中接受额外的团队,是否会导致报告显示不正确的值?
也就是说,如果您将子报告中团队参数的可能值更改为:
select t.id, t.header from teams t
直接使用肯定会限制子报表的用处,但是用户会直接进入子报表吗?
另一种选择是在子报表中创建两个参数。 PassthroughTeams
将是一个由父级传入的隐藏参数。
团队将保持原样,但有一些默认值(可能是所有可能的团队)
然后将子报表的核心数据查询改成这样:
SELECT mydata.*
FROM mydata
WHERE mydata.teamId IN (@TeamIds)
AND mydata.teamId IN (@PassthroughTeams)
终于找到了一个可行的解决方案,我将项目 header 添加到团队参数中,以便我可以在传递中使用团队的标签。
原代码的一些问题:
ifs
中缺少 'Then'
instr 或 contains 可能缺少引用,因此转而使用 startsWith 函数
Public Function startsWith(str As String, prefix As String) As Boolean
startsWith = Left(str, Len(prefix)) = prefix
End Function
Public Function GetItemsForProject(ByVal ItemWithProjectInHeader as Parameter, ByVal ProjectHeader as String) as Collection
Dim s as new Collection
If ItemWithProjectInHeader.IsMultiValue Then
For i as integer = 0 to ItemWithProjectInHeader.Count-1
If startsWith(ItemWithProjectInHeader.Label(i), ProjectHeader) Or startsWith(ItemWithProjectInHeader.Label(i), "(Not") Then
s.Add(ItemWithProjectInHeader.Value(i))
End If
Next
Else
If startsWith(ItemWithProjectInHeader.Label(0), ProjectHeader) Then
s.Add(ItemWithProjectInHeader.Value(0))
End If
End If
Return s
End Function
有人要求我根据父报表的名为项目的多值参数向钻取报表添加一个组。
该组在父图表上完美运行,但是当深入到子图表时,尽管出现在列表中,但依赖于项目的其他参数未被 selected。
例如,项目参数控制另一个多select 团队参数的可用选项。当多个项目被 selected 时,您可以 运行 跨多个团队的报告,当 select 从分组报告中编辑单个项目时,这限制了子项中的团队过滤器,尽管有一些子 none 中可用的主报告的原始参数是 selected.
将参数传递给钻取报表时,我能否从按分组项目参数过滤的父团队参数生成子列表?
伪 LINQ 示例:
=Parameters!TeamIds.Where(t => t.ProjectId == Fields!ProjectId.Value)
或者有什么方法可以将完整的团队列表传递给子报告,并将报告传递给 select 与 selected 项目匹配的团队?
编辑
父报表和子报表中项目参数的可用值:
select id, header from projects
父报告和子报告中团队参数的可用值:
select t.id, t.header from teams t where t.ProjectId = @ProjectId
当 运行 生成报告时,我们会在分组网格中显示大量数据,并对 运行 另一个报告进行操作。
此钻取传递完整的团队列表。这会停止子报告,因为传入的某些团队不是有效值。然后子报告不会自动运行并强制用户重新select团队。
尽管 Drillthrough 从主要参数隐式设置团队。 我认为这是由于子报告无法处理最初 select 在主报告中编辑的多个团队项目而导致的。
我的问题是如何:
a) 过滤团队参数以仅包括我select已钻取
的项目或
b) 使子报告接受传递给它的完整团队列表,并且仅 select 来自基于单个项目
的新筛选团队列表中的适当团队编辑 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
开始尝试整理一些代码来挑选团队,但我似乎无法让集合 return 工作,现在我称之为
=Code.GetTeamsForProject(Parameters!TeamIds,CSTR(Parameters!ProjectId.Label(0)))
这只是 return我正在使用的文本框中的#Error。 希望有人至少可以发现 'deliberate' 错误。 谢谢
编辑 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)
正如您所建议的,核心问题似乎是传递给子报告的参数被子报告认为无效。
似乎有两个方向可以解决此问题:一,过滤掉您发送的作为父级参数值传递的内容,或者二,允许所有传入的值。似乎不知道报告的结构像其中的第二个更容易。如果您在子报告中接受额外的团队,是否会导致报告显示不正确的值?
也就是说,如果您将子报告中团队参数的可能值更改为:
select t.id, t.header from teams t
直接使用肯定会限制子报表的用处,但是用户会直接进入子报表吗?
另一种选择是在子报表中创建两个参数。 PassthroughTeams
将是一个由父级传入的隐藏参数。
团队将保持原样,但有一些默认值(可能是所有可能的团队)
然后将子报表的核心数据查询改成这样:
SELECT mydata.*
FROM mydata
WHERE mydata.teamId IN (@TeamIds)
AND mydata.teamId IN (@PassthroughTeams)
终于找到了一个可行的解决方案,我将项目 header 添加到团队参数中,以便我可以在传递中使用团队的标签。
原代码的一些问题:
ifs
中缺少 'Then'instr 或 contains 可能缺少引用,因此转而使用 startsWith 函数
Public Function startsWith(str As String, prefix As String) As Boolean
startsWith = Left(str, Len(prefix)) = prefix
End Function
Public Function GetItemsForProject(ByVal ItemWithProjectInHeader as Parameter, ByVal ProjectHeader as String) as Collection
Dim s as new Collection
If ItemWithProjectInHeader.IsMultiValue Then
For i as integer = 0 to ItemWithProjectInHeader.Count-1
If startsWith(ItemWithProjectInHeader.Label(i), ProjectHeader) Or startsWith(ItemWithProjectInHeader.Label(i), "(Not") Then
s.Add(ItemWithProjectInHeader.Value(i))
End If
Next
Else
If startsWith(ItemWithProjectInHeader.Label(0), ProjectHeader) Then
s.Add(ItemWithProjectInHeader.Value(0))
End If
End If
Return s
End Function