我被要求将一个组添加到追溯报告中,具体取决于父报告的名为Projects的多值参数。
此组在父图表上完美运行,但是当钻进子项时,尽管出现在列表中,但仍未选择依赖于项目的其他参数。
例如,project参数控制另一个多选Team参数的可用选项。当选择多个项目时,您可以跨多个团队运行报告,当从分组报告中选择单个项目时,这会限制子项中的团队过滤器,尽管主要报告中的某些原始参数在子项中可用
将参数传递给追溯报表时,是否可以从已分组的Project参数上筛选的父Team参数生成子列表?
Pseudo-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
运行报告时,我们会在分组网格中显示大量数据,并运行其他报告。
此钻取通过完整的团队列表。这会停止子报告,因为传入的某些团队不是有效值。然后,子报告不会自动运行并强制用户重新选择团队。
尽管Drillthrough隐含地从主参数设置团队。 由于子报告无法处理最初在主报告中选择的多个团队项目,我认为这是打破了。
我的问题是我如何:
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)
答案 0 :(得分:0)
正如您所建议的那样,核心问题似乎是将一个参数传递给子报告认为无效的子报告。
似乎有两个方向可以解决这个问题:一,过滤你发送的内容作为来自父项的参数值,或者两个,允许所有进入的值。不知道报告的结构看起来像是其中第二个更容易。如果您在子报告中接受了额外的团队,会导致报告显示错误的值吗?
也就是说,如果将子报告中Team参数的可能值更改为:
select t.id, t.header from teams t
直接使用时,这肯定会限制子报告的有用性,但用户是否会直接查看子报告?
另一种选择是在子报告中创建两个参数。 PassthroughTeams
将是父项传入的隐藏参数。
团队会保持原样,但有一些默认值(可能是所有可能的团队)
然后将子报告的核心数据查询更改为:
SELECT mydata.*
FROM mydata
WHERE mydata.teamId IN (@TeamIds)
AND mydata.teamId IN (@PassthroughTeams)
答案 1 :(得分:0)
最后得到了一个有效的解决方案,我将Project标题添加到了team参数中,以便我可以在传递中使用团队标签。
原始代码的一些问题:
错过'然后'来自ifs
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