一般情况下,Crystal Reports 在公式中遇到空值字段时,会立即停止公式求值而不产生任何值。若要处理公式中的空字段值,则必须使用专门用于处理空字段值的特殊函数进行显式处理。这些函数包括:IsNull、PreviousIsNull 或 NextIsNull。
当 Crystal Reports 对以下条件求值时,运算符与这些函数相关:
IsNull({Product.Color}) Or _
InStr({Product.Color}, " ") = 0
它首先对 IsNull ({产品.颜色}) 求值,当它确定该函数值为“真”时,便知道整个条件为“真”,因此不需要检查是否
InStr({Product.Color}, " ") = 0
换句话说,当 Crystal Reports 能够预知整个表达式的结果时,将停止对布尔表达式求值。在下例中,公式防止在分母为 0 的情况下被零除:
Dim num As Number, denom As Number
...
If denom <> 0 And num / denom > 5 Then
...
注意 Visual Basic 不支持该技术,因为在 Visual Basic 中即使不必要,也对布尔表达式的所有部分求值。
示例
{产品.颜色} 字段中既包含基本颜色名(如“red”和“black”),也包含两个单词构成的描述性颜色名(如“steel satin”和“jewel green”)。以下的示例是这样一个公式,当颜色为基本颜色时写出“基本”,为其他颜色时写出“流行”。
If InStr({Product.Color}, " ") = 0 Then
formula = "basic"
Else
formula = "fancy"
End If
对 InStr 的函数调用搜索 {产品.颜色} 字符串中是否有空格。如果发现有空格,则该函数调用返回该空格的位置,否则返回 0。由于基本颜色只有一个单词,没有空格,所以 InStr 会对基本颜色返回 0。
对于某些产品(如 Guardian Chain Lock)不记录颜色值,因而 {产品.颜色} 字段在数据库中对该记录有一个空值。这样,Guardian Chain Lock 记录就不在它旁边打印任何文字。
下例说明如何处理上面使用 IsNull 的示例:
If IsNull({Product.Color}) Or _
InStr({Product.Color}, " ") = 0 Then
formula = "basic"
Else
formula = "fancy"
End If |