Crystal Reports Designer  

Grouping 運算式 (Crystal 語法)

If 運算式也是 一個運算式,也就是說,它會驗算指定型別值。假如沒有 Else 子句,而且條件為 False 時,則運算式的值就是該型別的預設值。例如:

If Length ({Employee.First Name}) < 5 Then
   "short"

以上的 If 運算式會傳回字串值。如果員工的名字少於五個英文字母,傳回的字串值為 "簡短";如果員工的名字超過五個英文字母,則傳回空白字串 ""。

請想一想下面這個公式:

If Year({Orders.Order Date}) >= 1995 Then
   {Orders.Order Date}

如果訂貨日期早於 1995 年,以上的 If 運算式會傳回 Null 日期時間值。由於 {Orders.Order Date} 是日期時間資料庫欄位,因此其值是日期時間值,而不是日期值。Crystal Reports 不會列印 Null 日期時間值,因此,如果將以上公式放在報表中,1995 年之前訂貨日期的公式欄位就會是空白的。Null 時間值和 Null 日期值的處理方式類似。

下面這個範例將說明如何使用括號,執行一個以上的運算式,當做 If 條件的結果。某公司對三天之內送到的訂單收取 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 運算式