Crystal Reports Designer  

全局变量(Crystal 语法)

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

Global StringVar y;

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

StringVar y; //Same as: Global StringVar y;

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

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

示例

//Formula A
Global DateVar z;
z := CDate (1999, 9, 18)
//Formula B
NumberVar z;
z := 20

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

何时使用全局变量

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

示例

//Formula C
Global NumberVar x;
x := 10;
//Formula D
//Call the function WhileReadingRecords
WhileReadingRecords;
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,因为它将因公式包含数据库字段而自动出现。

另请参见

变量作用域 | 局部变量 | 共享变量 | 报表节概述