レコードの検索(FireDAC)
データセットの操作(FireDAC) への移動
FireDAC には、データセット内の特定のレコードを検索するメソッドが用意されています。
概要
すべての FireDAC データセットに、ローカルのデータセット レコード キャッシュ内でレコードを検索する方法が用意されています。使われているソート方法に応じて、レコード検索を最適化することができます。
標準の検索
FireDAC データセットには、レコードを検索したり特定のキーの値をルックアップするいくつかのオプションが用意されています。これらのメソッドでは、メソッド呼び出しにとって適切であれば、現在のデータセット インデックスが使われます。
- Locate メソッドでは、指定したキーの値を基にレコードを検索することができます。
FDQuery1.IndexFieldNames := 'ORDERID';
if FDQuery1.Locate('ORDERID', 10150, []) then
ShowMessage('Order is found')
else
ShowMessage('Order is not found');
- Lookup メソッドでは、指定したキーの値を基に値をルックアップすることができます。
拡張検索
FireDAC データセットには、レコードの拡張検索メソッドも用意されています。これらのメソッドでは、メソッド呼び出しにとって適切であれば、現在のデータセット インデックスが使われます。
- LocateEx メソッドは、Locate メソッドと似ていますが、検索方向が前方か後方か、先頭から検索するか現在のレコードから検索するか、テキスト述語(式)を使用して検索するかなど、より多くのオプションを指定することができます。以下に例を示します。
if FDQuery1.LocateEx('Price >= 1000 and Price <= 2000', []) then
ShowMessage('Order is found')
else
ShowMessage('Order is not found');
- LookupEx メソッドは、Lookup メソッドと似ていますが、LocateEx メソッドと同様のオプションが提供されています。
フィルタを使用した検索
このレコード検索方法は、BDE コンポーネントとの互換性を保つために FireDAC に導入されたものです。これは完全に LocateEx メソッドに置き換えることができます。この検索方法では以下のメソッドを使用しています。
- FindFirst -- 述語の条件を満たす最初のレコードを探します。
- FindNext -- 現在のレコードより後で、述語の条件を満たす次のレコードを探します。
- FindPrior -- 現在のレコードより前で、述語の条件を満たす前のレコードを探します。
- FindLast -- 述語の条件を満たす最後のレコードを探します。
検索を開始するには、アプリケーションで、述語を論理式として Filter プロパティに指定しなければなりません。ただし、このメソッドを使用してフィルタ付きのデータセット内のレコードを検索することはできません。また、フィルタはアクティブ化されておらず、レコードの検索にしか使用できません。以下に例を示します。
FDQuery1.Filter := 'Price >= 1000 and Price <= 2000';
if FDQuery1.FindFirst then
ShowMessage('Found !');
...
if FDQuery1.FindNext then
ShowMessage('Found !');
インデックスとキー値を使用した検索
この便利なレコード検索方法は、BDE コンポーネントとの互換性を保つために FireDAC に導入されたものです。この検索方法では以下のメソッドを使用しています。
- SetKey -- データセットを dsSetKey モードに設定します。その結果、インデックス フィールド値を指定できるようになります。
- GotoKey -- インデックス フィールド値を使って厳密に 1 つのレコードを検索します。SetKey メソッド呼び出しの後に指定します。
- GotoNearest -- インデックス フィールド値を使って厳密に 1 つのレコードまたは次のレコードを検索します。SetKey メソッド呼び出しの後に指定します。
- FindKey -- 指定したインデックス フィールド値を使って厳密に 1 つのレコードを検索します。
- FindNearest -- 指定したインデックス フィールド値を使って厳密に 1 つのレコードまたは次のレコードを検索します。
これらのメソッドを呼び出す前に、現在のインデックスを設定しておく必要があります。以下に例を示します。
FDQuery1.IndexFieldNames := 'ORDERID';
FDQuery1.SetKey;
FDQuery1.FieldByName('ORDERID').AsInteger := 10150;
if FDQuery1.GotoKey then
ShowMessage('Order is found')
else
ShowMessage('Order is not found');
その他のオプション
ほとんどの検索メソッドでは、レコードが見つかると True が返されます。あるいは、アプリケーションでデータセットの Found プロパティを確認することもできます。
また、FireDAC では、fkCalculated および fkLookup の種類のフィールドの検索をサポートしていません。ただし、fkInternalCalc および fkAggregate のフィールドを検索操作に使用することは可能です。