使用 s-s-rS 表达式查看用户从多值参数中选择了哪些选项?

Posted

技术标签:

【中文标题】使用 s-s-rS 表达式查看用户从多值参数中选择了哪些选项?【英文标题】:Using s-s-rS Expressions to see which options a user has selected from a multivalued parameter? 【发布时间】:2013-06-07 18:35:23 【问题描述】:

我正在尝试使用字段表达式针对 s-s-rS 报告中的“总计”列设置过滤器。

我有一个多值参数设置,其中值 value1、value2、value3 和 value4 作为选项。

在过滤器之前,此总计列只是简单地将不同列的整数值相加。我想添加一些功能,您可以在其中检查用户选择了哪些值。

类似下面(伪代码,因为我看不懂语法):

=IIF(Parameters!<Parameter>.Label="value1",Fields!value1.Value,0) +IIF(Parameters!<Parameter>.Label="value2",Fields!value2.Value,0) +IIF(Parameters!<Parameter>.Label="value3",Fields!value3.Value,0) +IIF(Parameters!<Parameter>.Label="value4",Fields!value4.Value,0)

要添加的字段中的所有值都是简单的整数。我将不胜感激任何人都可以提供的帮助。谢谢!

【问题讨论】:

【参考方案1】:

假设一个参数叫做Include,你可以使用这样的表达式:

=IIf(InStr(Join(Parameters!Include.Value, ","), "value1") > 0, Fields!value1.Value, 0)
    + IIf(InStr(Join(Parameters!Include.Value, ","), "value2") > 0, Fields!value2.Value, 0)
    + IIf(InStr(Join(Parameters!Include.Value, ","), "value3") > 0, Fields!value3.Value, 0)
    + IIf(InStr(Join(Parameters!Include.Value, ","), "value4") > 0, Fields!value4.Value, 0)

这使用Join 函数创建所选参数的逗号分隔字符串,检查是否选择了特定参数值,然后将相应的值或 0 添加到总数中。

这是一个带有表达式的简单报告:

选择所有值:

选择了两个值:

【讨论】:

这种方法对于简单的情况来说已经足够了,但它的问题是如果有十个字段分别称为value1value10,那么每次选择value10 时,value1 也将是包括在总数中(如果在多个报告中使用这些字段名称,那么键入和维护这些字段名称也很无聊)。 @ChrisLätta,您可以通过稍微更新IIf 表达式来处理上述情况:IIf(InStr("," &amp; Join(Parameters!Include.Value, ",") &amp; ",", ",value10,")。我为此考虑过自定义代码,但对于四列来说,这可能是一个太过分的步骤。同意更多列,它可能会转向自定义代码。使用自定义代码,在参数值和字段名称之间进行紧密耦合会很有帮助;几乎没有不便,但只是另一个考虑因素。一切都取决于当时的情况。 同意 - 对于一个包含几个字段和不重叠字段名称的报告中的简单案例,您的方法肯定快速简单,+1【参考方案2】:

您可以通过简单的方式实现这一点,而无需将一大堆 IIF 函数串在一起并指定要使用的每个字段。如果要更改字段名称或添加字段怎么办?

使用自定义代码,我们可以有一种简单而可靠的方式来执行此计算。右键单击报告的非设计表面,单击Report Properties...,然后单击Code 选项卡。插入以下代码:

Function CalcTotal (ByVal param As Parameter, flds AS Fields) AS Integer
  Dim Result As Integer
  Result = 0
  If param.IsMultiValue then
    For i as integer = 0 to param.Count-1 
        Result = Result + flds(param.Value(i)).Value 
    Next 
  End If 

  Return Result
End Function

这采用参数object(不是值)并遍历选择的值以使用Fields 集合中的字段执行计算。

现在表达你的意思,只需使用:

=Code.CalcTotal(Parameters!Include, Fields)

【讨论】:

一个不错的选择。但是,我决定使用快速表达式定义的字段。

以上是关于使用 s-s-rS 表达式查看用户从多值参数中选择了哪些选项?的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 中的可选多值参数

在 s-s-rS 2008 中,如何在文本框中同时显示多值参数的标签和值?

在 s-s-rS 中,如何使用多值参数创建动态“位置”条件

需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理

s-s-rS 报告为 Join 表达式提供错误

s-s-rS 多值参数只返回最后一个值