【发布时间】:2019-12-16 05:51:25
【问题描述】:
MSDN 声明 SSRS 将评估 Iif 语句的真假部分,无论返回哪一个。这似乎使Iif 在避免错误方面完全无用。换句话说,您不能使用Iif 来绕过错误,因此基本上您选择包含的任何操作无论条件如何都必须始终有效。老实说,这有什么好处?
所以我的问题是......除了Iif 之外,SSRS 还有其他评估条件的方法吗?
这是我的例子。我只是希望能够在不抓住比赛的第一个字符的情况下返回 Left。
=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 基于该索引构建子字符串因此失败。我不知道如何完全避免这种情况。
【问题讨论】:
-
我认为 SSRS 直到最近才使用短路布尔评估。 IIF() 是一个函数,所有表达式都在进行比较之前进行评估。您可以将表达式放在报告代码中并分配一个值,例如 Code.FormatWhenFoundOrEmpty(x,y)
-
是我一个人,还是微软的这种做法极其短视?我的意思是,条件语句的整个想法是在满足条件时做某事,否则不做。值得注意的是,这是一个非常违反直觉的情况。遇到它我很惊讶。