DBGridでソートするには?

解決


たら茶  2004-05-12 05:38:28  No: 8882

はじめまして。DBGridについて質問させてください。

コンポーネントは、Database、DataSource、Query、DBGridを使い、
DBにSQLを発行して、DBGridに3列表示しています。

id  | tel | name
***   ***   ***
       ・
       ・                ←こんな感じです。
       ・              

表示している列のタイトルをクリックした時に
その列をキーにして並び替え(昇順/降順)をしたいのですが
どの様に実現すればいいのか行き詰まってしまいました。

自分としては、ClientDataSetを使って、IndexFieldNameをColumn.FieldName
にすればいいのかと思ったんですが、DBGridにはIndexFieldNameがありません
でした。

長くなって申し訳ございませんが、分かる方いらっしゃいましたら
ご教授ください。


shaki  2004-05-12 18:28:06  No: 8883

ソートしたいDBGridとClientDatasetがリンクしていること前提で
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  ClientDataSet1.IndexFieldNames := Column.FieldName;
end;


たら茶  2004-05-12 22:47:33  No: 8884

shakiさん、早速のご返答ありがとうございます。

早速試したのですが、DBGridとClientDataSetのリンクが
うまくできていないようです。

元のシステムは(→:関連付け)

Databese→Query→DataSource→DBGrid

としていて、上記ではうまく動作することを確認しています。
しかし、ClientDataSetが入ってきて、

Databese→Query→DataSource→DBGrid
                      ↓
                  ClientDataSet

とすると、DBGridには表示できるのですが、ソートはできませんでした。
ClientDataSetとDBGridを直接関連付けできれば、うまく動作するのかと
思うのですが、具体的にどの様に設定すればいいのか、お分かりになりましたら
ご返答願えますでしょうか?


shaki  2004-05-13 01:03:59  No: 8885

dbExpressなら
TSQLConnection→TSQLQuery→TDataSetProvider→TClientDataSet→TDataSource→TDBGrid
BDEなら
TDatabase→TQuery→TDataSetProvider→TClientDataSet→TDataSource→TDBGrid
と接続します。
TDataSetProvider.DataSetにQuery
TClientDataSet.ProviderNameにDataSetProvider
TDataSource.DataSetにClientDataSetです。


えび  2004-05-13 06:50:39  No: 8886

Queryコンポーネントの場合は、取得したレコードの並び順は変更できません。
Tableコンポーネントを使いIndexFieldNamesプロパティを使うか、
Oreder句を別々に指定したQueryコンポーネントを複数用意し、
タイトルをクリックされた時にDBGrid.DataSourde.DataSetプロパティを
該当するQueryに変えて使います。
どの方法が良いかはレコード数、SQL句の複雑さ、最大何通りで並べ替えるか
などによって調整すればよいと思います。
特に問題なければTableの方がプログラムは楽です。


たら茶  2004-05-13 18:42:38  No: 8887

shakiさん、えびさん、どうもありがとうございます。

shakiさん>

ClientDataSetとDBGridの関連付けうまくできました。
TitleClickのイベントからソートすることもできました。
DataSetProviderを間に置けば良かったのですね。
ご親切な説明ありがとうございます。勉強になりました。

えびさん>

Order句を使った異なるSQLを発行するやり方は、
最後の手段としてもう、作ってありました。
しかしながら、検索を行うテーブルのデータ件数が大きい(5000〜6000)
物にも対応できる様にしたかったので、TitleClickのイベントでSQLを発行する
のは、サーバの負荷及び、レスポンスの点からためらう所があり、今回は、
どうにかローカルで処理ができないものかと悩んでいました。

---

SQLで思い出したので、追加して質問させてください。
shakiさんに教えていただいた方法で、SQLのORDER句のような昇順/降順
の切替はできるのでしょうか?

質問ばかりですいません。お分かりになったらご教授下さい。


たら茶  2004-05-13 19:57:02  No: 8888

追加質問しましたが、すいません、自己解決です。

ADDIndex(インデックス名,フィールド名,[昇順/降順]);
でIndexを作ってから、
ClientDataSet1.IndexFieldNames := Column.FieldName;
をするとできました。よく調べもしないで質問してしまって、すいません。

ちなみに、ADDIndexはソートキーを2つ選べるようですが、3つ4つ
ソートキーが必要な場合は、SQLを発行するしかないのでしょうか?
謎です。


shaki  2004-05-14 07:49:51  No: 8889

ヘルプのAddIndexにそのまま書いています。
フィールド名をセミコロンで区切って追加してみてください。


たら茶  2004-05-14 18:44:09  No: 8890

shakiさん度々のご回答ありがとうございます。

フィールド名をセミコロンで区切り、オプションをカンマで区切ったところ
正常に動作しました。

問題点は全て解決しました。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加