全域變數在整個主報表中使用同一個記憶體區塊來儲存值。除了子報表中的公式以外,所有宣告變數的公式都可以使用這個值。以下是宣告全域變數的範例:
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
在本範例中,如果先輸入及儲存的是 Formula A,在檢查或嘗試儲存 Formula B 時,Crystal Reports 會傳回錯誤訊息。這是因為全域變數 z 在 Formula B 中是宣告為數字,這與它之前在 Formula 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,這是因為公式 C 保留了 x 的值 10,公式 D 再將此值加上 1,使 x 成為 11,並傳回值 11。在第二筆詳細資料錄中,公式 D 會傳回 12,也就是將前一筆 x 的值 11 加上 1。這個程序會重複運用在後面的詳細資料錄中。
呼叫 WhileReadingRecords 的動作通知 Crystal Reports 在讀取報表中的每一筆資料錄時,重新驗算 Formula D。否則,由於公式中並未包含任何資料庫欄位,程式只會在從資料庫讀取資料錄之前驗算一次該公式。因此,當公式處理後面的資料錄時,都會傳回 11,而不會依序傳回 11、12、13 等。
如果以 x := x + {Orders Detail.Quantity} 來取代運算式 x := x + 1,表示您根據 {Orders Detail.Quantity} 來建立累加值,即使因公式 C 的關係,使得它從 10 開始累計而不是從 0 開始。在此例中,由於公式中含有資料庫欄位,您可以省略呼叫 WhileReadingRecords 的程序,因為它會自動發生。