Crystal Report 变量作用域简介

来源:互联网 发布:2017年win10平板 知乎 编辑:程序博客网 时间:2024/06/10 07:56

变量作用域

变量作用域用于定义某个公式的变量可在多大程度上用于其他公式。Crystal Reports 中的作用域有三个级别:

  • Local

  • Global

  • Shared

每个变量都有一个作用域,该作用域在变量声明时指定。



局部变量

具有局部作用域的变量是使用 Local 关键字 + 类型名称(带有后缀 Var)+ 该变量名声明的。

局部变量只限于单个公式以及该公式的单个求值。也就是说,无法从其他公式访问某个公式中的局部变量值。

示例

//公式 ALocal NumberVar x;x := 10;//公式 BEvaluateAfter ({@Formula A})Local NumberVar x;x := x + 1;

函数调用 EvaluateAfter ({@Formula A}) 确保公式 B 在公式 A 之后求值。公式 A 返回一个值 10,公式 B 返回一个值 1。公式 B 无法访问公式 A 中的 x,因此不能使用值 10 来加 1;对于公式 B 中未初始化的局部变量 x,公式 B 改用默认值 0,因此加 1 后便得到 1。

也可以在不同的公式中使用相同的名称、不同的样式创建局部变量。例如,公式 A 和公式 B 中的类型声明与下列内容不冲突:

//公式 CLocal StringVar x := "hello";

局部变量是三种作用域中最有效的。另外,它们在不同的公式中互不干扰。因而,只要可能最好将变量声明为局部变量。



全局变量

全局变量使用相同的内存块在整个主报表中存储一个值。除子报表中的公式外,该值随后可用于所有声明此变量的公式。如下例所示声明全局变量:

Global StringVar y;

默认情况下,也可以省略创建全局变量的 Global 关键字。

StringVar y;//与 Global StringVar y; 一样

然而,虽然局部变量容易声明,但建议只有在全局变量能力不足的情况下才使用局部变量。

由于全局变量在整个主报表中共享它们的值,因此不能在某个公式中使用某个类型声明全局变量后,再使用同一个名称在不同的公式中以不同的类型声明全局变量。

示例

//公式 AGlobal DateVar z;z := CDate (1999, 9, 18)//公式 BNumberVar z;z := 20

在这种情况下,如果首先输入并保存公式 A,则当检查或试图保存公式 B 时,Crystal Reports 将返回错误。这是因为将全局变量 z 声明为“数字”类型与先前在公式 A 中将其声明为“日期”类型冲突。

何时使用全局变量

全局变量通常用于执行复杂的计算,计算的公式结果取决于实际打印的报表的分组和页面布局。为此,需创建若干公式,将它们置于报表的不同节,并通过全局变量使这些不同的公式互相作用。

示例

//公式 CGlobal NumberVar x;x := 10;//公式 D//调用函数 WhileReadingRecordsWhileReadingRecords;Global NumberVar x;x := x + 1

如果将公式 C 置于“报表页眉”,然后将公式 D 置于“详细资料”节,则公式 C 先于公式 D 求值。公式 C 经过一次求值后,“详细资料”节每次出现记录时,便求值公式 D。公式 C 返回 10。对于第一条明细记录,公式 D 返回 11。这是因为 x 的值 10 在公式 C 中设置之后就被保留了。然后公式 D 将此值加 1,将 x 设置为 11 并返回 11。对于第二条明细记录,公式 D 将 1 加到此前保留的 x 值(其值为 11)上,返回 12。对于剩余的明细记录,将继续进行此过程。

调用 WhileReadingRecords 使得 Crystal Reports 在读取报表的每个记录时重新对公式 D 求值。否则,由于该公式不包含任何数据库字段,因此程序在从数据库读取记录之前,只对该公式进行一次求值。处理连续记录时,公式将返回值 11 而不是 11、12、13 等等。

如果表达式 x := x + 1 由 x := x + {订单细节.数量} 替换,将产生基于 {订单细节.数量} 运行总计的效果,但是由于公式 C,起始值将是 10 而不是 0。在这种情况下,可以不必调用 WhileReadingRecords,因为它将因公式包含数据库字段而自动出现。


共享变量

共享变量使用相同的内存块,在整个主报表及其所有子报表中存储变量值。因而,共享变量甚至比全局变量更普遍。若要使用共享变量,请在主报表内的公式中声明它,如下所示:

Shared NumberVar x := 1000;

并在子报表内的公式中声明它,如下所示:

Shared NumberVar x;

为使用共享变量,在共享变量可以在主报表和子报表之间传递之前,必须先声明该变量并给其赋值。



原创粉丝点击