DBGridのタイトルをクリックしてソートをしようと思っています。
ソートするためのソースは書けていて、数値、文字列('200000')等はソートできているのですが
カタカナの場合、ソートがうまくできていません。。。
これは日本語は対応していないのでしょうか?
ソートの仕方ですが、TClientDataSetを使用していて
IndexDefs[0].DescFields で降順、
IndexDefs[0].Fields で昇順を設定しています。
色々あるんですけども、まずは
使っているデーターベース(Oracleとか、Paradoxとか)
DBGridのDataSource接続関係(TTableとか、TQueryとか)
使っているならSQL文
これらを書いた方が良いアドバイスを得られると思います。
すみません、何も書いてないな…と思って追記させてもらったのですが
もう少し書きます。。
接続は
TDatabase→TQuery→TDataSetProvider→TClientDataSet→TDataSource→TDBGrid です。
SQL文を使用していて、
Order Byを使用していたのでそれはコメント化にしています。
ファイルは
Code、Name、カナName・・・になっていて
CodeがキーになっているのでCode順(昇順)になっています。
「これが関係あるのかな?」と思って
キーがないファイルで同じようにしてみましたが
カタカナのソートはできませんでした。
データベースはDB2です。
何度も申し訳ありませんが、よろしくお願いいたします。
もう少し教えてくださいね。
ソートできないカタカナって、どんな状態になっています?
他のフィールドが優先ソートされて、望みのフィールドがバラバラとか、
一応望みのフィールドでソートされているけど、望んだ並びになっていないとか。
あと、そのフィールドにインデックスは付いていますか?
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;
これじゃまずいのでしょうか? 外していたらごめんなさい。
何度もスミマセン。。
ソートできないカタカナというのは、
ソートはできているが並び順が昇順の場合
「アイウ」
「アアア」
「アウオ」 という風に並び順がおかしいのです。
本当だったら
「アアア」
「アイウ」
「アウオ」 という風になってほしいのですが・・・
フィールドにはインデックスは付いています。
インデックスというのは、ClientDataSetのフィールドをクリックして
オブジェクトインスペクタにIndexとあるのですが
そのことでよかったですよね?
このプログラムを使用する人がCodeでソートしたりNameでソートしたり
カナNameでソートしたり、どのフィールドでソートするかわからないので
SQL文には書けないのです…
ソートされそうなフィールド毎に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;
並び順がおかしいというのは、ちょっと分からないですね。DB関係あまり詳しくないんですけど、
先頭の「ア」だけでソートした後、2次的に主キーで並べているような気がします。
ただ、私ならうまく行かないことからはさっさと逃避して、SQLを使います。
maru3さんが書かれている方法ですけど、DBGridを使うのなら、DBGrid.TitleClickがありますから、
ソートしたいフィールド名のタイトルカラムをクリックしてください、というのはスマートで
悪い方法じゃないと思いますよ。
SQLもORDER BY句だけをパラメーター化して渡しても良いですし。
あ、ちなみにIndexというのは「キー」のことです。データの並び順を記録したファイルで、
「キー」を付けたいフィールドごとに必要になります。
半角カナ・全角カナ等は混ざっていませんか?
編集 削除参考になるか分かりませんが,
クライアントデータセットはmidas.dllによってサポートされているようなので,dllに影響されているやも?
半角英数でも - (横棒)が無視されてソートされます。
ちなみにこちらの環境でもカナソートは正常に出来ませんでした。
(全て半角カナでの実験)
midas.dllにもバージョンとかあるのかな・・・
みなさん、ありがとうございます。。
今までSQLのOrderBy句でカナNameを指定していなくて
(今まで他のフィールドを指定していました…始めにしていなくてスミマセン)
今回試してみたのですが、やっぱり並び順がおかしいです。
SQL文でもダメということは
何をしてもダメということなんじゃ…と思ってきました。
HOtaさん、半角・全角は混ざっていないんです。。
もう他に方法がなさそうなので今回は諦めます・・
みなさん、ありがとうございました。
すみません!!
SQL文のOrderBy句で間違ったフィールドを指定していたのに
「SQL文でもダメでした」と書いてしまいました!!!
SQL文でできるということなので
みなさんに教えてもらった方法で試してみます!!
ありがとうございました!!
全角カタカナなら大文字小文字の区別が関係している気もしますが、
わざわざixCaseInsensitiveを指定したりはしないかな…