SSRS钻取依赖分组参数

时间:2018-02-08 04:46:39

标签: reporting-services ssrs-2008

我被要求将一个组添加到追溯报告中,具体取决于父报告的名为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

Parameters

运行报告时,我们会在分组网格中显示大量数据,并运行其他报告。

Drillthrough

此钻取通过完整的团队列表。这会停止子报告,因为传入的某些团队不是有效值。然后,子报告不会自动运行并强制用户重新选择团队。

enter image description here

尽管Drillthrough隐含地从主参数设置团队。 由于子报告无法处理最初在主报告中选择的多个团队项目,我认为这是打破了。

Action

我的问题是我如何:

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) 

2 个答案:

答案 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