crystal Report 变量声明语法
变量代表一个特定的数据项或值,并充当该值的占位符。公式遇到某个变量时,它便搜索该变量的值并将此值用于公式中。与常量值不同,可以给变量反复赋以不同的值。将某个值赋给变量后,该变量便保持此值,直到再赋以一个新值时为止。由于这种灵活性,在使用变量之前必须声明它们,以便 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 语法)
变量作用域用于定义某个公式的变量可在多大程度上用于其他公式。Crystal Reports 中的作用域有三个级别:
· 局部(Crystal 语法)
· 全局(Crystal 语法)
· 共享(Crystal 语法)
每个变量都有一个作用域,该作用域在变量声明时指定。
| 声明数组变量(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 语法)
简单类型的默认值(Crystal 语法)
未初始化的变量将具有其类型的默认值。一般情况下,依赖类型的默认值并不是好的编程习惯。例如,在公式中初始化所有局部变量,在置于“报表页眉”内的公式中初始化所有全局变量,以及在置于主报表的“报表页眉”内的公式中初始化所有共享变量。
使用 Redim 关键字调整数组大小时,条目将充满这一类型的默认值。
默认值
数字
0
货币
$0
字符串
""
日期
Date (0, 0, 0)
时间
空“时间”值。未初始化的“时间”变量所保持的值。
DateTime
空“日期时间”值。未初始化的“日期时间”变量所保持的值。
注意 不建议公式依赖数组变量值或未初始化的范围值。
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"
这些函数类型是:数学、摘要、财务、字符串、日期/时间、日期范围、数组、类型转换、编程快捷方式、求值时间、打印状态、文档属性和附加函数。还有一些函数是条件格式设置公式专用函数。
非报表专用函数(Crystal 语法)
非报表专用函数(Crystal 语法)
数学、财务、字符串、日期/时间、类型转换和编程快捷方式组主要由非报表专用函数组成,但可以在任何功能全面的编程环境中找到。上述函数中的许多与具有相同或相似名称的 Visual Basic 函数在功能上相似。
注意 Crystal 语法所支持的某些函数没有列在 Crystal 语法函数树中。这是因为它们与已列在函数树中的 Crystal 语法函数等效。
例如,Length 函数是查找字符串的长度的传统 Crystal 语法函数。Crystal 语法还支持 Len 作为 Length 的同义词。Len 是具有同样功能的 Visual Basic 和 Basic 语法函数,包括它是为了给想编写或修改 Crystal 语法公式的用户提供方便。
汇总函数(Basic 和 Crystal 语法)
汇总函数(Basic 和 Crystal 语法)
“摘要”函数组提供创建摘要字段的函数,例如:
Sum({Orders.Order Amount}, {Orders.Ship Via})
通常使用“插入摘要”或“插入总计”对话框创建摘要字段。也可以将参数填充到“摘要”函数部分的一个函数中,以创建公式专用的摘要字段。但是,引用汇总字段的任何组必须已存在于报表中。
数据范围(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])
求值时间函数(Basic 和 Crystal 语法)
求值时间函数(Basic 和 Crystal 语法)
报表专用函数有:BeforeReadingRecords、WhileReadingRecords、WhilePrintingRecords 和 EvaluateAfter。可以使用这些函数指导 Crystal Reports 应在何时对公式求值。
公式应何时求值?是在检索数据库记录之前,是在读取数据库记录但还未分组、排序和摘要记录时,还是在分组、排序、摘要并打印记录时?一般情况下,Crystal Reports 将根据公式所需要的信息量,为公式设置适当的求值时间。例如,如果公式使用数据库字段,那么它在记录从数据库中读取前无法求值。但是,有时需要强制一个比正常求值时间稍晚的求值时间以获取所希望的效果。要查看示例,请参见全局变量(Basic 语法) 或全局变量(Crystal 语法)。
通常情况下,函数返回的值将在公式中进一步使用。可是,调用求值时间函数可更改 Crystal Reports 的内部行为,而且不使用它们返回的值。只需将它们的名称置于单独的语句中(可以选择在前面添加关键字 Call),即可调用它们。
WhilePrintingRecords Call WhilePrintingRecords
打印状态函数(Basic 和 Crystal 语法)
打印状态函数(Basic 和 Crystal 语法)
这些函数是报表特定的函数,用于处理被预览报表的状态。
例如,符号 {订单.订购日期} 是指当前记录中的字段值,而 PreviousValue ({订单.订购日期}) 指前一个记录中的值。NextValue ({订单.订购日期}) 指下一个记录中的值。IsNull ({订单.订购日期}) 检查字段值是否为空。
其他示例包括 PageNumber 和 TotalPageCount。它们可以用于访问报表的分页信息。
文档属性函数(Basic 和 Crystal 语法)
其它函数(Basic 和 Crystal 语法)
附加函数(Basic 和 Crystal 语法)
这些是用户函数库 (UFL) 中的函数。UFL 是您本人创建的单独的动态链接库或“自动化”服务器,它被 Crystal Reports 用来将自定义函数添加到公式语言中。编写 UFL 比使用 Basic 或 Crystal 语法编写公式更为复杂。
注意 使用 UFL 会降低报表的可移植性,因为报表必须与 UFL 一同分发。
条件格式化函数(Crystal 语法)
条件格式化函数(Crystal 语法)
编写条件格式设置函数时,某些附加的函数出现在函数树的上部以帮助您编写函数。例如,可以设置 {客户.去年销售额} 字段格式,使大于十万美元的销售额用绿色打印,小于一万五千美元的销售额用红色打印,而所有其他销售额用黑色打印。
示例
If {Customer.Last Year's Sales} > 100000 Then crGreen Else If {Customer.Last Year's Sales} < 15000 Then crRed Else crBlack
因为该函数是字体颜色格式设置函数,所以“颜色常量”列表出现在函数树中。该示例使用三种颜色常量:crGreen、crRed 和 crBlack。其实可以改用颜色常量的实际数值。例如,crRed 是 255,crGreen 是 32768。然而,使用颜色常量,公式更容易理解。Crystal 语法中的所有常量函数均可以有“cr”前缀。
Crystal 语法仍支持以前版本中不带“cr”前缀的常量函数。例如,可以使用“Red”而不是“crRed”。然而,建议使用“cr”前缀,因为它可以将常量函数组织起来。
注意 某些格式化属性不使用常量函数。例如,如果销售额低于五万美元时不希望打印 {客户.去年销售额} 值,则可以编写以下“取消”属性的条件格式设置公式:
If {Customer.Last Year's Sales} < 50000 Then True Else False
更简单的方法是:
{Customer.Last Year's Sales} < 50000
如果去年的销售额低于五万美元,则表达式
{Customer.Last Year's Sales} < 50000
为 True,因而公式返回 True.另一方面,如果去年的销售额大于或等于五万美元,则
{Customer.Last Year's Sales} < 50000
为 False,因而公式返回 False。
页:
[1]