說明
Switch 由左向右驗算運算式,並傳回與第一個驗算出 True 值的運算式相關的數值。
引數
expr1、expr2 等等是 Boolean 運算式。
數值1、數值2 等等是可能傳回的值。所有數值必須屬性同一型別。數值可以是任何簡單型別 (數字、貨幣、字串、布林、日期、時間或日期時間) 或範圍型別 (數字範圍、貨幣範圍、字串範圍、日期範圍、時間範圍或日期時間範圍),但不可以是陣列。
傳回
數值1、數值2 等等是這個數值清單中的數值之一。傳回值的型別與數值屬於同一型別。
動作
Switch 的引數清單是由成對的運算式與數值組成。Switch 由左向右驗算運算式,並傳回與第一個驗算出 True 值的運算式相關的數值。
例如,如果運算式1 為 True,Switch 傳回數值1。如果運算式1 為 False,運算式2 為 True,則 Switch 傳回數值2。如果運算式1 與運算式2 都為 False,而運算式3 為 True,則 Switch 傳回數值3。
如果所有運算式都為 False,則 Switch 傳回預設值。(傳回的預設值端看數值清單中的數值型別而定,例如,如果數值是數字型別,預設值就是 0;如果數值是字串型別,預設值就是空白字串 ("")。)
典型用法
在某些情況下可以使用 Switch 取代 If-Then-Else 運算子和 Select 運算式 (Crystal 語法)。
使用 Switch 會比使用控制結構好的一種情況是在撰寫資料錄選擇公式時,因為這樣才能下推到資料庫伺服器。請參閱以下範例。如需其中涉及技巧的說明,請參閱《Crystal Reports 使用指南》中〈設計最佳化的 Web 報表〉這一章的「使用增強的資料錄選擇公式」。
範例
假設某公司想根據訂單大小將訂單分成 "large"、"medium" 或 "small" 三類:
Switch ({Orders.Order Amount} > 5000, "large",
{Orders.Order Amount} > 1000, "medium",
True, "small")如果 {訂貨主檔.訂貨金額} 大於 $5,000,則公式傳回字串值 "high"。如果 {訂貨主檔.訂貨金額} 大於 $1,000,公式傳回字串 "medium"。否則,公式傳回 "small"。
以下範例顯示如何使用 Switch 函式撰寫既有效又能下推到資料庫伺服器的資料錄選擇公式。使用 If-Then-Else 運算子或 Select 運算式 (Crystal 語法) 撰寫這個公式不能使其下推。
如需其中涉及技巧的說明,請參閱《Crystal Reports 使用指南》中〈設計最佳化的 Web 報表〉這一章的「使用增強的資料錄選擇公式」。
報表範例
"Record Selection on DateRange.rpt." 這個報表範例中提供 27 個 Switch 條件,所以比以下範例更完整。
報表範例位在 \Samples\Reports 之下的 Crystal Reports 目錄中。
在預覽報表時,要提供參考的訂貨日期參數 {?reference date} 和範圍條件 {?reference condition},指出在參考訂貨日期附近的日期範圍。預覽的報表就只列出訂貨日期在指定範圍內的資料錄。
整個資料錄選擇是在資料庫伺服器上進行的。這是因為 Switch 函式及其所有引數可以在存取資料庫之前驗算。
附註:
這個 Switch 函式呼叫提供明確的預設值,因為如果沒有其他運算式為 True,最後一個會自動為 True,所以傳回 CDate (1899, 12, 30) To CDate(1899, 12, 30) 日期範圍。
//Crystal syntax record selection formula
{Orders.Order Date} in
Switch
(
{?reference condition} = "Aged 0 to 30 days",
({?reference date} - 30) To {?reference date},
{?reference condition} = "Aged 31 to 60 days",
({?reference date} - 60) To ({?reference date} - 31),
{?reference condition} = "Aged 61 to 90 days",
({?reference date} - 90) To ({?reference date} - 61),
True, // provide default handling and specify a valid range
CDate(1899, 12, 30) To CDate(1899, 12, 30)
)
註解
傳回結果之前,會驗算 Switch 函式的每個引數。因此,使用 Switch 要小心,以免發生不必要的副作用。
例如,如果數值之一會造成除以零,那麼即使該數值並不是 Switch 函式傳回的數值,還是一樣會發生錯誤。