検索結果をコンボボックスにリスト表示する
-
25-09-2019 - |
質問
ちょっとハック的なので、検索を変更したいと思います。現在、次のように動作します。
- ユーザーはテキストボックスにテキストを入力します。たとえば、 ボルボ そして検索を開始します。
- これは SQL を使用して Volvo を含むすべての投稿を検索します。
- 結果は、BoldID と DisplayValue の 2 つの列を含むリストになります。
- BoldID は、データベース内のオブジェクトを識別するための単なる一意の番号です。
- DisplayValue は、結果のリストでユーザーに表示されるものです。
- 結果セットの各行は、ユーザー リストの行番号で識別されます。最初は 1、2 番目は 2 というようになります。
- コード内でクエリをループすることにより、意図的に最大 99 件のヒットのみを表示するという制限もあります。ユーザーのヒット リストにそれ以上のヒットが含まれていても意味がないため、多数のヒットを返すクエリを持つことは適切ではありません。この場合、検索はより具体的にする必要があります。
結果リストは、右ペインと呼ばれる別のグローバル ウィンドウに表示されます。厄介な点は、モーダル ダイアログから検索する場合、マウスで値を選択できるようにするために、右ペインをメイン ウィンドウからドッキング解除する必要があることです。これが、アプリケーションがメイン ウィンドウの背後にあるモーダル ダイアログで自分自身をロックする場合がある理由である可能性があると考えられます。
変更後は次のように動作するはずです。
ユーザーはコンボボックスにテキストを入力し、以前と同様に SQL オンデマンドで検索を開始します。ただし、結果セットはコンボボックスに表示されます。したがって、現在使用されており正常に動作する古い SQL クエリがたくさんあるため、可能であれば表示のみを変更したいと考えています。
Delphi 2007、Interbase 2009、および DevExpress のコンポーネントを使用しています。昨日、customdatasource をコンボボックスに接続しようとしましたが、これがまだ実装されていないことに気付きました。見る TcxExtLookupComboBox で TcxCustomDataSource を使用する方法. 。カスタム データソースを使用して行番号と最大ヒット数を実装したいと考えています。上のリストの 6 と 7 です。
したがって、次の 2 つのオプションが表示されます。
- DB 対応コンボボックスを使用する
- テキスト ボックスを使用し、それにグリッドをアタッチして結果セットを表示します。
コンボボックスはコンポーネント全体なのでシンプルですが、上記のリストの機能 6 と 7 を実装する方法がわかりません。テキストボックスとグリッドを使用すると、より自由度が高くなりますが、より多くの作業が必要になります。
私は最初のオプションを好みます。現在の問題は次のとおりです。
- Interbase SQL では結果セット内のヒット数を制限できないと思います。それはコードで行う必要があります。DB 対応のコンボボックスを使用してこれをどのように行うのでしょうか?
- 結果セットの行番号を表示するにはどうすればよいですか?
アップデート 1:要件 7 は Marjan のおかげで解決されました、ありがとう。6に関しては難しいと思います。理想的には、SQLでそれを実行して、次のような独自の列を抽出できるようにしたいです。 行番号の追加. 。しかし、Interbase はそれをサポートしていません。
解決
要件6:
はデシベルのid値が整数であると仮定すると、あなたはid値を格納するコントロールのタグまたはコンボボックス/リストボックス内の文字列のオブジェクトを使用することができます。
[擬似コード
while not eof do
ComboBox.Items.AddObject(<DisplayText From Db>, TObject(<IntegerID from Db>));
など
のようにそれを使用しますid := Integer(ComboBox.Items.Objects[ComboBox.ItemIndex]);
要件7:
EOFまたは99行ゴマクエリをループデシベル意識コンボボックス/リストボックスを使用したが出ています。だから、SQLに頼る必要があるだろう。あなたは、現在のSQL文のいずれかを変更したくない場合でも、あなたは、行の数を制限するために、SQLの「TOP」機能を使用することができます。たとえば、
SELECT TOP 99 FROM (<your original SQL>)
でInterbaseのSQLを使用して、フレーズを使用することができます:
ROWS 1 TO 99
ちょうど順序句の後に( http://blogs.teamb.comでの例を参照/ craigstuntz / dtpostname / ibsqlintro / の - ページのほとんど下)