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)