Crystal Reports Designer  

式のグループ化(Crystal 構文)

If 式は 1 つの式です。つまり、If 式が評価されると、If 式は指定された型の値を返します。Else 句がなく、条件が真でない場合、返される値は、その型のデフォルト値になります。例 :

If Length ({Employee.名}) < 5 Then
"5 文字未満"

この If 式は文字列型の値を返します。社員の名が 5 文字未満の場合は、文字列値“5 文字未満”が返され、それ以外の場合は、空の文字列“ ”が返されます。

別の例を考えます。

If Year({Orders.受注日}) >= 1995 Then
{Orders.受注日}

この If 式は、1994 年以前の受注日に対しては NULL の日時型値を返します。それが日付型の値ではなく、日時型の値なのは、{Orders.受注日}が日時型のデータベース フィールドだからです。NULL の日時型値は出力されないため、上の式をレポートに配置すると、受注日が 1994 年以前の場合、式フィールドは空欄になります。NULL の時刻型値と NULL の日付型値も同じように動作します。

次の例は、If 条件の結果として、複数の式を実行するためのかっこの使い方を説明するものです。ある会社では、3 日以内に出荷する注文には 5 パーセントの送料を請求し、それ以外の注文には 2 パーセントの送料を請求するとします。それに合わせて、“至急:送料 $100.00”や“通常:送料 $20.00”などのメッセージを出力します。

Local StringVar message;
Local CurrencyVar ship;
If {Orders.出荷日} - {Orders.受注日} <= 3 Then
(
message := "至急";
//次の行の末尾のセミコロンは
//省略できます
ship := {Orders.受注額} * 0.05
//ここにセミコロンを置くことはできません
Else
(
message := "通常";
ship := {Orders.受注額} * 0.02;
);
//この直前にあるセミコロンは、If 式と
//この下の最後の式を区切るために必要です
message & " : 送料" & CStr (ship)

かっこを使って複数の式をグループ化した場合は、そのグループ全体で 1 つの式と見なされるので、そのグループの値と型は、かっこ内の最後の式の値と型になります。

//かっこでグループ化された次の式は
//全体として通貨型になります
(
//かっこ内の最初の式は
//文字列型です
message := "至急";
//かっこ内の 2 番目の最後の式は
//通貨型です
ship := {Orders.受注額} * 0.05;
)

したがって、たとえば、次の式はエラーになります。なぜなら、If 式の Then 部分は通貨型の値を返し、Else 部分は文字列型の値を返しているからです。If 式は 1 つの式であり、必ず 1 つの型の値を返す必要があるので、この式は誤りです。

//エラーのある式
Local StringVar message;
Local CurrencyVar ship;
If {Orders.出荷日} - {Orders.受注日} <= 3 Then
(
message := "至急";
ship := {Orders.受注額} * 0.05
)
Else
(
//次の 2 行が入れ替えられています
ship := {Orders.受注額} * 0.02;
message := "通常";
);
message & " : 送料" & CStr (ship)

式の順序を考慮しないでエラーのある式を修正するには、どの条件分岐でも、If 式が同じ型の定数値を返すようにする方法があります。たとえば、次のように、If 式が数値型の値 0 を返すようにします。

//エラーを修正した式
Local StringVar message;
Local CurrencyVar ship;
If {Orders.出荷日} - {Orders.受注日} <= 3 Then
(
message := "至急";
ship := {Orders.受注額} * 0.05;
   0
)
Else
(
ship := {Orders.受注額} * 0.02;
message := "通常";
   0
);
message & " : 送料" & CStr (ship)

参照

If 式 | Select 式