Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】データセットのFilterによる絞り込み

TFDMemTableTClientDataSetなどのデータセット(TDataSet)は、
FilterおよびFilteredプロパティの設定によって内部データの絞り込みができます。

基本的にはSQLのWHERE句と似たような記述なのですが、
異なる箇所もあるため本記事でまとめてみたいと思います。

 

設定方法

TFDMemTableやTClientDataSetなどのデータセットでは、
以下のプロパティを使用可能です。

  • Filter:データセットの現在のフィルタのテキストを示します。
  • Filtered:フィルタ処理がデータセットに対してアクティブかどうかを指定します。

Filterが正しく設定された状態でFilteredをTrueに設定すると、
指定した条件に合致するデータのみが表示されます。
FilteredをFalseに設定すると絞り込みが解除され、元の全件が表示されます。

 

使用できる条件式

本記事ではページの仕様上シングルクォーテーションが全角文字『‘ ’』になっていますが、
実際には半角のシングルクォーテーション『' '』を指定して下さい。

①数値や文字列の比較

※通常の条件式です。文字列の比較は大文字・小文字を区別します。

  • FieldName = 100 // 等しい
  • FieldName <> 100 // 等しくない
  • FieldName > 100 // より大きい
  • FieldName >= 100 // 以上
  • FieldName < 100 // より小さい
  • FieldName <= 100 // 以下
     
     
  • FieldName = ‘ABC’ // 等しい
  • FieldName <> ‘XYZ’ // 等しくない

 

②NULL値チェック

※値がNULLかそうでないかのチェックに使用。

  • FieldName IS NULL // NULL値の場合
  • FieldName IS NOT NULL // NULL値ではない場合

 

③AND, OR条件

※複数条件を組み合わせる場合に使用。
 各条件は ( ) で囲んだ方がわかりやすい。

  • (Field1 > 100) AND (Field2 < 50) // 両方の条件を満たす
  • (Field1 = ‘Test’) OR (Field2 = 200) // いずれかの条件を満たす

 

④NOT条件

※条件を反転させる場合に使用。

  • NOT (FieldName = 100) // 条件を満たさない場合
  • NOT (FieldName IS NULL) // NULL値ではない場合

 

⑤日付や時刻の比較

日付や時刻は ‘ ‘ で囲んだ文字列としてFilterに設定します。

※コンポーネントによっては、年月日の区切り文字に「-」が使える場合もあります。
※日付時刻型(TDateTime)のフィールドでは、時刻部分も指定するか範囲で絞り込み。

  • FieldName = ‘2024/11/20’ // 指定の日付と一致
  • FieldName > ‘2024/01/01’ // 指定の日付より後
  • FieldName < ‘2023/12/31’ // 指定の日付より前
  • FieldName = ’16:42:45′ // 指定の時刻と一致

 

⑥文字列の部分一致(LIKE)

※「%」を右または左の片側のみに付ければ前方一致、後方一致も可能。
※部分一致しない(含まない)条件にしたい場合は、条件ごと NOT( ) で囲む。

  • FieldName LIKE ‘%ABC%’ // 部分一致(指定文字を含む)
  • NOT (FieldName LIKE ‘%ABC%’) // 部分一致しない(指定文字を含まない)場合

 

⑦フィールド間の比較

  • Field1 > Field2
  • Field1 = Field2

 

注意事項

表示される(使用できる)レコードを制限するための処理なので、
内部的には表示されていないレコードもメモリに保持しています。
そのため、以下のような事象にご注意ください。

  • RecordCountはフィルタで表示されている行だけの総数がカウントされます。
  • フィルタ状態でレコードを編集してPOSTした際に、フィルタ条件に合致しなくなるとその行は非表示になります。
  • SQLでWHERE句を使用せずにフィルタで絞り込みを行われている機能を稀に見かけますが、
    この場合は対象データ全件をメモリに取り込むため処理時間が増大します。
    Filterの条件を頻繁に変更するのでなければ、データ取得時にSQLのWHERE句で絞り込んだ方が処理を高速化できます。
  • EmptyDataSetでレコード全削除を命令した場合、
    フィルタの有無にかかわらずメモリ内のレコードが全て削除されてしまいますのでご注意ください。

 

関連リンク