다음을 통해 공유


식 그룹화(Crystal 구문)

If 식은 하나의 식입니다. 다시 말해서 If 식은 지정된 형식의 값을 평가합니다. Else 절이 없고 조건이 true가 아니면 값은 해당 형식의 기본값이 됩니다. 예를 들면 다음과 같습니다.

If Length ({Employee.First Name}) < 5 Then
"short"

위의 If 식은 문자열 값을 반환합니다. 직원의 이름이 다섯 자 이내일 경우 이 문자열 값은 "short"이고 그렇지 않을 경우 빈 문자열 ""이 됩니다.

다음 수식을 살펴 보십시오.

If Year({Orders.Order Date}) >= 1995 Then
{Orders.Order Date}

1995년 이전의 주문일에 대해 위의 If 식은 Null 날짜 시간 값을 반환합니다. {주문.주문일}이 날짜 시간 데이터베이스 필드이므로 날짜 값이 아닌 날짜 시간 값이 됩니다. Crystal Reports에서는 값이 Null인 날짜 시간은 인쇄하지 않으므로 위의 수식을 보고서에 사용하면 1995년 이전 날짜에 대해서는 수식 필드가 비어 있습니다. 이 규칙은 Null 시간 값과 Null 날짜 값에도 적용됩니다.

다음 예는 If 조건의 결과로 두 개 이상의 식을 실행하기 위해 괄호를 사용하는 방법을 설명합니다. 한 회사가 3일 내에 발송되는 주문에 대해 5%의 비용을 청구하고 그렇지 않을 경우에는 2%의 비용을 청구합니다. 이 회사는 "빠른 발송 비용 $100.00" 또는 "보통 발송 비용 $20.00"와 같은 메시지를 적절히 인쇄하려고 합니다.

Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
//다음 줄의 끝에 오는 세미콜론은 선택 사항입니다.
ship := {Orders.Order Amount} * 0.05
) //이곳에 세미콜론을 넣을 수 없습니다.
Else
(
message := "Regular";
ship := {Orders.Order Amount} * 0.02;
);
//If 식을 아래의 마지막 식과 구분하려면 식 앞에 세미콜론을 사용해야 합니다.
message & " shipping is " & CStr (ship)

괄호로 식을 묶으면 전체 그룹은 단일 식으로 간주되고 그 값과 형식은 괄호 안의 마지막 식의 값과 형식이 됩니다.

//괄호 그룹 식 전체는 통화 형식을 가집니다.
(
//괄호 안에 있는 첫 번째 식은 문자열 형식을 가집니다.
message := "Rush";
//괄호 안에 있는 두 번째 식과 마지막 식은 통화 형식을 가집니다.
ship := {Orders.Order Amount} * 0.05;
)

따라서 다음과 같은 수식은 오류를 발생합니다. 그 이유는 If 식의 Then 부분이 통화 값을 반환하는 반면 Else 부분은 문자열 값을 반환하기 때문입니다. If 식이 하나의 식에 해당하고 항상 단일 형식의 값을 반환해야 하므로 이것은 허용되지 않습니다.

Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05
)
Else
(
//아래 두 줄을 서로 바꾸어 사용할 수 있습니다.
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
);
message & " shipping is " & CStr (ship)

식 순서를 고려하지 않고 잘못된 수식을 수정하는 방법 한 가지는 If 식이 모든 분기에서 동일한 형식의 상수값을 반환하도록 하는 것입니다. 예를 들면 다음의 If 식은 숫자 값 0을 반환합니다.

Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05;
0
)
Else
(
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
0
);
message & " shipping is " & CStr (ship)