首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在代码中应用报表筛选器

在代码中应用报表筛选器
EN

Stack Overflow用户
提问于 2012-10-05 16:01:31
回答 1查看 2.5K关注 0票数 2

我的具体问题可能过于本土化了,但我要问的一般性问题是,我相信其他人会问一些问题,并对此表示怀疑:

一般问题:在中,是否可以对代码中的报表应用筛选器?如果没有,是否可以根据变量的值在报表筛选器中使用分支,您可以向我指出文档或解释如何实现。

我的具体例子如下,为了进一步阐述我所说的上述内容,以防我措辞不当:

我正在学习SSRS,而docs和Google正在出现短缺。

期望的效果是,我们有一个基于事件跟踪系统的报告。在这个系统中,我们有各种可以跟踪事件的团队: IT操作、开发、安全等等。每个团队都有指定的团队成员。

  • 我们有一份显示所有事件的基本报告。
  • 我们添加了一个名为"LimitByTeam“的布尔参数,它会像您所期望的那样在报表上生成一个CheckBox。
  • 我们添加了一个接受多个值的字符串参数。允许的值来自列出团队的数据集。这将预期的下拉列表添加到报表中,允许用户选择一个或多个团队。
  • 我们添加了一个包含团队和团队成员的数据集。

如果没有选择CheckBox,我们希望显示所有事件。(违约)

如果它被选中,我们希望根据创建事件票据的人的登录ID筛选报告。

如果我要在SQL中这样做,我会把它作为

代码语言:javascript
运行
复制
Select 
   (ticket fields) 
From 
   Table 
WHERE TicketCreator IN (
             Select LoginId FROM TeamMembersTable 
             WHERE TeamName in ('IT Ops', 'Developers'))

在SQL中,或者在VB中,这很简单。

在SSRS中,我并不是很清楚如何做到这一点。我已经弄清楚,我可以使用自定义代码来做更复杂的逻辑使用VB (它似乎是VB.NET.万岁!熟悉的地区)

因此,我添加了自定义代码,并验证了我可以读取report参数的值,但是,如果参数值为True,则无法确定如何应用筛选器。这是我得到的。

代码语言:javascript
运行
复制
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库的中的所有东西,找不到它,或者任何类似于我正在尝试的方法的东西。

我也尝试这样做,因为我想我找到了一种使用这个函数的方法:

代码语言:javascript
运行
复制
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 DataSets是另一回事。

我是不是漏掉了一些显而易见的东西?我是否应该放弃在报表中以这种方式过滤,而尝试另一条轨道,比如更改DataSet中的原始查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-05 17:46:40

我不太喜欢SSRS中的布尔参数(或者SSRS中的BIT )。你不能写这样的东西

代码语言:javascript
运行
复制
WHERE @MyBool OR @MyOtherBool

它必须是

代码语言:javascript
运行
复制
WHERE @MyBool = 1 or @MyOtherBool = 1

因此,如果我有一个带有一个名为MyBoolParam的布尔值的SSRS报告和一个名为MyMultiSelectTextParam的多值文本参数,那么这样的SQL查询就可以了:

代码语言:javascript
运行
复制
SELECT 
   MyField,
   MyOtherField
FROM
   MyTable t
WHERE
   @MyBoolParam = 1
   OR
   t.MyField IN ( @MyMultiSelectTextParam)

(我最喜欢的布尔参数替代方法实际上是一个带有可能值的字符串,但它将以同样的方式在查询中处理。)

如果您不能轻松地更改SQL查询(例如使用第三方SP),那么也可以通过向SSRS DataSet添加一个筛选器来完成相同的任务。右键单击报表数据窗格中的DataSet并查看Dataset属性。“筛选器”窗格将允许您添加对每一行进行评估的条件。我还没有在多值参数中使用这些参数,但是IN操作符应该可以实现这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12749948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档