TDBGrid内をAddIndexでソートした時Nullを下にするには?

解決


レプシー  2013-03-11 19:59:53  No: 44017

現在TTableで取得したデータベースの内容をTDBGridに表示しています。
その際の表示順を以下のようにAddIndexを使用して変更しています。

  //インデックスの削除
  if TTable1.IndexName = 'Index1' then
  TTable1.DeleteIndex('Index1');

  //インデックスを作成、カナ名順でソート
  TTable1.AddIndex('Index1','KANANAME;NO',[]);
  TTable1.IndexName := 'Index1'; //実行

カナ名、NO順でソートして表示するようにしているのですが
昇順で並べたときカナ名に何も入っていないものが上にきてしまいます。
これを下にに持っていく方法はないでしょうか?

・現在のソート  ・希望のソート
カナ名|No        カナ名|No
---------        ---------
      | 3        あ    | 2
      | 4        い    | 1
あ    | 2              | 3
い    | 1              | 4

よろしくお願いします。

・環境
Delphi:Delphi4
OS:Windows7 64bit


DEKO  2013-03-12 00:32:31  No: 44018

以下のような感じでどうでしょうか?

0.カナ用のフィールドを Kana、
No 用のフィールドを No として話を進めます。

1.ソート用のフィールドを数値項目で定義します。
(ここでは SortOrder としておきます)

2.Kana で空白のレコードを抽出し、9999 を入れます。

update TABLE_HOGE
set
  SortOrder = 9999
where
  (Kana = "") or (Kana is NULL)

3.SortOrder, Kana , No 順のインデックスを作成します。
或いは、クエリを以下のように記述します。

Select * From TABLE_HOGE
Order by
  SortOrder, Kana , No

4.レコードを追加/更新する場合には、
Kana が空白の時には SortOrder に 9999 を書き込みます。

常にこの表示順でなくてもいい (DBGrid での更新はない) のなら、
DBGrid を表示する直前に Kana が空白のものを 9999、
そうでないものを 0 に変更すればいいと思います。


レプシー  2013-03-14 20:39:52  No: 44019

>DEKOさん
返答遅れて申し訳ありません。
別のインデックスを作成してNullの時のみ9999にしてソートすれば行けそうですね
ありがとうございました。


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

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






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