设置
我有一个表达式,可以将所有大写值转换为正确的大小写。有些值在连字符之前有一个额外的位,我想要之前的所有内容。遗憾的是,在没有连字符的情况下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中检查了值)答案 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在检查返回哪个函数之前尝试执行所有函数,因此当它击中它时错误不能执行。这就是我将其他答案标记为正确的原因,因为这是问题的真正原因。