説明
Switch は、式を左から右の順番に評価し、結果が True となった最初の式に対応する値を返します。
引数
論理値式1、論理値式2、... は論理値を返す式。
戻り値1、戻り値2、... は、返される値の候補。戻り値は、すべて同じデータ型である必要があります。戻り値には、単純型(数値、通貨、文字列、論理値、日付、時刻、日時)または範囲(数値型範囲、通貨型範囲、文字列型範囲、日付型範囲、時刻型範囲、日時型範囲)を指定できます。配列は指定できません。
戻り値
戻り値1、戻り値2、... の値リストの値の 1 つ。返される値のデータ型は、戻り値のデータ型と同じです。
アクション
Switch の引数リストは、式(論理値式)と値(戻り値)の組で構成されます。Switch は、式を左から右の順番に評価し、結果が True となった最初の式に対応する値を返します。
たとえば、論理値式1 が True の場合は、戻り値1 を返します。論理値式1 が False で論理値式2 が True の場合は、戻り値2 を返します。論理値式1 と論理値式2 が False で論理値式3 が True の場合は、戻り値3 を返します。
すべての式が False の場合、Switch はデフォルト値を返します。返されるデフォルト値は、戻り値リストの値のデータ型で決まります。たとえば、戻り値が数値型の場合、デフォルト値は 0 です。また、戻り値が文字列型の場合、デフォルト値は空の文字列(“”)です。
用途
場合によっては、If-Then-Else 演算子や Select 式(Crystal 構文)の代わりに Switch を使用できます。
制御構造より Switch 関数を使用した方がよい場合は、レコード選択式がデータベース サーバーにプッシュ ダウンされるように式を書くときです。次がその例です。関連するテクニックについては、Crystal Reports ユーザーズ ガイドの「最適化された Web レポートの作成」章にある、機能拡張されたレコード選択式の使用に関する節を参照してください。
例
受注額に応じて注文を“大”、“中”、“小”に分類するとします。
Switch ({Orders.Order Amount} > 5000, "large",
{Orders.Order Amount} > 1000, "medium",
True, "small"){Orders.受注額}が 5,000 ドルより大きい場合、式は文字列“大”を返します。また、{Orders.受注額}が 1,000 ドルより大きい場合は、文字列“中”を返します。その他の場合は、文字列“小”を返します。
次の例で、Switch 関数を使用して、データベース サーバーにプッシュ ダウンできる効果的なレコード選択式を記述する方法を紹介します。この式を If-Then-Else 演算子または Select 式(Crystal 構文)を使って記述すると、プッシュ ダウンできません。
関連するテクニックについては、Crystal Reports ユーザーズ ガイドの「最適化された Web レポートの作成」章にある、機能拡張されたレコード選択式の使用に関する節を参照してください。
サンプル レポート
27 個の Switch 条件を持つさらに完成させた例が、Record Selection on DateRange.rpt というサンプル レポートにあります。
サンプル レポートは、Crystal Reports をインストールしたディレクトリ下の \Samples\Jp\Reports フォルダにあります。
レポートをプレビューするときは、参照する受注日{?reference date}および範囲の条件{?reference condition}を指定して、参照する受注日を基準とした日付範囲を指定します。レポートは、受注日が指定された範囲になっているレコードのみでプレビューされます。
レコード選択は、すべてデータベース サーバー上で実行されます。Switch 関数とその引数は、データベースにアクセスする前にすべて評価されるからです。
注
つまり、この Switch 関数には、明示的にデフォルト値が用意されています。他の式の値がどれも True ではない場合は、最後の式が自動的に True になり、その結果、日付の範囲として CDate(1899, 12, 30) To CDate(1899, 12, 30) が返されます。
//Crystal syntax record selection formula
{Orders.Order Date} in
Switch
(
{?reference condition} = "Aged 0 to 30 days",
({?reference date} - 30) To {?reference date},
{?reference condition} = "Aged 31 to 60 days",
({?reference date} - 60) To ({?reference date} - 31),
{?reference condition} = "Aged 61 to 90 days",
({?reference date} - 90) To ({?reference date} - 61),
True, // provide default handling and specify a valid range
CDate(1899, 12, 30) To CDate(1899, 12, 30)
)
コメント
Switch 関数のすべての引数は、値が返される前に評価されます。したがって、Switch を使用する場合は、予期しない副作用に注意する必要があります。
たとえば、戻り値の 1 つが 0 による除算を行うと、Switch 関数から返される値がその戻り値でない場合でも、エラーが発生します。