2016-10-04 5 views
0

私はデータベースのデータを表示するDBGridを使用しています。DBGrid内のデータを検索し、そのDBGridが表示する内容を一時的に変更する検索を追加する - Delphi

データベースには11個の列が含まれているテーブルが含まれています。 列番号4は顧客名と呼ばれ、顧客の名前を含みます。

私は希望のクライアント名で書くとよい(Google検索バーに似た)検索ボックスを希望します DBGridを変更すると、そのクライアント名を含む行のみが4番目に表示されます列(列顧客名)

例:

Column names: 

column1 - column2 - column3 - customer name - column5 - column6 - column7 - column8 - column9 - column10 - column11 
blabla blabla blabla John Edwards blabla blabla blabla blabla blabla blabla  blabla 
blabla1 blabla1 blabla1 Michael Skunk blabla blabla blabla blabla blabla blabla  blabla 
blabla2 blabla2 blabla2 John Edwards blabla2 blabla2 blabla2 blabla2 blabla2 blabla2 blabla2 

などなど...行の多くは、すべての列に異なる情報を持つすべての。 ある時点で、残りの列には異なる情報がありますが、列番号4(顧客名列)に同じクライアント名が表示されます

私の例では、 2件のJohn Edwards

検索フィールドにその顧客名を書き込むと、DBGridにすべての行が表示され、列番号4にその名前が含まれていない他の行が消えて

上記の例を使用すると、検索フィールドにJohn Edwardsを書くと、DBGridの2行しか表示されません。

私が書いた検索フィールドをクリアすると、DBGridは元の状態に戻り、検索前と同じようにすべてを表示する必要があります。

どうすればいいですか?私はDelphiの新機能で、こことGoogleの両方の検索で有用なものは何も思い付きませんので、私には分かりません。

ありがとうございました!

+0

いくつのレコードですか? –

+0

レコードの意味は?あなたはあまりにも参照してください混乱したくないので、より具体的にしてください – Petzy

+0

フィルタリングするテーブル内のレコードの数? –

答えて

1

SQL SELECTによって返される少数の行を処理する場合は、TDataSet.FilterTDataSet.Filteredを使用できます。普通の古いTEditなど、どこからでも入力を取得できます。

あなたが使用しているDBコントロール、Delphiのバージョン、変数名を与えるコード、その他何かを投稿していないので、参考になる非常に一般的なサンプルがあります。 DBGridに添付されたクエリをQryと呼んでいます。なぜなら、あなたが投稿した内容に基づいて他に何を呼び出すべきかわからないからです。 FilterRecordsButtonおよびClearFilterButtonはTButtonsであり、SearchEditTEditです。フィルターを切り替えたり、ユーザーからの入力を取得したいコントロールを自由に使用してください。

procedure TForm1.FilterRecordsButtonClick(Sender: TObject); 
begin 
    if SearchEdit.Text <> '' then 
    begin 
    { 
    The brackets around the column name are required because you've got 
    spaces in the name; they're also needed if your column name is a 
    reserved word. QuotedStr puts the necessary quote characters around 
    the value. 
    } 
    Qry.Filter := '[Customer Name] = ' + QuotedStr(SearchEdit.Text); 
    Qry.Filtered := True; 
    Qry.First; 
    FilterRecordsButton.Enabled := False; 
    ClearFilterButton.Enabled := True; 
    end; 
end; 

procedure TForm1.ClearFilterButtonClick(Sender: TObject); 
begin 
    Qry.Filtered := False; 
    Qry.Filter := ''; 
    Qry.First; 
    ClearFilterButton.Enabled := False; 
    FilterRecordsButton.Enabled := True; 
end; 

あなたは多数の行(例えば、数十万行を返すWHEREなしSELECT * FROM MyTable)を扱っている場合は、Filtered場合はパフォーマンスが許容できない場合があります。その場合は、適切なWHERE句をSELECTに追加して、関連する行のみを表示するようにクエリを再開する方がよいでしょう。もちろん、WHEREなしでSELECTを実行してはいけません。そうする必要はありません。:-)

+0

単方向データセットでは操作を実行できません。 - それは私のDBのせいだよね?私は正確に何を変えるべきですか?私はフィルタのドキュメントを以前に読んでいる間に参照に気づいた – Petzy

+0

私はRAD Studio Seattleとdbexpressを使用しています。 TSQLQuery、TSimpleDataSet、TDataSource、TSQLConnectionを使用します。どうやらdbexpressのコンポーネントは単方向で、TSimpleDataSetさえあります。そのDBGridのDataSetを変更する必要があります。 – Petzy

+0

TDataSourceは単方向ではありません。 TSQLQueryは、AFAIKです(私はそれを使用しません)。 DBGridにクエリをアタッチしている場合は、単方向データセットを使用するのはかなり役に立たなくなります。グリッド内をスクロールしてスクロールバックしないと、非常に便利なUIにはなりません。なぜFireDACを代わりに使用していないのですか? –

関連する問題