我的具体问题可能过于局部化了,但我要问的一般性问题是我确信其他人会问并想知道:
一般问题:在Sql Server Reporting Services中,是否可以在代码中对报表应用过滤器?如果没有,是否可以根据变量的值在报表过滤器中使用分支,并且可以指向文档或解释如何执行此操作。
我的具体例子如下,以扩展我的意思,以防万一我的措辞:
我正在学习SSRS,而文档和谷歌正在缩短。
期望的效果是我们有一个基于事件跟踪系统的报告。在这个系统中,我们有各种团队可以跟踪事件:IT运营,开发,安全等。每个团队都有团队成员分配。
如果未选中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。HOORAY!熟悉的领域)
所以我添加了自定义代码并验证我可以读取报告参数的值,但是如果参数值为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属性,或者找不到任何让我找到它的方法。由于我在那里找不到它,我将搜索范围扩展到section of the MSDN library中的所有内容,无法找到它,或者甚至远远类似于我正在尝试的方式。
我也在尝试这样做,因为我觉得我看到了一种使用这个功能的方法:
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是一个不同的野兽。
我错过了一些令人目眩的明显事物吗?我是否应该放弃在报告中以这种方式过滤,并尝试其他跟踪,例如更改DataSet中的原始查询?
答案 0 :(得分:1)
我不是SSRS中的布尔参数(或者SQL中的BIT
)的忠实粉丝。)你不能写像
WHERE @MyBool OR @MyOtherBool
需要
WHERE @MyBool = 1 or @MyOtherBool = 1
因此,如果我有一个名为MyBoolParam
的布尔值的SSRS报告和一个名为MyMultiSelectTextParam
的多值文本参数,那么这样的SQL查询将起作用:
SELECT
MyField,
MyOtherField
FROM
MyTable t
WHERE
@MyBoolParam = 1
OR
t.MyField IN ( @MyMultiSelectTextParam)
(我对布尔参数的首选替代方法实际上是一个包含可能值的字符串,但它将以相同的方式在查询中处理。)
如果您无法轻松更改SQL查询(例如使用第三方SP),那么您也可以通过向SSRS DataSet添加过滤器来完成相同的操作。右键单击“报表数据”窗格中的DataSet,然后查看“数据集属性”。 “过滤器”窗格将允许您添加为每行评估的条件。我没有使用这些多值参数,但IN运算符应该适用于此。