运算符是描述发生在两个或多个值之间的运算或操作的特殊符号或字。程序读取公式中的运算符并执行指定的操作。

算术运算符(Crystal 语法)

算术运算符用于组合数字、数值变量、数值字段和数值函数以得到另一个数字。

算术运算符是加 (+)、减 (-)、乘 (*)、除 (/)、整除 (\)、百分比 (%)、求余 (Mod)、求反 (-) 和求幂 (^)。

//未上市的优先股占普通股的百分比。
{Financials.Preferred Stock} %
{Financials.Common Stock};
7 + 2 * 3 - 2 + Sqr(6 + 3) * Length("up");
//该公式返回 17。

优先顺序

一般情况下,程序按下面的顺序对表达式求值:

  • 从左向右
  • 遵循基础数学中的优先规则。

下面是优先顺序从高到低排列的算术运算符:

  • 求幂 (^)
  • 求反 (-)
  • 乘、除和百分比 (*, /, %)
  • 整除 (\)
  • 求余 (Mod)
  • 加和减 (+, -)

从左到右,先进行乘和除运算。然后进行加和减运算。例如,5 + 10 * 3 = 5 + 30 = 35。

使用圆括号可以更改优先顺序。例如,(5 + 10) * 3 = 15 * 3 = 45。如果不能确定优先顺序,最好用括号阐明意图。

比较运算符(Crystal 语法)

 

比较运算符通常用于比较控制结构中的条件(如 If 表达式)的操作数。

比较运算符有等于 (=)、不等于 (<>)、小于 (<)、小于或等于 (<=)、大于 (>) 和大于或等于 (>=)。

比较运算符作为一个整体,其优先顺序比算术运算符低。因而,表达式 2 + 3 < 2 * 9 与 (2 + 3) < (2*9) 相同。

布尔运算符(Crystal 语法)

布尔运算符通常与比较运算符一起使用,生成控制结构的条件。

按照从优先级最高到最低的顺序,布尔运算符有:Not、And、Or、Xor、Eqv 和 Imp。

布尔运算符作为一个整体,其优先顺序低于比较运算符。例如,表达式 2 < 3 And 4 >= -1 与 (2 < 3) And (4 >= -1) 相同。

空字段和空值(Crystal 语法)

一般情况下,Crystal Reports 在公式中遇到空值字段时,会立即停止公式求值而不产生任何值。若要处理公式中的空字段值,则必须使用专门用于处理空字段值的特殊函数进行显式处理。这些函数包括:IsNull、PreviousIsNull 或 NextIsNull。

当 Crystal Reports 对以下条件求值时,运算符与这些函数相关:

IsNull({Product.Color}) Or
InStr({Product.Color},
" ") = 0

它首先对 IsNull ({产品.颜色}) 求值,当它确定该函数值为“真”时,便知道整个条件为“真”,因此不需要检查是否

InStr({Product.Color}, " ") = 0

换句话说,当 Crystal Reports 能够预知整个布尔表达式的结果时,将停止对该表达式求值。在下例中,公式防止在分母为 0 的情况下被零除:

Local NumberVar num;
Local NumberVar denom;
...
If denom <> 0 And num / denom > 5 Then
...

{产品.颜色} 字段中既包含基本颜色名(如“red”和“black”),也包含两个单词构成的流行颜色名(如“steel satin”和“jewel green”)。假设要写这样一个公式,当颜色为基本颜色时写出“基本”,为其他颜色时写出“流行”。

If InStr({Product.Color}, " ") = 0 Then
"basic"
Else
"fancy"

对 InStr 的函数调用搜索 {产品.颜色} 字符串中是否有空格。如果发现有空格,则该函数调用返回该空格的位置,否则返回 0。由于基本颜色只有一个单词,没有空格,所以 InStr 会对基本颜色返回 0。

对于某些产品(如 Guardian Chain Lock)不记录颜色值,因而 {产品.颜色} 字段在数据库中对该记录有一个空值。这样,Guardian Chain Lock 记录就不在它旁边打印任何文字。

下例说明如何处理上面使用 IsNull 的示例:

If IsNull({Product.Color}) Or
InStr({Product.Color}, " ") = 0 Then
"basic"
Else
"fancy"
posted on 2011-04-14 16:04  笨笨小媛  阅读(2516)  评论(1编辑  收藏  举报