Crystal Reports Designer  

分组表达式(Crystal 语法)

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)

另请参见

If 表达式 | Select 表达式