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)