SSRS Iif评估真假

时间:2018-01-30 16:41:50

标签: reporting-services iif

MSDN声明SSRS将评估Iif语句的true和false部分,无论返回哪一个。这似乎使Iif在避免错误方面完全没用。换句话说,你不能使用Iif绕过错误,所以基本上你选择包含的任何操作必须始终有效,无论条件如何。老实说,这有什么用呢?

所以我的问题是......除了Iif之外,SSRS还有其他评估条件的方法吗?

这是我的例子。我只想在不抓住比赛的第一个角色的情况下返回左路。

=Iif
(
    InStr(Fields!SearchField.Value, Fields!Criteria.Value) <= 1,    
    "",             
    Left(Fields!SearchField.Value, InStr(Fields!SearchField.Value, Fields!Criteria.Value)-1)                    
)

然而,这里发生的是InStr(Fields!Criteria.Value,Fields!Criteria.Value)-1在某些情况下评估为0,这在语句的FALSE部分试图扣除1之前完全正常从它并传递到InStr函数。 InStr不能接受-1作为要返回的字符数。

对此的过度简化如下。假设你有一种情况,其中Value永远不会低于0而不会抛出错误。

Iif (Value > 0, Value = Value -1, 0)

尝试使用Iif强制值不低于0不起作用,因为即使它们不符合条件,也会对所有这些语句进行评估。

尝试使用InStr获取匹配的索引,而Left基于该索引构建子字符串因此而失败。我不知道如何完全避免这种情况。

4 个答案:

答案 0 :(得分:0)

使用SWITCH

一旦找到第一个True,

SWITCH就会停止评估表达式。 Switch使用pair(要评估的表达式和结果,如果它是真的)。最终的True就像else一样。

=SWITCH
(
InStr(Fields!SearchField.Value, Fields!Criteria.Value) <= 1, "",
True, Left(Fields!SearchField.Value, InStr(Fields!Criteria.Value, Fields!Criteria.Value)-1)                   
)

答案 1 :(得分:0)

为了便于阅读,我重写了它:

=Switch
(
    InStr(Fields!Defendants.Value, Fields!Firm_Client_Name.Value) = 0, "",  
    InStr(Fields!Defendants.Value, Fields!Firm_Client_Name.Value) = 1, "",  
    True, Left(Fields!Defendants.Value, InStr(Fields!Defendants.Value, Fields!Firm_Client_Name.Value)-1)
)

'0 =错误

'1 =

'&gt; 1 =基于条件的子字符串

1和&gt; 1是正确的,但是当InStr评估为0时,我仍然会收到错误。

问题是,我必须告诉左功能-1或它将返回分隔符的第一个字母,我不想要。即使InStr(Fields!Defendants.Value,Fields!Firm_Client_Name.Value)= 0的条件为真,而不是为列返回“”,它也会返回错误。这告诉我它仍然在被评估,尽管它超出了指定的条件。

如果我在Left函数中省略-1,则不会产生错误。然而我得到子串+分隔符的第一个字母。

我使用敏感信息,所以我不能给出字符串的具体结果。

答案 2 :(得分:0)

我也认为Switch会起作用,但经过测试却没有。据我所知,自定义代码是唯一的方法。我测试了下面的函数,该函数适用于我的几个测试用例。

Public Function TruncateWord(ByVal str As String, ByVal criteria As String) As String
If str.Contains(criteria) Then
    Return Left(str, InStr(str, criteria) - 1)
Else:
    Return ""
End If
End Function

我使用以下5个基本字符串进行测试,搜索“d”,并得到以下结果:

+-----------------+
| String | Result |
+-----------------+
| asdf   | as     |
| asd    | as     |
| as     |        |
| da     |        |
| ad     | a      |
+-----------------+

因此,这似乎适用于所有3种可能情况(InStr返回&gt; 1,InStr返回1,InStr返回0)来自我的有限测试。

答案 3 :(得分:0)

以下是C Black建议使用自定义代码的最终结果。我最终希望使用字符串的片段在相对列中以不同的颜色格式化匹配。我不得不添加一些HTML标签。它完美地运作。谢谢大家的帮助。

代码块:

Public Function ParseMatch (ByVal FullString As String, ByVal Criteria As String) As String

    Dim Segment(2) As String
    Dim Result As String

    If FullString.ToUpper.Contains(Criteria.ToUpper)

        Segment(0) = Left(FullString, InStr(Ucase(FullString), Ucase(Criteria) )-1 )
        Segment(1) = Criteria
        Segment(2) = Right(FullString, Len(FullString) - Len(Segment(0)) - Len(Criteria))

        Result = Segment(0) & "<b><FONT color=blue>" & Segment(1) & "</FONT></b>" & Segment(2)

    Else
        Result = FullString
    End If

    Return Result

End Function

报告单元格:

=Code.ParseMatch(Fields!Defendants.Value, Fields!Firm_Client_Name.Value)

如果在被告名单中找到该名称,则会将该字段中的文字颜色设为蓝色并加粗。