【问题标题】:SSRS Drilling through on dependent grouped parametersSSRS 钻取依赖的分组参数
【发布时间】: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


【解决方案1】:

正如您所建议的,核心问题似乎是一个参数被传递到子报告中,而子报告认为该参数无效。

似乎有两个方向可以解决这个问题:一,过滤您发送的作为参数值从父级传递的内容,或者二,允许所有传入的值。不知道报告的结构似乎其中第二个更容易。如果您在子报告中接受了额外的团队,是否会导致报告显示不正确的值?

也就是说,如果您将子报表中 Team 参数的可能值更改为:

select t.id, t.header from teams t

直接使用时肯定会限制子报表的实用性,但用户会直接使用子报表吗?

另一种选择是在子报表中创建两个参数。 PassthroughTeams 将是由父级传入的隐藏参数。 团队会保持原样,但有一些默认值(可能是所有可能的团队)

然后将子报表的核心数据查询改为:

SELECT mydata.*
FROM mydata
WHERE mydata.teamId IN (@TeamIds)
   AND mydata.teamId IN (@PassthroughTeams) 

【讨论】:

  • 我已经考虑过 pass through 参数,这有一个问题,对于每个像团队这样的参数,我必须添加一个额外的 passthrough,目前只有 3 或 4 个需要这个,即可维护(我猜),但如果报告会增长,它可能会变得难以管理。我更喜欢一种编码方法来分选一组团队,因为我正在尝试,但如果失败了,我可能不得不使用这种方法。谢谢你的回答!
  • 我有一个代码解决方案,如果您有兴趣,请查看我的答案,但感谢您的帮助:)
【解决方案2】:

终于找到了一个可行的解决方案,我将 Project 标头添加到团队参数中,以便我可以在传递中使用团队的标签。

原代码的一些问题:

缺少 ifs 中的“Then”

instr 或包含的可能缺少引用,因此转移到使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    相关资源
    最近更新 更多