グローバル変数は、メイン レポート全体にわたって 1 つの値を同じメモリ ブロックに格納します。したがって、サブレポートの中の式を除き、グローバル変数を宣言したすべての式でこの値を使用できます。グローバル変数は、次の例のように宣言します。
Global StringVar y;
キーワード Global を省略することもできます。Global がデフォルトだからです。
StringVar y; //Global StringVar y; と同じです
グローバル変数は宣言しやすいですが、ローカル変数では十分でない場合にだけグローバル変数を使用することをお勧めします。
グローバル変数は、メイン レポート全体にわたって値を共有するので、ある式である型のグローバル変数を宣言し、次に別の式で、名前が同じだが型が異なるグローバル変数を宣言することはできません。
例
//Formula A Global DateVar z; z := CDate (1999, 9, 18) //Formula B NumberVar z; z := 20
この場合は、Formula A を入力し、それを最初に保存すると、Formula B をチェックしたり、保存しようとするときに、Crystal Reports がエラー メッセージを表示します。 グローバル変数 z を数値型として宣言することが、先に Formula A で日付型として宣言したことと矛盾するからです。
グローバル変数は、実際に出力されるレポートのグループ化とページ レイアウトの結果が式の結果に影響するような複雑な計算を実行する場合によく使用されます。そこでは、数個の式を作成して、それらをレポートの異なるセクションに配置し、それら別々の式をグローバル変数を介して対話させます。
例
//Formula C Global NumberVar x; x := 10; //Formula D //WhileReadingRecords 関数を呼び出します WhileReadingRecords; Global NumberVar x; x := x + 1
Formula C をレポート ヘッダーに配置し、Formula D を詳細セクションに配置すると、Formula D が評価される前に Formula C が評価されます。Formula C は一度だけ評価され、次に詳細セクションに表示される各レコードについて Formula D が評価されます。Formula C は 10 を返します。最初の詳細レコードでは、Formula D は 11 を返します。これは、Formula C で設定されたときから、x の値 10 が保持されているためです。Formula D は、この値に 1 を加算し、x を 11 に設定してから 11 を返します。2 番目の詳細レコードでは、Formula D は、前に保持された x の値 11 に 1 を加算し、12 を返します。この処理が残りの詳細レコードについても継続されます。
WhileReadingRecords を呼び出すと、Crystal Reports に対して、レポートの各レコードを読み取りながら Formula D を再評価するように指示できます。この関数を呼び出さないと、Formula D にはデータベース フィールドが含まれていないので、プログラムは、データベースからレコードを読み取る前に、Formula D を自動的に一度だけ評価します。その後レコードが次々と処理されると、この式は、11、12、13、... ではなく、常に値 11 を返します。
式 x := x + 1 を x := x + {Orders Detail.数量}に置き換えた場合は、{Orders Detail.数量}フィールドを基にした積算合計を生成できます。ただし、Formula C があるので、合計は 0 からではなく 10 から始まります。この場合は、WhileReadingRecords の呼び出しを省略できます。なぜなら、式にデータベース フィールドが含まれているので、自動的に再評価が行われるからです。
変数のスコープ | ローカル変数 | 共有変数 | レポート セクションの概要