株式会社ミガロ.では、2025年10月に、
Delphi/400の最新バージョンとなる『12 Athens』をリリースいたしました。
Delphi/400 12 Athens リリース(Migaro. ニュース)
本Tipsでは、Delphi/400 12 Athensの新機能や新しい開発手法について
4回に分けてご紹介いたします。
第4回(最終回)の今回は、新たにFireDACにおいてサポートが導入された
『QBEモード』についてご紹介します。
QBE(Query by Example:例示による問い合わせ)とは、
テーブルに対して例を入力する視覚的な問い合わせ手法です。
ユーザーによってフィールドに入力された値を使用して、
ローコードで簡単かつ柔軟なデータの絞り込みや並べ替えが可能になっています。
QBEのプログラム実装手順
ここからは発注照会をイメージしたサンプル画面を作成しながら、QBEの実装手順を説明します。
まず下図のような、FireDAC接続の照会画面を作成します。
(本記事では、サインオン処理のロジックなどは省略します。)

サインオン処理まで実装した後、
今回使用するサンプルデータを表示するロジックを記述します。
この時点でコンパイル・実行を行うと、接続後にIBM i上のデータが照会画面に表示されます。
ここまでは一般的な業務システムにおける基本的な発注照会処理と同様です。

次に、この発注照会処理に、QBEを用いたデータの絞り込み機能を実装します。
ツールパレットの「FireDAC」カテゴリから、新設されたTFDQBEコンポーネントをフォームに配置します。

配置したTFDQBEコンポーネントのプロパティの一覧から、
DataSourceプロパティを既存のTDataSource(今回はDataSource1)に設定します。
また、OptionsプロパティのqoPartialをFalseに設定します。
(※Trueのままだと、文字列の完全一致と部分一致があいまいになります)

さらに、絞り込み条件入力用のTEditやTLabel、処理実行用のTButtonを配置します。

TFDQBEコンポーネントの利用に際しては、以下のメソッドが中心的な役割を担います。
- Edit:
QBEの利用開始時に呼び出します。内部的に「QBETable」というTFDMemTableが生成されます。
対象となるTFDQuery(またはTFDTable)の各フィールド名に対応する文字フィールドが生成されます。
絞り込み条件はこのQBETableに対してレコードを追加する形で指定します。 - Post:
QBETableに対して入力された絞り込み条件を確定し、実際の絞り込みを実行します。 - Cancel:
絞り込みを解除し、QBETableを解放します。 - SaveToFile/LoadFromFile:
絞り込み条件を外部ファイルに保存あるいは読み込むためのメソッド。
絞り込み条件などの記述方法については、以下の一覧をご参照ください。
- 文字フィールドの場合
(AAは絞り込みたい文字列の一例)- 『AA』『=AA』→ 完全一致
- 『AA%』『%AA』『%AA%』→ 前方/後方/部分一致
- 『>AA』→ AAより大きい
- 『<AA』→ AAより小さい
- 『>=AA』→ AA以上
- 『<=AA』→ AA以下
- 『<>AA』または『!AA』→ AAでない
- 『!%AA%』→ AAを含まない
- 数値フィールドの場合
(数値でも文字列のように扱える)- 『2025』『=2025』→ 完全一致
- 『2025%』『%2025』『%2025%』→ 文字として前方/後方/部分一致
- 『>2025』→ 2025より大きい
- 『<2025』→ 2025より小さい
- 『>=2025』→ 2025以上
- 『<=2025』→ 2025以下
- 『<>2025』または『!2025』→ 2025でない
- 『!%2025%』→ 文字として2025を含まない
- 並び順
- 『#1』→ 昇順でORDER BY(第1位)
- 『#2』→ 昇順でORDER BY(第2位)
- 『#-1』→ 降順でORDER BY(第1位)
- 『#-2』→ 降順でORDER BY(第2位)
- 複合条件(区切り文字やスペースを入れると複合条件にできる)
- 『AA & BB』→ AAかつBB
- 『AA | BB』→ AAまたはBB
- 『!ZZ & (AA | BB)』→ ZZでなく、AAまたはBB
- 『>=2020 & <=2030』→ 2020以上、かつ2030以下
- 『%AA% #1』→ AAを含み、かつ昇順でORDER BY
- 『>=2025 #-1』→ 2025以上、かつ降順でORDER BY
上記を踏まえて、絞込ボタン押下時にTFDQBEを使って
絞り込みを行うロジックを以下のように記述することが可能です。
このロジックでは「FDQBE1.Post」を行ったタイミングで絞り込みが行われます。
また処理開始時に絞り込み条件を初期化しているため、
各TEditを空にして絞込ボタンを押すとデータは元の全件表示となります。
{*******************************************************************************
絞込 ボタン押下時処理
*******************************************************************************}
procedure TForm1.Button2Click(Sender: TObject);
begin
FDQBE1.Edit; // 絞り込み条件入力開始(QBETableが生成される)
FDQBE1.QBETable.EmptyDataSet; // QBETableを空にする(絞り込み条件初期化)
FDQBE1.QBETable.Append; // QBETableに条件追加開始
if (edtHANO.Text <> '') then
begin // ↓フィールド単位で条件を指定(発注№)
FDQBE1.QBETable.FieldByName('HAHANO').AsString := edtHANO.Text;
end;
if (edtHICD.Text <> '') then
begin // ↓フィールド単位で条件を指定(品番)
FDQBE1.QBETable.FieldByName('HAHICD').AsString := edtHICD.Text;
end;
if (edtNOKI.Text <> '') then
begin // ↓数値もQBETableでは全て文字フィールド(希望納期)
FDQBE1.QBETable.FieldByName('HANOKI').AsString := edtNOKI.Text;
end;
FDQBE1.QBETable.Post; // QBETableのレコードを確定
FDQBE1.Post; // 絞り込み条件の確定(絞り込みが行われる)
end;
ロジック実装後に、元のファイル(FDQuery1)を開いた状態で

たとえば以下のように絞り込み条件を入力して「絞込」ボタンを押すと……

以下のようにデータが抽出されます。

品番:%B1%(「B1」を含む)
希望納期:<20240920(20240920未満)
・・・にすべて合致するレコードだけが抽出される

内部的に生成されているSQLを引数AQueryDescで可視化することもできます。
また内部的にはFDQuery1のSQLごと変更されており、
TFDQBEの条件を空にすると内部保持されていた元々のSQLが再セットされます。)
このように、QBEを活用すれば、
これまでのように検索条件ごとにSQL文のWHERE句やORDER BY句をコードで書き換えて
並び順の指定や絞り込みを行うよりも、シンプルにデータの並べ替えや絞り込みが記述できます。
場面によっては大変便利なコンポーネントなので、是非お試しください。
関連リンク
- FireDAC.Comp.QBE.TFDQBE – RAD Studio(Docwiki コンポーネントの解説)
- RAD Studio 12 Athensの新機能「FireDACのQBEサポート」 – YouTube(エンバカデロ)
<Delphi/400 12 Athensの新機能>
第1回:IDEの新機能や機能拡張
第2回:Smart CodeInsightで生成AI連携
第3回:JSONバインディングウィザード
第4回:FireDACの新機能QBE(本記事)