전역 변수(Crystal 구문)
전역 변수는 동일한 메모리 블록을 사용하여 주 보고서 전체에 값을 저장합니다. 그러면 이 값은 하위 보고서의 수식을 제외하고 해당 변수를 선언하는 모든 수식에서 사용할 수 있습니다. 다음 예에서처럼 전역 변수를 선언합니다.
Global StringVar y;
또한 기본적으로 전역 변수를 만드는 전역 키워드를 생략할 수 있습니다.
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를 확인하거나 저장하려고 할 때 오류가 반환됩니다. 전역 변수 z를 Number로 선언한 것과 Formula A에서 변수 z를 Date로 선언한 것이 충돌하기 때문입니다.
전역 변수를 사용해야 할 때
전역 변수는 실제로 출력된 보고서의 그룹화 및 페이지 레이아웃에 따라 수식의 결과가 달라지는 복잡한 계산을 수행하는 데 주로 사용합니다. 이 작업은 여러 수식을 만들어서 보고서의 다른 섹션에 배치하고, 전역 변수를 통해 이러한 여러 수식들이 상호 작용하게 함으로써 수행됩니다.
예제
//Formula C
Global NumberVar x;
x := 10;
//Formula D
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을 반환합니다. 두 번째 세부 레코드에 대해 Formula D는 이전 x 값 11에 1을 더하여 12를 반환합니다. 나머지 세부 레코드에 대해 이 프로세스가 반복됩니다.
WhileReadingRecords를 호출하면 보고서의 각 레코드를 읽을 때 Formula D가 다시 평가됩니다. 그렇지 않으면 이 수식은 데이터베이스 필드를 포함하지 않으므로 데이터베이스에서 레코드를 읽기 전에 한 번만 평가됩니다. 따라서 이 수식은 연속적으로 레코드를 처리할 때 11, 12, 13, .... 대신 값 11을 반환합니다.
식 x = x + 1을 x = x + {주문 정보.수량}으로 바꾸면 {주문 정보.수량}에 기반하여 누적 합계의 결과가 만들어지는 데 Formula C 때문에 0이 아니라 10에서 누적 합계가 시작됩니다. 이 경우 수식에 데이터베이스 필드가 포함되어 WhileReadingRecords가 자동으로 호출되므로 이 호출을 생략해도 됩니다.