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";
//下一行末尾的分号是可选的。
ship := {Orders.Order Amount} * 0.05
) //分号不能放在此处。
Else
(
message := "Regular";
ship := {Orders.Order Amount} * 0.02;
);
//要求用前导分号将 If 表达式与下面的最后一个表达式分开。
message & " shipping is " & CStr (ship)
当多个表达式用圆括号括起来时,所有的表达式被看作是单个表达式,它的值和类型是圆括号中最后一个表达式的值和类型。
//圆括号组表达式作为一个整体是货币类型。
(
//圆括号中的第一个表达式是字符串类型。
message := "Rush";
//圆括号中的第二和最后一个表达式是货币类型。
ship := {Orders.Order Amount} * 0.05;
)
因而,如下公式将报告错误。原因是 If 表达式的 Then 部分返回货币型值,而 Else 部分返回字符串型值。这是不允许的,因为 If 表达式是个表达式,所以必须始终返回单个类型的值。
Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05
)
Else
(
//下面两行的顺序颠倒了。
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
);
message & " shipping is " & CStr (ship)
对于表达式顺序错误的公式,一种纠正方法是让 If 表达式在每个分支表达式中都返回相同类型的常量值。例如,现在 If 表达式返回数字型值 0:
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)