はじめまして。DBGridについて質問させてください。
コンポーネントは、Database、DataSource、Query、DBGridを使い、
DBにSQLを発行して、DBGridに3列表示しています。
id | tel | name
*** *** ***
・
・ ←こんな感じです。
・
表示している列のタイトルをクリックした時に
その列をキーにして並び替え(昇順/降順)をしたいのですが
どの様に実現すればいいのか行き詰まってしまいました。
自分としては、ClientDataSetを使って、IndexFieldNameをColumn.FieldName
にすればいいのかと思ったんですが、DBGridにはIndexFieldNameがありません
でした。
長くなって申し訳ございませんが、分かる方いらっしゃいましたら
ご教授ください。
ソートしたいDBGridとClientDatasetがリンクしていること前提で
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
ClientDataSet1.IndexFieldNames := Column.FieldName;
end;
shakiさん、早速のご返答ありがとうございます。
早速試したのですが、DBGridとClientDataSetのリンクが
うまくできていないようです。
元のシステムは(→:関連付け)
Databese→Query→DataSource→DBGrid
としていて、上記ではうまく動作することを確認しています。
しかし、ClientDataSetが入ってきて、
Databese→Query→DataSource→DBGrid
↓
ClientDataSet
とすると、DBGridには表示できるのですが、ソートはできませんでした。
ClientDataSetとDBGridを直接関連付けできれば、うまく動作するのかと
思うのですが、具体的にどの様に設定すればいいのか、お分かりになりましたら
ご返答願えますでしょうか?
dbExpressなら
TSQLConnection→TSQLQuery→TDataSetProvider→TClientDataSet→TDataSource→TDBGrid
BDEなら
TDatabase→TQuery→TDataSetProvider→TClientDataSet→TDataSource→TDBGrid
と接続します。
TDataSetProvider.DataSetにQuery
TClientDataSet.ProviderNameにDataSetProvider
TDataSource.DataSetにClientDataSetです。
Queryコンポーネントの場合は、取得したレコードの並び順は変更できません。
Tableコンポーネントを使いIndexFieldNamesプロパティを使うか、
Oreder句を別々に指定したQueryコンポーネントを複数用意し、
タイトルをクリックされた時にDBGrid.DataSourde.DataSetプロパティを
該当するQueryに変えて使います。
どの方法が良いかはレコード数、SQL句の複雑さ、最大何通りで並べ替えるか
などによって調整すればよいと思います。
特に問題なければTableの方がプログラムは楽です。
shakiさん、えびさん、どうもありがとうございます。
shakiさん>
ClientDataSetとDBGridの関連付けうまくできました。
TitleClickのイベントからソートすることもできました。
DataSetProviderを間に置けば良かったのですね。
ご親切な説明ありがとうございます。勉強になりました。
えびさん>
Order句を使った異なるSQLを発行するやり方は、
最後の手段としてもう、作ってありました。
しかしながら、検索を行うテーブルのデータ件数が大きい(5000〜6000)
物にも対応できる様にしたかったので、TitleClickのイベントでSQLを発行する
のは、サーバの負荷及び、レスポンスの点からためらう所があり、今回は、
どうにかローカルで処理ができないものかと悩んでいました。
---
SQLで思い出したので、追加して質問させてください。
shakiさんに教えていただいた方法で、SQLのORDER句のような昇順/降順
の切替はできるのでしょうか?
質問ばかりですいません。お分かりになったらご教授下さい。
追加質問しましたが、すいません、自己解決です。
ADDIndex(インデックス名,フィールド名,[昇順/降順]);
でIndexを作ってから、
ClientDataSet1.IndexFieldNames := Column.FieldName;
をするとできました。よく調べもしないで質問してしまって、すいません。
ちなみに、ADDIndexはソートキーを2つ選べるようですが、3つ4つ
ソートキーが必要な場合は、SQLを発行するしかないのでしょうか?
謎です。
ヘルプのAddIndexにそのまま書いています。
フィールド名をセミコロンで区切って追加してみてください。
shakiさん度々のご回答ありがとうございます。
フィールド名をセミコロンで区切り、オプションをカンマで区切ったところ
正常に動作しました。
問題点は全て解決しました。ありがとうございました。
ツイート | ![]() |