If 表达式是一个表达式。换言之,它求值为某个给定类型的值。如果没有 Else 子句,并且条件不为 true,则求值为该类型的默认值。例如:
If Length ({Employee.First Name}) < 5 Then "short"
上面的 If 表达式返回“字符串”值。如果雇员的名字少于五个字母,则该字符串值为“short”,否则为空字符串 ""。
考察下面的公式:
If Year({Orders.Order Date}) >= 1995 Then {Orders.Order Date}
对于 1995 年以前的订购日期,上面的 If 表达式返回空“日期时间”值。由于 {订单.订购日期} 是“日期时间”数据库字段,因此它是“日期时间”值而不是“日期”值。Crystal Reports 不会打印空“日期时间”值,因此如果将上述公式放到报表中,那么对于 1995 年以前的订单日期,该公式字段就会为空。空“时间”值和空“日期”值的行为类似。
下例说明通过使用圆括号,使得在满足某个 If 条件后执行一个以上的表达式。某公司对 3 天内送达的货物收取 5% 的费用,否则收取 2% 的费用。它想打印这样的消息:“急件发货费为 $100.00”,或适当的“普通发货费为 $20.00”。
Local StringVar message; Local CurrencyVar ship; If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then ( message := "Rush"; //A semicolon at the end of the next line //is optional ship := {Orders.Order Amount} * 0.05 ) //A semicolon cannot be placed here Else ( message := "Regular"; ship := {Orders.Order Amount} * 0.02; ); //The preceding semicolon is required to separate the //If expression from the final expression below message & " shipping is " & CStr (ship)
当多个表达式用圆括号括起来时,所有的表达式被看作是单个表达式,它的值和类型是圆括号中最后一个表达式的值和类型。
//The parentheses group expression as a whole has //Currency type ( //The first expression in the parentheses has //String type message := "Rush"; //The second and final expression in parentheses //has Currency type ship := {Orders.Order Amount} * 0.05; )
因而,如下公式将报告错误。原因是 If 表达式的 Then 部分返回“货币”值,而 Else 部分返回“字符串”值。这是不允许的,因为 If 表达式是个表达式,所以必须始终返回单个类型的值。
//An erroneous formula Local StringVar message; Local CurrencyVar ship; If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then ( message := "Rush"; ship := {Orders.Order Amount} * 0.05 ) Else ( //The following 2 lines were interchanged ship := {Orders.Order Amount} * 0.02; message := "Regular"; ); message & " shipping is " & CStr (ship)
对于表达式顺序错误的公式,一种纠正方法是让 If 表达式在每个分支表达式中都返回相同类型的常量值。例如,现在 If 表达式返回“数字”值 0:
//Repaired the erroneous formula Local StringVar message; Local CurrencyVar ship; If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then ( message := "Rush"; ship := {Orders.Order Amount} * 0.05; 0 ) Else ( ship := {Orders.Order Amount} * 0.02; message := "Regular"; 0 ); message & " shipping is " & CStr (ship)