全局变量使用相同的内存块在整个主报表中存储一个值。除子报表中的公式外,该值随后可用于所有声明此变量的公式。如下例所示声明全局变量:
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,因为它将因公式包含数据库字段而自动出现。