变量代表一个特定的数据项或值,并充当该值的占位符。公式遇到某个变量时,它便搜索该变量的值并将此值用于公式中。与常量值不同,可以给变量反复赋以不同的值。将某个值赋给变量后,该变量便保持此值,直到再赋以一个新值时为止。由于这种灵活性,在使用变量之前必须声明它们,以便 Crystal Reports 意识到它们的存在并了解您想如何使用它们。
示例
如果希望按区号创建客户报表,则可以创建一个变量,该变量将从客户传真号码中提取区号。以下示例是一个名为 areaCode 的变量:
Local StringVar areaCode; areaCode := {Customer.Fax} [1 To 3];
变量示例的第一行是变量声明;它给定变量名称和类型。数据库字段 {客户.传真} 是一个“字符串”字段,[1 To 3] 从它的当前值中提取前三个字符。该值于是便赋给变量 areaCode。
变量声明(Crystal 语法)
变量声明(Crystal 语法)
在公式中使用变量前必须声明它。变量可以保持某个给定类型的值。允许的类型是七种简单类型(数字、货币、字符串、布尔值、日期、时间和日期时间),六种范围类型(数字范围、货币范围、字符串范围、日期范围、时间范围和日期时间范围)以及保持上述类型数组的变量。这为变量提供了总共 26 种不同的类型。
声明变量时,还指定了它的名称。变量不能与任何对 Crystal 语法有效的函数、运算符或其他关键字同名。例如,变量不能被命名为 Sin、Mod 或 If,因为 Sin 是内置函数,Mod 是内置运算符,而 If 是内置关键字。当在公式编辑器中键入公式时,内置函数、运算符或其他关键字的名称均以不同的颜色突出显示,因此很容易检查出变量名是否与它们冲突。
变量一经声明后,即可在公式中使用。例如,可能希望为其赋以一个初始值:
Local NumberVar x; x := 10;
注意 声明“数字”变量的关键字的末尾为 Var。Crystal 语法中所有的变量类型都是如此。
变量只能保持一种类型的值。例如,如果一个变量保持“数字”值,则无法再用其保持“字符串”值。
示例
Local StringVar y; y := "hello"; Length (y); y := #Jan 5, 1993#; y := ["a", "bb", "ccc"]; Sin (y);
在单个表达式中可以同时声明变量和给变量赋值。例如:
Local NumberVar x := 10 + 20; Local StringVar y := "Hello" + " " + "World"; Local DateVar z := CDate (#Sept 20, 1999#); Local NumberVar Range gradeA := 90 To 100;
这是一个不错的方法,因为效率将会提高,并且当变量初始化不正确时,有助于防止出现常见的错误。
下面是声明和初始化范围变量的另外一些示例:
Local NumberVar Range gradeA; Local DateVar Range quarter; gradeA := 90 To 100; quarter := CDate (1999, 10, 1) To CDate (1999, 12, 31);
| 声明数组变量(Crystal 语法)
声明数组变量(Crystal 语法)
可以通过下面含有关键字 Array 的类型名称来声明数组变量。
示例
Global NumberVar Array x := [10 , 20, 30]; CurrencyVar Array cost := [$19.95, $79.50, $110.00, $44.79, $223.99]; Global DateVar Array payDays := [CDate(1999, 5, 15), CDate(1999, 5, 31)]; Shared StringVar Range Array y := ["A" To "C", "H" To "J"]; Local StringVar Array days; days := ["Sun", "Mon", "Tue", "Wed", "Th", "Fri", "Sat"];
给数组元素赋值
可以给数组的元素赋值,也可以使用元素的值进行其他计算。
示例
StringVar Array x := ["hello", "bye", "again"]; x [2] := "once"; //Now x is ["hello", "once", "again"] UpperCase (x [1])
如果想在数组上添加额外的信息,可以使用 Redim 和 Redim Preserve 关键字调整数组的大小。Redim 首先清除数组原先的内容,然后调整数组大小,而 Redim Preserve 则保留原先的内容。
Local NumberVar Array x; Redim x [2]; //Now x is [0, 0] x [2] := 20; //Now x is [0, 20] Redim x [3]; //Now x is [0, 0, 0] x [3] := 30; //Now x is [0, 0, 30] Redim Preserve x [4]; //Now x is [0, 0, 30, 0] "finished" Local StringVar Array a; Redim a [2]; a[1] := "good"; a[2] := "bye"; a[1] & a[2] //The formula returns the String "goodbye"
数组和 For 循环
数组通常用于 For 循环。下例使用 For 循环创建并使用数组 [10, 20, 30, ..., 100]。
Local NumberVar Array b; Redim b[10]; Local NumberVar i; For i := 1 To 10 Do ( b[i] := 10 * i ); b [2] // == 20
Crystal Reports for Visual Studio 2005
函数(Crystal 语法)
函数是用于对数据进行求值、计算或转换的内置过程或子例程。在指定函数时,程序执行内置于函数中的操作集,而不必单独指定每个操作。
函数概述(Crystal 语法)
函数概述(Crystal 语法)
在公式中使用函数时,键入函数名并提供所需参数。例如,Length 函数需要“字符串”参数并计算字符串的长度。
Local StringVar x := "hello"; Length (x)
提供的函数所需的参数类型不正确将产生错误。例如,Length 函数不接受“数字”参数,因此调用 Length (3) 将产生错误。
函数有时可以接受不同数量或类型的参数。例如,CDate 函数可以接受单个“字符串”参数构成“日期”值,或接受分别保持年、月和日的三个“数字”值,并用它们构成“日期”值。请参见日期、时间和日期时间(Crystal 语法)。
Mid 函数示例
Local StringVar x := "hello"; Local StringVar y; y := Mid (x, 2); //y is now "ello" y := Mid (x, 2, 1) //y is now "e"
这些函数类型是:数学、摘要、财务、字符串、日期/时间、日期范围、数组、类型转换、编程快捷方式、求值时间、打印状态、文档属性和附加函数。还有一些函数是条件格式设置公式专用函数。
数据范围(Basic 和 Crystal 语法)
日期范围(Basic 和 Crystal 语法)
这些函数产生的日期范围取决于当前日期。例如,如果今天的日期是 2000 年 9 月 18 日,那么 LastFullMonth 就是“日期范围”值:
CDate(#Aug 1, 2000#) To CDate(#Aug 31, 2000#)
该功能通常很有用,但如果想根据数据库字段(如 {订单.订单日期})确定日期范围,可以改用日期/时间函数。
Basic 语法示例
Dim d As Date d = CDate ({Orders.Order Date}) Dim dr As Date Range dr = DateSerial (Year(d), Month(d) - 1, 1) To _ DateSerial (Year(d), Month(d), 1 - 1) 'At this point dr is the Date Range value holding 'the last full month before {Orders.Order Date}
Crystal 语法示例
Local DateVar d := CDate ({Orders.Order Date}); Local DateVar Range dr; dr := DateSerial (Year(d), Month(d) - 1, 1) To DateSerial (Year(d), Month(d), 1 - 1); //At this point dr is the Date Range value holding //the last full month before {Orders.Order Date}
DateSerial 函数使之变得简单易行,因为您不必担心特殊情况。它决不会让您创建无效日期。例如,DateSerial (1999, 1 - 1, 1) 是 1998 年 12 月 1 日。注意,在上例中,{订单.订单日期} 实际上是“日期时间”字段,因此使用了 CDate 函数截断它的时间部分以将其转换为日期。
数组函数(Basic 和 Crystal 语法)
数组函数(Basic 和 Crystal 语法)
数组函数计算某一数组元素的摘要。例如,“求和”函数应用于数组时,将返回数组元素的总和。
Basic 语法示例
下面的公式返回 100:
formula = Sum (Array (10, 20, 30, 40))
Crystal 语法示例
下面的公式返回 100:
Sum ([10, 20, 30, 40])