【问题标题】:Prolem with IIF statement in SSRSSSRS 中的 IIF 语句存在问题
【发布时间】:2014-06-10 14:21:06
【问题描述】:

设置

我有一个将所有大写值转换为正确大小写的表达式。一些值前面有一个额外的连字符,我想要在那之前的所有内容。遗憾的是,在没有连字符的实例上出现LEFT(INStr 表达式错误。

=IIF(
      INstr(Fields!Introducer_Title.Value, "-") = 0, 
      StrConv(Fields!Introducer_Title.Value,vbStrConv.ProperCase), 
      "nope"            
      )

上面的工作很好:如果没有连字符,则字符串转换为正确的大小写,否则它只是说不。


问题

=IIF(
      INstr(Fields!Introducer_Title.Value, "-") = 0, 
      StrConv(Fields!Introducer_Title.Value,vbStrConv.ProperCase), 
      Left(StrConv(Fields!Introducer_Title.Value, VbStrConv.ProperCase), INstr(StrConv(Fields!Introducer_Title.Value, VbStrConv.ProperCase), "-")-1)        
      )

如果值中有连字符,则上述方法会在适当的情况下返回它之前的文本,但现在没有连字符的值会出错。逻辑没有改变。

当我用嵌套表达式替换否则“nope”时,就好像 IIF(A=TRUE,This,That) 以某种方式转换为 always 而不是这样做。

错误只是#Error,没有其他信息。


我是否遗漏了一些明显的东西?我觉得这是 SSRS 的一些怪癖。


更新
我越看越奇怪:

  • 将函数包装在 ISERROR 中会在错误行上产生错误,而不是返回 true
  • 使用InStrRev 函数返回与InStr 函数相同的值,即使第一行中的连字符的位置不在中间(我检查了Excel 中的值)

【问题讨论】:

    标签: reporting-services logic ssrs-2008-r2 iif


    【解决方案1】:

    IF(A=TRUE, This, That)。 SSRS 将始终评估这个和那个,而不考虑 A 的值。

    换句话说,SSRS 中的IIF 条件是not short circuited

    试试这样的。

    方法一:

    =Left(StrConv(Fields!Introducer_Title.Value, VbStrConv.ProperCase), 
           IIF(
                INstr(Fields!Introducer_Title.Value, "-") = 0, 
                LEN(Fields!Introducer_Title.Value), 
                INstr(StrConv(Fields!Introducer_Title.Value, VbStrConv.ProperCase), "-")-1
              )      
            )
    

    方法二:

    =IIF(
          INstr(Fields!Introducer_Title.Value, "-") = 0, 
          StrConv(Fields!Introducer_Title.Value,vbStrConv.ProperCase), 
          Left(StrConv(Fields!Introducer_Title.Value, VbStrConv.ProperCase), 
           IIF(
             INstr(Fields!Introducer_Title.Value, "-") = 0, 
             0, 
             INstr(StrConv(Fields!Introducer_Title.Value, VbStrConv.ProperCase), "-")-1
              )        
           )
        )
    

    注意:以上代码未经测试。检查括号和字符串长度以确保得到正确的结果。

    【讨论】:

    • 感谢 Anup 的回复。提供的代码不起作用,但正如你所说,它没有经过测试。我目前正在使用您提供的理解来处理它,但我运气不佳。我不明白的一件事是为什么如果我使用 SWICTH 函数而不是 IIF 会发生同样的事情
    • 有趣...如果我将它包装在 ISERROR 中,它也会出错。因此,我的问题中的第一个语句有效,第二个函数通常有效,但是将它们放在一起,如果你将整个内容包装在 ISERROR 它 仍然那些错误!
    【解决方案2】:

    问题是左侧语句末尾的 -1:在没有连字符的情况下,-1 会在 0 上变为 -1,从而导致错误。

    为了解决这个问题,我使用了这个表达式,

    =StrConv(
        Trim(
          Replace(
                IIF(
                   INstr(Fields!Introducer_Title.Value, "-") <> 0, 
                   Left(Fields!Introducer_Title.Value, INstr(Fields!Introducer_Title.Value, "-")),
                   Fields!Introducer_Title.Value
                   ),
                "-",
                nothing
                )
            ),
          VbStrConv.ProperCase
          )
    

    请注意,虽然这解决了我的问题,但问题的核心是 SSRS 在检查要返回哪个函数之前尝试执行所有函数,因此当它遇到一个错误时 不能 执行。这就是我将另一个答案标记为正确的原因,因为这是问题的真正原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多