ルックアップ フィールドの定義
新しい永続フィールドの定義 への移動
ルックアップ フィールドとは、指定した検索基準に基づいて実行時に値を表示する、読み取り専用のフィールドです。最も単純な使い方では、ルックアップ フィールドに、検索対象の既存フィールドの名前、検索するフィールド値、および値を表示しなければならないルックアップ データセット内の別のフィールドを渡します。
たとえば、通信販売のアプリケーションで、オペレータがルックアップ フィールドを使用して、顧客から知らされた郵便番号に対応する州と市を自動的に判断できるとします。この場合の検索対象の列は ZipTable.Zip、検索する値は Order.CustZip に入力された顧客の郵便番号、返す値は ZipTable.Zip の値が Order.CustZip フィールドの現在の値と一致するレコードの ZipTable.City 列と ZipTable.State 列の値です。
メモ: 単方向の(dbExpress)データセットは、ルックアップ フィールドをサポートしていません。
[フィールドの新規作成]ダイアログ ボックスでルックアップ フィールドを作成するには:
- [名前]編集ボックスにルックアップ フィールドの名前を入力します。既存フィールドの名前を入力してはなりません。
- [型]コンボ ボックスからフィールドのデータ型を選択します。
- 必要であれば、[サイズ]編集ボックスにフィールドのサイズを入力します。サイズが必要になるのは、Data.DB.TStringField 型、Data.DB.TBytesField 型、および Data.DB.TVarBytesField 型のフィールドの場合だけです。
- [フィールドの種類]グループで、[ルックアップ]を選択します。[ルックアップ]を選択すると、[データセット]と[キー フィールド]のコンボ ボックスが有効になります。
- [データセット]コンボ ボックスのドロップダウン リストから、フィールド値を検索するデータセットを選択します。このルックアップ データセットは、フィールド コンポーネント自体のデータセットとは異なるものでなければなりません。そうでなければ実行時に循環参照例外が発生します。ルックアップ データセットを指定すると、[ルックアップ キー]と[値を返すフィールド]のコンボ ボックスが有効になります。
- [キー フィールド]のドロップダウン リストから、現在のデータセット内の、値を照合するフィールドを選択します。複数のフィールドと照合する場合には、ドロップダウン リストから選択するのではなく、フィールド名を直接入力します。フィールド名の間はセミコロンで区切ります。複数のフィールドを使用する場合には、永続フィールド コンポーネントを使用しなければなりません。
- [ルックアップ キー]のドロップダウン リストから、ステップ 6 で指定した[キー フィールド]のフィールドと照合する、ルックアップ データセット内のフィールドを選択します。キー フィールドを複数指定している場合には、同じ数のルックアップ キーを指定しなければなりません。複数のフィールドを指定するには、複数のフィールド名をセミコロンで区切って直接入力します。
- [値を返すフィールド]のドロップダウン リストから、作成するルックアップ フィールドの値として返す、ルックアップ データセット内のフィールドを選択します。
アプリケーションを設計して実行すると、ルックアップ フィールドの値は、計算フィールドの値を計算する前に決定されます。ルックアップ フィールドを使って計算フィールドを計算することはできますが、計算フィールドを基にルックアップ フィールドを作成してはなりません。
LookupCache プロパティを使用すると、ルックアップ フィールドの決定方法を調整することができます。LookupCache によって、データセットを最初に開いたときにルックアップ フィールドの値をメモリ内にキャッシュするのか、データセット内の現在のレコードが変化するたびに動的にルックアップを行うのかが決まります。LookupDataSet が変更される可能性が低く、相異なるルックアップ値の数が少ない場合には、LookupCache を True に設定して、ルックアップ フィールドの値をキャッシュします。ルックアップ値をキャッシュすると、DataSet を開いたときに LookupKeyFields 値のセットごとにルックアップ値があらかじめ読み込まれるため、パフォーマンスが向上します。DataSet 内の現在のレコードが変化すると、フィールド オブジェクトは、LookupDataSet にアクセスするのではなく、キャッシュ内で Value を探すことができます。こうすることによるパフォーマンスの向上は、アクセスに時間のかかるネットワーク上に LookupDataSet が置かれている場合に特に顕著です。
DataSet のレコードごとに KeyFields の値が異なっている場合には、キャッシュ内で値を検索するオーバーヘッドが、キャッシュによって向上するパフォーマンスより大きくなりかねません。KeyFields が取ることのできる相異なる値の数が増えるほど、キャッシュ内で値を検索するオーバーヘッドも大きくなります。
LookupDataSet が揮発性の場合、ルックアップ値をキャッシュすると結果が不正確になる可能性があります。RefreshLookupList を呼び出すと、ルックアップ キャッシュ内の値を更新できます。RefreshLookupList は、LookupKeyFields 値のセットそれぞれの LookupResultField の値を保持する LookupList プロパティを再生成します。
実行時に LookupCache を設定する場合には、RefreshLookupList を呼び出してキャッシュを初期化してください。