SSRS中的IIF语句问题

时间:2014-06-10 14:21:07

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

设置

我有一个表达式,可以将所有大写值转换为正确的大小写。有些值在连字符之前有一个额外的位,我想要之前的所有内容。遗憾的是,在没有连字符的情况下LEFT(INStr表达式错误。

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

上面的工作正常:如果没有连字符,那么字符串将转换为正确的大小写,否则它只是说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)        
      )

上面的工作原理是,如果值中有连字符,则在适当的情况下返回前面的文本,但现在没有连字符的值出错。逻辑没有改变。

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

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


我错过了一些明显的东西吗?我觉得这是SSRS的一些怪癖。


更新
我对它的看法越来越陌生:

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

2 个答案:

答案 0 :(得分:3)

IF(A=TRUE, This, That)。 SSRS将始终评估此值,而不管A的值是什么。

其他方面,SSRS中的IIF条件为 not short circuited

尝试这样的事情。

方法1:

=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
          )      
        )

方法2:

=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
          )        
       )
    )

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

答案 1 :(得分:0)

问题是左语句末尾的-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在检查返回哪个函数之前尝试执行所有函数,因此当它击中它时错误不能执行。这就是我将其他答案标记为正确的原因,因为这是问题的真正原因。