開発環境:WindowsXP,VB.NET2003,Access(mdb)
どうもお世話になります。
前任者より引き継いだWinアプリを見直しております。
その中で表題の通りDataViewの操作について教えて頂きたい事があります。
まず、あるテーブルにFIELD01〜FIELD10があるとさせて下さい。
そのうちFIELD01〜05が主キーに設定されています。
この主キーに基づいてDataView.Sortを実行するという考えでいます。
mdb上での直接手打ちですが適当なテストデータを用意しました。
FIELD01 FIELD02 FIELD03 FIELD04 FIELD05 …
-----------------------------------------------
911075 001 0 35 001
911075 004 0 35 001
911075 004 0 35 002
911075 004 0 35 003
911075 007 0 35 001
911075 007 0 35 002
911075 007 0 35 003
911075 008 0 35 001
911075 010 0 35 001
911075 010 0 37 002
このデータをOleDbDataAdapter.FillでDataView.Tableにセットします。
手持ちの書籍などを参考にすると
DataView.Sort = "単価,商品グループ DESC"
など複数列を指定する事も可とありましたので
DataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 desc"
という記述が出来ると判断したのですが思惑通りの結果になりませんでした。
上記のテストデータの並びのままでした。
例えば FIELD2 のみ限定で
DataView.Sort = "FIELD02 desc"
と記述した場合にはもちろん動きはあるのですが、それですと当然のように
911075 010 0 35 001
911075 010 0 37 002
911075 008 0 35 001
911075 007 0 35 001
911075 007 0 35 002
911075 007 0 35 003
911075 004 0 35 001
911075 004 0 35 002
911075 004 0 35 003
911075 001 0 35 001
のような結果となりFIELD03、FIELD04あたりは昇順のままです。
ちなみに実行結果はDebug.WriteLineやDataGrid.DataSourceに
実行後のDataViewをセットして確認しています。
ネット等で一通り調べたのですが、思った情報が得られず困っております。
アドバイス頂けると幸いです。
> という記述が出来ると判断したのですが思惑通りの結果になりませんでした。
試してみましたが、当方では再現しませんでした。
現象を再現可能なコードを提示する事はできますか?
' ソース ファイル名
' 「C:\sample.vb」
'
' コンパイル コマンドライン
' 「C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\vbc.exe /t:winexe /r:System.Windows.Forms.DLL,System.DLL,System.Data.DLL,System.XML.DLL /out:C:\sample.exe C:\sample.vb」
'
Imports System
Imports System.Data
Imports System.Windows.Forms
Class Form1
Inherits Form
Shared Sub Main()
Application.Run(New Form1())
End Sub
Sub New()
Dim T1 As New DataTable()
T1.Columns.Add("FIELD01")
T1.Columns.Add("FIELD02")
T1.Columns.Add("FIELD03")
T1.Columns.Add("FIELD04")
T1.Columns.Add("FIELD05")
T1.Rows.Add(New Object() {"911075", "001", "0", "35", "001"})
T1.Rows.Add(New Object() {"911075", "004", "0", "35", "001"})
T1.Rows.Add(New Object() {"911075", "004", "0", "35", "002"})
T1.Rows.Add(New Object() {"911075", "004", "0", "35", "003"})
T1.Rows.Add(New Object() {"911075", "007", "0", "35", "001"})
T1.Rows.Add(New Object() {"911075", "007", "0", "35", "002"})
T1.Rows.Add(New Object() {"911075", "007", "0", "35", "003"})
T1.Rows.Add(New Object() {"911075", "008", "0", "35", "001"})
T1.Rows.Add(New Object() {"911075", "010", "0", "35", "001"})
T1.Rows.Add(New Object() {"911075", "010", "0", "37", "002"})
Dim dataView = New DataView(T1)
dataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 desc"
Dim grid As New DataGrid()
grid.SetDataBinding(dataView, Nothing)
grid.Dock = DockStyle.Fill
Controls.Add(grid)
End Sub
End Class
===== 実行結果 =====
911075 001 0 35 001
911075 004 0 35 003
911075 004 0 35 002
911075 004 0 35 001
911075 007 0 35 003
911075 007 0 35 002
911075 007 0 35 001
911075 008 0 35 001
911075 010 0 35 001
911075 010 0 37 002
>このデータをOleDbDataAdapter.FillでDataView.Tableにセットします。
>DataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 desc"
を守るようにテストプログラムを作成して、FIELD05 のみ降順に変更されました。
問題ないです。
>FIELD03、FIELD04あたりは昇順のままです。
複数のフィールドを降順にしたいという意味であれば
DataView.Sort = "FIELD01, FIELD02, FIELD03 desc, FIELD04 desc, FIELD05 desc"
です。
開発環境:WindowsXP(SP2),VB.NET2003,Access2003(mdb)
>> FIELD03、FIELD04あたりは昇順のままです。
> 複数のフィールドを降順にしたいという意味であれば
おぉ、なるほど。DESC の範囲を誤解していたかも知れない、と。
にしても、提示されたコードならば
>> 上記のテストデータの並びのままでした。
にはならないハズなので、その点が不思議…。
掲示板投稿時のミスではなく、本当にテストデータの並びのままだとしたら
自分で生成した DataView と dataTable.DefaultView を混同したいたとか、
DataGrid 側でもソートが行われていて、それと混ざってしまっていたとか、
文字列項目のソートと数値項目のソートを勘違いしていた、とか…。
>>> 上記のテストデータの並びのままでした。
>にはならないハズなので、その点が不思議…。
もしくは全体が並び変わると思い込んでたので FIELD05 の変化を
見落としたとか。
弁さんとボクのテストで大丈夫だから、既存の不具合では
なさそうな感じ。質問者の方には、もう一度確認をお願いしたいです。
そこで並び変わってなければ、全く別の原因を考えないといけない
わけですから。
お世話になっております。
魔界の仮面弁士さん、特攻隊長まるるうさん、回答ありがとうございます。
過去ログ検索の際にもお二人の回答はいつも参考にさせてもらっています。
また、わざわざそちらの環境で動作確認までしてもらい大変恐縮しております。
>上記のテストデータの並びのままでした。
の件ですが再度確認したところ
魔界の仮面弁士さんの実行結果および、特攻隊長まるるうさんご指摘の通り
FIELD5のみ降順になりました。大変申し訳ありませんでした。
どうやらこの"FIELD5のみ"という部分を見落としていたようで・・・
>もしくは全体が並び変わると思い込んでたので FIELD05 の変化を
>見落としたとか。
まさにこの通りです・・・
質問内容のみならずこちらの行動もお見通しな感じでお恥ずかしい限りです。
説明不足でしたが、今回行いたい事は
>複数のフィールドを降順にしたいという意味であれば
であり(実際は昇順の場合も有りですが)
>おぉ、なるほど。DESC の範囲を誤解していたかも知れない、と。
だったのかなと思い至りました。
mdb内のどのテーブルのDataViewだとしても主キーに基づきソートを実行したい
という目的で、再現可能というよりは作成中のコードになりますが・・・
Public Sub PrimaryKeySort(ByVal SortView As DataView)
Dim SortString As String
Dim i As Integer
'
For i = 0 To SortView.Table.PrimaryKey.Length - 1
If i = SortView.Table.PrimaryKey.Length - 1 Then
SortString &= SortView.Table.Columns(i).ColumnName & " desc"
Else
SortString &= SortView.Table.Columns(i).ColumnName & " desc, " ★
End If
Next
'
SortView.Sort = SortString
End Sub
(現状は降順のみでテスト中です)
★部分を変更して
DataView.Sort = "FIELD01 desc, FIELD02 desc, FIELD03 desc, FIELD04 desc, FIELD05 desc"
となる事で目的の複数フィールドを降順にできるんだなと分かりました。
昨晩自宅でもネット調査して知りましたが
>DataView.Sort = "単価,商品グループ DESC"
というのは、二つのフィールドを降順にしてくれると思っていましたが
列名の後を省略した場合は昇順扱いになる?という事で合っているでしょうか?
(上記の場合は「単価」は昇順、「商品グループ」は降順となる?)
DataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 desc"
とした場合はFIELD05のみ降順扱いとなるが
DataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 asc"
とした場合は結局は全フィールド昇順扱いとなる?
もしよろしければ、このあたりを勉強できるサイトなど教えて頂けると幸いです。
いくつか何度かテストを行い問題なさそうであれば解決マークを付けさせて頂きます。
もし他にもなにかご指摘がある場合は引き続きお願いします。
この文法は、もろ SQL の ORDER BY の文法になります。
http://sql.1keydata.com/jp/sql-order-by.php
http://www.syboos.jp/database/doc/20080216180844597.html
asc は昇順であり、デフォルト値です。省略できます。
desc は降順です。
>DataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 desc"
を省略しないように書くと
DataView.Sort = "FIELD01 asc, FIELD02 asc, FIELD03 asc, FIELD04 asc, FIELD05 desc"
FIELD05 だけ降順。あとは昇順
>DataView.Sort = "FIELD01,FIELD02,FIELD03,FIELD04,FIELD05 asc"
省略しないように書くと
DataView.Sort = "FIELD01 asc, FIELD02 asc, FIELD03 asc, FIELD04 asc, FIELD05 asc"
ぜんぶ昇順。それだけ。
度々の回答ありがとうございます。
自身で作成してみたサンプルプログラム(提示コードも含む)での動作検証など
なんとか一通り行えましたので解決マークを付けさせて頂きます。
これから実際のWinアプリの方へ反映する作業に入りたいと思います。
リンク先の情報も大変参考になりました。
手持ちのVB書籍とか、"DataView"でWeb検索とか、今回の場合は
調査視点が「VB.NETの〜」という事も問題だったように思いました。
今後は様々な視点から問題解決のための調査が行えるようにしたいと思います。
色々とお世話になりありがとうございました。