DBGridでカタカナをソートするには?

解決


sasasa  2010-02-03 16:23:59  No: 37412  IP: 192.*.*.*

DBGridのタイトルをクリックしてソートをしようと思っています。
ソートするためのソースは書けていて、数値、文字列('200000')等はソートできているのですが
カタカナの場合、ソートがうまくできていません。。。
これは日本語は対応していないのでしょうか?

編集 削除
sasasa  2010-02-03 16:44:08  No: 37413  IP: 192.*.*.*

ソートの仕方ですが、TClientDataSetを使用していて
IndexDefs[0].DescFields で降順、
IndexDefs[0].Fields  で昇順を設定しています。

編集 削除
Kenny  2010-02-03 16:44:52  No: 37414  IP: 192.*.*.*

色々あるんですけども、まずは
使っているデーターベース(Oracleとか、Paradoxとか)
DBGridのDataSource接続関係(TTableとか、TQueryとか)
使っているならSQL文
これらを書いた方が良いアドバイスを得られると思います。

編集 削除
sasasa  2010-02-03 16:52:22  No: 37415  IP: 192.*.*.*

すみません、何も書いてないな…と思って追記させてもらったのですが
もう少し書きます。。

接続は
TDatabase→TQuery→TDataSetProvider→TClientDataSet→TDataSource→TDBGrid  です。

SQL文を使用していて、
Order Byを使用していたのでそれはコメント化にしています。

ファイルは
Code、Name、カナName・・・になっていて
CodeがキーになっているのでCode順(昇順)になっています。
「これが関係あるのかな?」と思って
キーがないファイルで同じようにしてみましたが
カタカナのソートはできませんでした。

データベースはDB2です。

何度も申し訳ありませんが、よろしくお願いいたします。

編集 削除
Kenny  2010-02-03 17:53:17  No: 37416  IP: 192.*.*.*

もう少し教えてくださいね。
ソートできないカタカナって、どんな状態になっています?
他のフィールドが優先ソートされて、望みのフィールドがバラバラとか、
一応望みのフィールドでソートされているけど、望んだ並びになっていないとか。
あと、そのフィールドにインデックスは付いていますか?

DB2は全く知らないのであれなんですが、イベントハンドでQuery1のSQLを

  Query1.Close;
  ClientDataSet1.Close;
  Query1.SQL.Clear;
  //昇順の場合
  Query1.SQL.Add('SELECT * FROM データーベースの名前.db2 ORDER BY 望みのフィールド');
  //降順の場合
  //Query1.SQL.Add('SELECT * FROM データーベースの名前.db2 ORDER BY C望みのフィールド DESC');
  Query1.Open;
  ClientDataSet1.Open;

これじゃまずいのでしょうか? 外していたらごめんなさい。

編集 削除
sasasa  2010-02-03 18:25:08  No: 37417  IP: 192.*.*.*

何度もスミマセン。。

ソートできないカタカナというのは、
ソートはできているが並び順が昇順の場合
「アイウ」
「アアア」
「アウオ」  という風に並び順がおかしいのです。
本当だったら
「アアア」
「アイウ」
「アウオ」  という風になってほしいのですが・・・

フィールドにはインデックスは付いています。
インデックスというのは、ClientDataSetのフィールドをクリックして
オブジェクトインスペクタにIndexとあるのですが
そのことでよかったですよね?

このプログラムを使用する人がCodeでソートしたりNameでソートしたり
カナNameでソートしたり、どのフィールドでソートするかわからないので
SQL文には書けないのです…

編集 削除
maru3  2010-02-03 18:59:35  No: 37418  IP: 192.*.*.*

ソートされそうなフィールド毎にSQL文は書けるわけですね。
また、SQLではうまくいっているのですね。
であれば、if  か  case文で分岐すればどうでしょう。


例えば・・冗長な書き方ですが・・

var SQL_St,SQL_St_A,*****,SQL_St_Z::String
 SQL_St_A := 'SELECT * FROM データーベースの名前.db2 ORDER BY 望みのフィールド'';
 SQL_St_B := 'SELECT * .............';

マウスの右クリックで昇順、左クリックで降順なども可能性があるような

 if DBGridのタイトルがA then SQL_St := SQL_St_A; 
 if DBGridのタイトルがB then SQL_St := SQL_St_B;  

 with Query1 do
 begin
  Close;
  SQL.Clear;
  SQL.Add(SQL_St);
  Open;
 end;

編集 削除
Kenny  2010-02-03 19:25:02  No: 37419  IP: 192.*.*.*

並び順がおかしいというのは、ちょっと分からないですね。DB関係あまり詳しくないんですけど、
先頭の「ア」だけでソートした後、2次的に主キーで並べているような気がします。
ただ、私ならうまく行かないことからはさっさと逃避して、SQLを使います。
maru3さんが書かれている方法ですけど、DBGridを使うのなら、DBGrid.TitleClickがありますから、
ソートしたいフィールド名のタイトルカラムをクリックしてください、というのはスマートで
悪い方法じゃないと思いますよ。
SQLもORDER BY句だけをパラメーター化して渡しても良いですし。

あ、ちなみにIndexというのは「キー」のことです。データの並び順を記録したファイルで、
「キー」を付けたいフィールドごとに必要になります。

編集 削除
HOta  2010-02-03 21:17:10  No: 37420  IP: 192.*.*.*

半角カナ・全角カナ等は混ざっていませんか?

編集 削除
Ru  2010-02-04 09:48:45  No: 37421  IP: 192.*.*.*

参考になるか分かりませんが,
クライアントデータセットはmidas.dllによってサポートされているようなので,dllに影響されているやも?
半角英数でも - (横棒)が無視されてソートされます。
ちなみにこちらの環境でもカナソートは正常に出来ませんでした。
(全て半角カナでの実験)
midas.dllにもバージョンとかあるのかな・・・

編集 削除
sasasa  2010-02-04 11:27:24  No: 37422  IP: 192.*.*.*

みなさん、ありがとうございます。。

今までSQLのOrderBy句でカナNameを指定していなくて
(今まで他のフィールドを指定していました…始めにしていなくてスミマセン)
今回試してみたのですが、やっぱり並び順がおかしいです。

SQL文でもダメということは
何をしてもダメということなんじゃ…と思ってきました。
HOtaさん、半角・全角は混ざっていないんです。。

もう他に方法がなさそうなので今回は諦めます・・
みなさん、ありがとうございました。

編集 削除
sasasa  2010-02-04 11:32:14  No: 37423  IP: 192.*.*.*

すみません!!

SQL文のOrderBy句で間違ったフィールドを指定していたのに
「SQL文でもダメでした」と書いてしまいました!!!

SQL文でできるということなので
みなさんに教えてもらった方法で試してみます!!

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

編集 削除
のりぺぃ  2010-02-04 19:41:33  No: 37424  IP: 192.*.*.*

全角カタカナなら大文字小文字の区別が関係している気もしますが、
わざわざixCaseInsensitiveを指定したりはしないかな…

編集 削除