说明
Switch 从左向右对表达式求值,并返回与第一个求值为 True 的表达式相关联的值。
参数
value1 和 value2 等都是可能返回的值。所有值必须具有相同的类型。值可以是任何简单类型(数字、货币、字符串、布尔值、日期、时间或日期时间)或范围类型(数字范围、货币范围、字符串范围、日期范围、时间范围或日期时间范围),但它不能是数组。
返回
值列表 value1 和 value2 等其中的一个值。返回值的类型必须与这些值的类型相同。
操作
Switch 的参数列表由成对的表达式和值组成。Switch 从左向右对表达式求值,并返回与第一个求值为 True 的表达式相关联的值。
例如,如果 expression1 为 True, 则 Switch 返回 value1。如果 expression1 为 False,而 expression2 为 True,则 Switch 返回 value2。如果 expression1 和 expression2 都为 False,expression3 为 True, 则 Switch 返回 value3。
如果所有的表达式都为 False,则 Switch 返回默认值。(返回的默认值取决于值列表中值的类型。例如,如果值是数字类型,则默认值为 0,如果值是字符串类型,则默认值是空字符串(“”)。)
典型用法
某些情况下可以使用 Switch 代替 If-Then-Else 运算符和 Select 表达式(Crystal 语法)。
有一种情况使用 Switch 比使用控制结构更方便:即编写记录选定公式以便它们可以推入到数据库服务器中。参见如下示例:有关相关技术的说明,请参阅《Crystal Reports 用户指南》的“设计最佳 Web 报表”一章中的“使用增强的记录选定公式”。
示例
假设一家公司希望根据订单大小将订单分成“大额”、“普通”和“小额”三类:
Switch ({Orders.Order Amount} > 5000, "large",
{Orders.Order Amount} > 1000, "medium",
True, "small")如果 {订单.订单金额} 大于 $5,000,则公式返回字符串值“大额”。否则,如果 {订单.订单金额} 大于 $1,000,则公式返回字符串“普通”。否则公式返回“小额”。
这里给出一个示例,它说明如何使用 Switch 函数来编写有效的可以推入到数据库服务器中的记录选定公式。如果使用 If-Then-Else 运算符或 Select 表达式(Crystal 语法)编写该公式,则不会将它下推到数据库服务器中。
有关相关技术的说明,请参阅《Crystal Reports 用户指南》的“设计最佳 Web 报表”一章中的“使用增强的记录选定公式”。
示例报表
在名为“Record Selection on DateRange.rpt”的示例报表中提供了本示例更完整的版本,其中包含了 27 个 Switch 条件。
示例报表位于 Crystal Reports 目录中的 \Samples\En\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 函数所返回的值也不例外。