レコードのソート(FireDAC)
データセットの操作(FireDAC) への移動
概要
すべての FireDAC データセットに、ローカルでレコードをソートする方法が用意されています。FireDAC は、レコードをソートする前に、すべてのレコードを結果セットから取得します。FireDAC は、内部的にソート済みのレコードのリストを作成して保守します。そのため、レコードの量が多ければソートに時間がかかる場合がありますが、その後のレコードのナビゲーションはソートなしの場合と同じような速さで行われます。
標準のソート
フィールド値でデータセットをソートするには、アプリケーションで IndexFieldNames プロパティを使用します。複数フィールドや、大文字/小文字の区別、降順モードがサポートされています。または、FormatOptions.SortOptions を使用してソート順のプロパティを変更することができます。例:
FDQuery1.IndexFieldNames := 'ORDERID';
または
FDQuery1.IndexFieldNames := 'OrderDate:D;Price';
また、データセットのインデックスが Indexes コレクションに定義されている場合には、インデックスの 1 つを選択することができます。そのためには、IndexName プロパティを使用します。例:
with FDQuery1.Indexes.Add do begin
Name := 'By OrderDate';
Fields := 'OrderDate';
Active := True;
end;
FDQuery1.IndexName := 'By OrderDate';
データセット ビュー
FireDAC では、Indexes コレクションを使用してデータセット レコードのビューを定義することができます。次の TFDIndex プロパティでビューを制御します:
- フィールドによるソート(Fields、CaseInsFields、DescFields、Options)
- 式によるソート(Expression、Options).
- レコード フィルタ (Filter、FilterOptions).
- レコード区別フラグ(Distinct)
ビューは、Name プロパティで識別されます。これは、データセット内で一意でなければなりません。
ビューとは、アプリケーションでレコードを取得または編集したときに FireDAC によって保守されるレコードのリストです。ビューは、ビューの Active プロパティとデータセットの IndexesActive プロパティが両方 True に設定されている場合に保守されます。ビューの Options に soUnique または soPrimary プロパティが含まれていて、アプリケーションでレコードの一意性を維持する必要がある場合には、データセットの ConstraintsEnabled プロパティを True に設定します。
ビューが選択されている場合、データセットはそのビューによって保守されているレコード リストを表します。ビューを選択するには、ビューの Selected プロパティを True に設定するか、データセットの IndexName プロパティをそのビューの名前に設定します。例:
with FDQuery1.Indexes.Add do begin
Name := 'May sale dates';
Fields := 'OrderDate';
Filter := 'MONTH(OrderDate) = 5';
Distinct := True;
Active := True;
Selected := True;
end;
その他のオプション
Locate、Lookup、SetRange など、一部のナビゲーション メソッドでは、現在のソート順を使って操作を最適化しています。Filter プロパティでは、フィルタリングの最適化にビューを使用しません。
アプリケーションでは、fkInternalCalc および fkAggregate のフィールドをソートに使用できます。FireDAC では、fkCalculated および fkLookup の種類のフィールドのソートをサポートしていません。その代わりに、アプリケーションで fkInternalCalc フィールドを作成し、fkCalculated または fkLookup フィールド値を持つ OnCalcFields イベント ハンドラでそこに値を設定し、それからその fkInternalCalc フィールドでソートすることができます。
元のレコード順(レコードがフェッチされたまたは/および追記された順)でデータセットをソートするには、プロパティ IndexFieldNames および Fields の値に # を使用します。
TFDTable とソート
TFDTable のソートはサーバー側で行われます(ORDER BY)。FireDAC では、ユーザーが意識しない形で自動的に主キー フィールドがソート順に追加されることに注意してください。これは、ライブ データ ウィンドウ機能を適切に実行するために必要です。