Crystal Reports for Rational Application Developer ガイド

If 式の考察(Crystal 構文)

If 式は 1 つの式です。つまり、If 式が評価されると、If 式は指定された型の値を返します。Else 句がなく、条件が真でない場合、返される値は、その型のデフォルト値になります。以下はその例です。
If Length ({Employee.First Name}) < 5 Then
"short"
この If 式は文字列型の値を返します。社員の名前が 5 文字未満の場合は、文字列値 “5 文字未満”が返され、それ以外の場合は、空の文字列 "" が返されます。
別の例を考えます。
If Year({Orders.Order Date}) >= 1995 Then
{Orders.Order Date}
この If 式は、1994 年以前の受注日に対しては NULL の日時型値を返します。それが日付型の値ではなく、日時型の値なのは、{Orders.受注日}が日時型のデータベース フィールドだからです。Crystal Reports は NULL の日時型値を出力しないため、上の式をレポートに配置すると、1994 年以前の受注日に対する式フィールドは空欄になります。NULL の時刻型値と NULL の日付型値も同じように動作します。
次の例は、If 条件の結果として、複数の式を実行するためのかっこの使い方を説明するものです。ある会社では、3 日以内に出荷する注文には 5 パーセントの送料を請求し、それ以外の注文には 2 パーセントの送料を請求するとします。それに合わせて、“至急:送料 $100”や“通常:送料 $20”などのメッセージを出力します。
Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
//A semicolon at the end of the next line
//is optional
ship := {Orders.Order Amount} * 0.05
) //A semicolon cannot be placed here
Else
(
message := "Regular";
ship := {Orders.Order Amount} * 0.02;
);
//The preceding semicolon is required to separate the
//If expression from the final expression below
message & " shipping is " & CStr (ship)
かっこを使って複数の式をグループ化した場合は、そのグループ全体で 1 つの式と見なされるので、そのグループの値と型は、かっこ内の最後の式の値と型になります。
//The parentheses group expression as a whole has
//Currency type
(
//The first expression in the parentheses has
//String type
message := "Rush";
//The second and final expression in parentheses
//has Currency type
ship := {Orders.Order Amount} * 0.05;
)
したがって、たとえば、次の式はエラーになります。なぜなら、If 式の Then 部分は通貨型の値を返し、Else 部分は文字列型の値を返しているからです。If 式は 1 つの式であり、必ず 1 つの型の値を返す必要があるので、この式は誤りです。
//An erroneous formula
Local StringVar message;
Local CurrencyVar ship;
If {Orders.Ship Date} - {Orders.Order Date} <= 3 Then
(
message := "Rush";
ship := {Orders.Order Amount} * 0.05
)
Else
(
//The following 2 lines were interchanged
ship := {Orders.Order Amount} * 0.02;
message := "Regular";
);
message & " shipping is " & CStr (ship)
式の順序を考慮しないでエラーのある式を修正するには、どの条件分岐でも、If 式が同じ型の定数値を返すようにする方法があります。たとえば、次のように、If 式が数値型の値 0 を返すようにします。
//Repaired the erroneous formula
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)




Business Objects, an SAP company
http://japan.businessobjects.com/
サポート サービス
http://japan.businessobjects.com/support/
Web 上の製品マニュアル
http://support.businessobjects.com/documentation/