我的具体问题可能过于本地化,但我要问的一般问题是我确信其他人会问并想知道的问题:
一般问题:在 Sql Server Reporting Services 中,是否可以在代码中对报表应用过滤器?如果没有,是否可以根据变量的值在报告过滤器中使用分支,您能否指出我的文档或解释如何执行此操作。
下面是我的具体示例,以扩展我上面的意思,以防我措辞不好:
我正在学习 SSRS,而文档和谷歌都快来不及了。
期望的效果是我们有一个基于事件跟踪系统的报告。在这个系统中,我们有不同的团队可以跟踪事件:IT Ops、开发、安全等。每个团队都有分配的团队成员。
- 我们有一个显示所有事件的基本报告。
- 我们添加了一个名为“LimitByTeam”的布尔参数,如您所料,它会在报告上生成一个 CheckBox。
- 我们添加了一个接受多个值的字符串参数。允许的值来自列出团队的数据集。这在报告中添加了预期的下拉列表,允许用户选择一个或多个团队。
- 我们添加了一个包含团队和团队成员的数据集。
如果未选中 CheckBox,我们希望显示所有事件。(默认)
如果选择它,我们希望根据创建事件单的人的登录 ID 过滤报告。
如果我在 SQL 中这样做,我会这样做
Select
(ticket fields)
From
Table
WHERE TicketCreator IN (
Select LoginId FROM TeamMembersTable
WHERE TeamName in ('IT Ops', 'Developers'))
在 SQL 或 VB 等中,这很简单。
在 SSRS 中,我并没有弄清楚如何做到这一点。我已经弄清楚我可以使用自定义代码使用 VB 执行更复杂的逻辑(它似乎是 VB.NET。万岁!熟悉的领域)
所以我添加了自定义代码并验证我可以读取报告参数的值,但是如果参数值为 True,我终生无法弄清楚如何应用过滤器。这就是我所拥有的。
Public Sub ApplyTeamFilter()
' Report.Parameters("LimitByTeam") is a
' boolean report parameter that I'm able to access
' so I've got the IF statement worked out
If Report.Parameters("LimitByTeam").Value = True Then
' Pseudo-code - I'm looking for something like Report.Filters.Add(filterstatement)
' Alternatively a way to change this to a function to return a list of items from
' the Team MembersTable table and use it in a custom expression.
End If
End Sub
问题是我似乎无法在 Report 对象上找到 Filters 属性,或者任何可以让我找到它的方法。因为我在那里找不到它,所以我将搜索扩展到MSDN 库的这一部分中的所有内容,但找不到它,或者任何与我正在尝试的方法相似的东西。
我也在尝试做这样的事情,因为我想我看到了一种使用这个功能的方法:
Public Function IsLoginIdInTeam(ByVal LoginId as String, byVal Team As String) As Boolean
' Report.Parameters("LimitByTeam") is a
' boolean report parameter that I'm able to access
' so I've got the IF statement worked out
If Report.Parameters("LimitByTeam").Value = False Then
Return True ' Default
Else
' Access the TeamMembers table and look for a match
' Something like
' Convert.ToBoolean(Report.DataSets!TeamMembers.Compute(Count, "TeamName = '" & Team & "' AND LoginId = '" & LoginId & "'")
End If
End Function
但我也不知道如何访问报告中的数据集,更不用说与它们交互的语法了。伪代码适用于 System.Data.DataTable,但我怀疑 SSRS 数据集是另一种野兽。
我错过了一些非常明显的东西吗?我是否应该放弃在报告中以这种方式进行过滤,并尝试另一个轨道,例如更改 DataSet 中的原始查询?