図1動作中のTcxFilterControl
記載されている問題は、DevExpressのTcxFilterControlおよびTcxDBFilterControlによって見事に解決されています。 これらの2つのコンポーネントは、適切なSQLを取得する機能を備えた視覚条件ビルダーです。 実際、DevExpressにはDelphiで行うものと同様の.Net製品ラインがありますが、使用する必要はなかったため、残りはVCLブランチについてのみです...
図2デザイナーのTcxFilterControl / TcxDBFilterControl
「検索ウィザード」の独立した実装とは異なり、このソリューションは、少なくとも最初はよりスケーラブルになります。フィルタリングするクエリに新しいフィールドを追加する場合、フォームを完成する必要があり、FilterControlはすぐにフィールドを取得します。 FilterControlで置換のリストを表示する場合にのみ、追加の設定が必要になります。 これらのコントロールの主な違いは、TcxDBFilterControlがTDataSetに接続し、TcxFilterControlがTcxGridDBTableViewに接続することです。 T.O. プロジェクトにcxGridがない場合でもTcxDBFilterControlを使用できます。これは、古いプロジェクトをアップグレードするときに役立ちます。
TcxFilterControlおよびTcxDBFilterControlでは、条件はツリービューで構築されるため、コンポーネントが生成するテキストを非常に簡単に理解できます。 現在のレベルで条件を追加するには、[条件の追加]項目を選択します。
図3 FilterControlへの条件の追加
サブレベルを追加するには、「グループの追加」を選択します。
図4 FilterControlへのグループの追加
「すぐに使用できる」フィールド名の置換が機能すること、条件の置換(通常、日付の等しい/等しくない、より大きい/より小さい、前提条件の膨大な選択があります)、リスト、カレンダー、...
図5フィールドのドロップダウンリスト
図6 Date型のフィールドの条件のドロップダウンリスト
図7参照テーブルの従業員名のドロップダウンリスト
また、グループ内および条件のグループ間で値にさまざまなブール演算を指定することもできます。
図8グループ内の値のブール演算
TcxFilterControl / TcxDBFilterControlの結果、任意のデータソース(DataSet)のFilterプロパティでの使用に適した文字列が生成されます。これがローカルフィルターの取得方法です。 いくつかの注意事項(現在のリクエスト内のフィールド名の一意性)により、この条件をリクエストのWHERE部分に追加できます。 たとえば、図1では、FilterControl.FilterTextにアクセスするときにTcxFilterControlクラスのFilterControlが返されます。
((ORDER_STATE = 1)OR(ORDER_STATE = 2)OR(ORDER_STATE = 3))
AND(EMP = 2304)
これは、ローカルフィルターとデータベースのクエリの両方に適しています。
その結果-強力なツールを使用するプログラマーがしばしば非難されていることを実行した-コンポーネントをフォームに配置しました;)ユーザーにクエリを非常に柔軟に作成する機会を与えました。 2つのマイナス点があります-禁欲的な外観と、準備のできていないユーザーにとっての複雑さです。 プロは、最小限のコストで条件を生成するスケーラブルで柔軟な手段です。