• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS DAOのデータベースのソートについて)

ACCESS DAOのデータベースのソートについて

このQ&Aのポイント
  • DAOのデータベースのソートについて、思うようにできていない問題が発生しています。特定の並び順で昇順にソートした結果が期待通りにならない状況です。
  • データベースのSQL文でデータの取得を行い、取得したデータを特定の並び順でソートしようとしています。セットしたソート順序は『区分 ASC,棚番 ASC,品番 ASC, 品名 ASC, 型式 ASC』です。
  • しかし、ソート結果が期待通りにならず、TD101とTD102が最後の方に来てしまいます。この現象の原因について知識のある方がいらっしゃいましたら、ご教示いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

【DAOでのソートに関して・・・】 rst.sort は、テーブルタイプで使用しても並び替えない。 テーブルタイプの並び替えでは Index を使う。 Access95 では、このような使い分けをしていました。 ですから、今回の件はDAOのバグではなく私らの勘違い。 今、やーっと思い出しました。

shinnnn
質問者

お礼

ありがとうございます。 なるほどIndexなんですね。 sortと書いていればそのことかと思うことと、 sortを使うというHPもちらほらあるようですので、 その辺で頭の中できめつけてしまっていました。 今後ともよろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

回答No.6

With rst   If Not .BOF Then      ' --------------      ' ソート      ' --------------     .Sort = strSort     Set rst = rst.OpenRecordset      ' --------------      ' 配列を再宣言      ' --------------      .MoveLast なお、DAOのテストコードです。

shinnnn
質問者

お礼

ありがとうございました。 最新のご回答をベストアンサーにさせて頂きました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

DAOの場合、FilterプロパティやSortプロパティの設定を変更した場合、それを反映させるには、   Set rs = rs.OpenRecordset とレコードセットを開きなおす必要があります。 もっとも、Recordset.Sort プロパティのヘルプに -------------------------------------------------------------------- 多くの場合、並べ替え条件が含まれた SQL ステートメントを使用した方が、短時間で新しい Recordset オブジェクトを開くことができます。 -------------------------------------------------------------------- の記述があるので、ORDER BY で並べ替えたほうがいいかと思いますが。

shinnnn
質問者

お礼

ありがとうございました。 お返事が送れて申し訳御座いません。 今回はOrderByをいれて並び替えを行うことにいたしました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

ORDER BY 句を追加するという対策でも・・・。

shinnnn
質問者

お礼

ありがとうございます。 select文に挿入致しました。 SQL = "select * from 東京CSV order by 区分 ASC,棚番 ASC,品番 ASC, 品名 ASC, 型式 ASC" これで期待通りの並び替えになりました。 前の方がスッキリしてたので使えればよかったのですが、 使えない機能だっったとは。。。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

補足:対策1の図を添付しておきます。

shinnnn
質問者

お礼

このたびはありがとう御座いました。 ご回答を拝見して、DAOの不具合であるようですが、 全てのデータベース処理をDAOで行っているため、 今回はDAOで行い、 事前にクエリでソートされたデータで処理をさせようと思います。 ありがとう御座いました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

補足:100行制限は適宜に解除・変更してください。 開業->改行 のミスあり!

shinnnn
質問者

お礼

いろいろご検証頂きありがとう御座います。 お礼は最新の回答に記載させて頂きます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

[イミディエイトウインドウ] ? DBselect2("SELECT * FROM [テーブル3]", "区分 ASC,棚番 ASC", True) 1.00;中部営業所1;FTD102; 2.00;中部営業所1;FTD102; 3.00;中部営業所1;FTD101; 4.00;中部営業所1;FTD101; ? DBselect("SELECT * FROM [テーブル3]", "区分 ASC,棚番 ASC", True) 3;中部営業所1;FTD101; 4;中部営業所1;FTD101; 1;中部営業所1;FTD102; 2;中部営業所1;FTD102; 上は、DAOを使っています。 下は、ADODBを使っています。 確かに、DAO版ではソートされませんでした。 この現象の報告は、ネット上でも確認できます。 対策1、SQL文で並びを指定する。 対策2、ADODBを利用する。 【補足】ADODB版 DBSelect関数。 念のために、次のDBSelect関数を利用してイミディエイトウインドウでご確認ください。 3つめの引数に True を指示するとレコード単位で開業します。 Public Function DBSelect(ByVal strQuerySQL As String,                  Optional strSort As String = "",                  Optional isCR As Boolean = False) As String On Error GoTo Err_DBSelect  Dim i      As Integer  Dim J      As Integer  Dim R      As Integer  Dim C      As Integer  Dim M      As Integer  Dim N      As Integer  Dim rst     As ADODB.Recordset  Dim fld     As ADODB.Field  Dim strList   As String     Set rst = New ADODB.Recordset  With rst   .CursorLocation = adUseClient   .Open strQuerySQL, _     CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       ' --------------       ' ソート       ' --------------       .Sort = strSort       ' --------------       ' 配列を再宣言       ' --------------       M = .RecordCount - 1       N = .Fields.Count - 1       If M > 99 Then         MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", _             vbInformation, _             " お知らせ"         M = 99       End If       ReDim DataValues(M, N)       ' ------------------------------------       ' 列情報を For-Next で配列に代入する       ' ------------------------------------       .MoveFirst       For R = 0 To M         C = -1         For Each fld In .Fields           With fld             C = C + 1             ' --------------------------             ' 列データを表示形式に変換             ' --------------------------             Select Case .Type               Case adBoolean         ' ブール型                 DataValues(R, C) = IIf(.Value = -1, "Yes", "No")               Case adChar, adVarChar     ' 文字列型                 DataValues(R, C) = Nz(.Value, "")               Case adDBDate, adDBTimeStamp  ' 日付型、日付/時刻型                 DataValues(R, C) = .Value               Case adSmallInt, adInteger   ' 整数                 DataValues(R, C) = FormatNumber(.Value, 0)               Case adSingle, adDouble     ' 浮動小数点型                 DataValues(R, C) = FormatNumber(.Value, 2)               Case adCurrency         ' 通貨型                 DataValues(R, C) = FormatCurrency(.Value, 2)               Case Else                 DataValues(R, C) = .Value             End Select           End With         Next fld         .MoveNext       Next R      Else       ReDim DataValues(0, 0)       DataValues(0, 0) = ""       strList = ""      End If   End With   ' -------------------------------   ' セミコロン(;)で連結して1文に   ' -------------------------------   For i = 0 To M     For J = 0 To N       strList = strList & DataValues(i, J) & ";"     Next J     If isCR And i <> M Then       strList = strList & Chr(13)     End If   Next i Exit_DBSelect: On Error Resume Next   rst.Close   Set rst = Nothing   DBSelect = strList   Exit Function Err_DBSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function

shinnnn
質問者

お礼

いろいろご検証頂きありがとう御座います。 お礼は最新の回答に記載させて頂きます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • wshでcsvファイルのソートを行いたい

    wshのプログラムで困っているため教えてください。 wshでcsv(カンマ区切り)のファイルのソートを行い、Escel形式で保存するプログラムを書いています。 調べてみたところ、wshではソート関数がないようで、 adodbのsort関数を使用して対処しようとしていますが、どうもうまくいきません。 (※adodbの必要はないのですが、ExcelVBAのsortのコードを書こうとするとエラーになってしまったので、adodbにしています。) <仕様> csvファイルのソートのキーになるのは、「判定区分」の値で昇順に行いたいです。 csvファイルの一行目は、カラム名としてソート対象にはなりません。 読み込んだcsvファイルをexcel形式に保存したいです。 ■csvファイルの形式は、以下のような形です。 性別,年代,判定区分,生年月日,日付 女性,10,0,2010/01/10,2013/7/7 23:57 男性,50,2,2000/03/30,2013/7/7 13:7 女性,10,0,1990/01/20,2013/7/7 15:22 女性,20,1,2001/12/10,2013/7/7 8:10 *----------------------------------- <ソース> Set con = CreateObject("ADODB.Connection") With con .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path & ";" _ & "Extended Properties='text;HDR=Yes;FMT=Delimited'" .Open End With Set rec = CreateObject("ADODB.Recordset") rec.Open "select * from " & csvfile & " order by 判定区分", con *----------------------------------- うまくいかないため ↓でも書いています。 *----------------------------------- Const adDate = 7 Const adVarChar = 200 Dim ans Set objADO = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") Set re = CreateObject("VBScript.RegExp") rs.Fields.Append "性別", adVarChar, 255 rs.Fields.Append "年代", adVarChar, 255 rs.Fields.Append "判定区分", adVarChar, 255 rs.Fields.Append "生年月日", adDate rs.Fields.Append "日付", adDate rs.Open ans = "" rs.Sort ="判定区分 ASC" rs.MoveFirst Do While Not rs.EOF ans = ans & rs.Fields(0).Value & vbCrLf rs.MoveNext Loop MsgBox ans エラーになってしまいます。 ソート処理だけですでににっちもさっちもいかないため、教えていただきたいです。 どうぞ宜しくお願いいたします。

  • ソートの設定

    ASPでアクセス97を使って品番、納期という順番に表示させたいのですが うまくいきません。 SQL文を使って品番順にはならんだのですが、納期がばらばらになってしまいます。どうしたら品番、納期順という並びになるか教えて下さい。 Dim Conn,SQL,RS xxxx=server.mappath("*****.mdb") DBName="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & xxxx Set Conn = Server.CreateObject("ADODB.Connection") Conn.open DBName SQL = "select * from ******" SQL = SQL & " order by 品番 asc" set RS = Server.CreateObject("ADODB.Recordset") RS.Open SQL, Conn,3,3

  • AccessのDAOでフィールド名を配列に格納して・・・

    Access2000のDAOで下記のようなコードで複写元テーブルから複写先テーブルにデータを追加するとします。 Set Rs1 = Db.OpenRecordset("複写元", dbOpenTable) Set Rs2 = Db.OpenRecordset("複写先", dbOpenTable) Do Until Rs1.EOF Rs2.AddNew Rs2!FL1 = Rs1!名前 Rs2!FL2= Rs1!性別 Rs2!FL3= Rs1!郵便番号 Rs2!FL4= Rs1!住所    ・    ・ Rs2! FL50= Rs1! 50番目 Rs2.Update Rs1.MoveNext Loop 複写元のフィールドが50フィールドもあると、いちいちRs1!名前とかRs1!性別とか記述するのが大変ですし、ものすごく長いコードになります。そこで、配列にしてやったらどうだろうかとこんなことをしてみましたがだめでした。 Dim I Dim FieldsName FieldsName=Array("名前","性別",・・・"50番目")            ・            ・ Do Until Rs1.EOF Rs2.AddNew For I=0 To 49 Rs2!フィールド(I) = Rs1!FieldsName(I) Next Rs2.Update Rs1.MoveNext Loop じゃあTebleDifのTd.Fields().Nameを使って・・・・やっぱり失敗しました。 For I=0 To 49 Rs2!フィールド(I) = Rs1!Td.Fields(I).Name Next やりたいこと分かっていただけますでしょうか?要するにフィールド名を配列の様なもので格納しておいて、レコードの追加時に50回ループさせてRS2のフィールドにいれたいのです。何か良い方法は無いでしょうか。

  • ACCESS2000 ユニオンクエリーで、同一データについて

    こんにちは。 ACCESS2000で、超初心者から初心者に脱皮中です。 倉庫管理の仕事をしています。 各地の倉庫から在庫データを提出してもらい、データ管理を行っています。 データの内容は 倉庫番号, 品番, 品名, 区分, 数量 です。 一括管理のために、各倉庫のデータをユニオンクエリーでつなぎます。 SELECT 倉庫番号, 品番, 品名, 区分, 数量 FROM 倉庫1 UNION SELECT 倉庫番号, 品番, 品名, 区分, 数量 FROM 倉庫2 … UNION SELECT 倉庫番号, 品番, 品名, 区分, 数量 FROM 倉庫7; この中に、たまたますべてのデータが同一のデータが存在しました。 倉庫7,A00,食器洗剤,破損品,1 倉庫7,A00,食器洗剤,破損品,1 要するに、同じ倉庫に同じものが、同じ状態で同じ数量あったということです。 ユニオンクエリーの結果は、この片方しか表示してくれないのです。 同一データであっても並べて表示し、あとでクロス集計等をしたときに、数量2 と表示したいのですが、知恵をお貸しください。 ちなみにすべてのテーブルに、主キー等は設定していません。

  • 2つのテーブルを結合

    VB6.0 SQL SERVER winXP にて開発中です。 よろしくお願いします。 2つのテーブルを結合したいと思っています m_seihinというテーブルに 品番  品名   12   あいう  13   かきく  m_tanabanというテーブルに 棚番 品名 333  あいう  555  かきく があります。 TDBGridに品番を入力するとm_seihinの品名と m_tanabanの棚番を表示させたいのですが 例えば12と入力すると あいう 333 教えてください。

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • Mysqlとphpでソートや更新時の効率的な処理

    カラムの作成日時と更新日時のそれぞれでソート、 作成日時当日はNEWの文字を入れる。というものを作りたいと思っています。 <?php $cer = "SELECT * FROM data_data WHERE 1"; function orderbyset($cul, $sc, &$cer){ $cer .= " ORDER BY ".$cul." ".$sc; } if(isset($_GET['orderby'])){ switch($_GET['orderby']){ case 'md_asc': orderbyset('modified_date','ASC',$cer); break; case 'md_desc': orderbyset('modified_date','DESC',$cer); break; case 'cd_asc': orderbyset('create_data','ASC',$cer); break; case 'cd_desc': orderbyset('create_data','DESC',$cer); break; } } $acc = mysql_connect(ホスト,ユーザー,パスワード); $que = mysql_query($cer,$acc); $html = ""; while($row = mysql_fetch_array($que)){ $id = $row["id"]; $name = $row["name"]; $modified_date = $row["modified_date"]; $create_data = $row["create_data"]; $daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <p>更新日時順<br /> <a href="data-sort.php?orderby=md_asc">昇順</a> <a href="data-sort.php?orderby=md_desc">降順</a> </p> <p>作成日時順<br /> <a href="data-sort.php?orderby=cd_asc">昇順</a> <a href="data-sort.php?orderby=cd_desc">降順</a> </p> <table><?php echo $html; ?></table> </body> </html> +---------------+-----------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-----------+------+-----+-------------------+-------+ | id | int(11) | NO | PRI | NULL | | | name | char(10) | NO | | NULL | | | modified_date | timestamp | NO | MUL | CURRENT_TIMESTAMP | | | create_data | timestamp | YES | MUL | NULL | | +---------------+-----------+------+-----+-------------------+-------+ modified_dateの属性にはon update CURRENT_TIMESTAMPを設定し、 カラムのデータを変えるとmodified_dateが更新され、create_dataはそのままです。 SELECT id,name,modified_date,create_data,IF(`create_data`>CURDATE() - INTERVAL 0 DAY,'NEW',DATE_FORMAT(`create_data`,'%Y/%m/%d')) AS `ddd` FROM `data_data` http://okwave.jp/qa/q3058491.htmlでの方法がありました。 $daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} 「あるカラムの情報が変わったら○○させる」といったことをいくつか追加していきたいので、 パフォーマンスが落ちることを少しでも避けるためにphpで処理するようにしましたが、一般的にはどちらを使うものなのでしょうか。 また、ifばかりにならないようにswitchを使ったのですが、ソートもいろいろ追加していきたく、そうなると今度はswitchが多くなってしまいます。 switchやifを使わずにスマートにやれる方法はないでしょうか。

    • ベストアンサー
    • PHP
  • phpでのソートについて

    phpのソートについて教えてください。 以下のようなカンマ区切りのログファイルlog.txtがあるとしまして、 100,200,a,b,c, 300,100,d,e,f, 500,60,g,h,i, 50,300,j,k,l, 1000,60,m,n,o, このデータから 1番目のデータ(数値)が2番目のデータ(数値)より大きいデーターのみを対象にして ※つまりは以下のみ対象 300,100,d,e,f, 500,60,g,h,i, 1000,60,m,n,o, ここから1番目のデータ(数値)から2番目のデータ(数値)を引いた数が大きい順に ソートしてファイルに保存させたいのですが、 200,d,e,f,(300-100なので200) 440,g,h,i,(500-60なので440) 940,m,n,o,(1000-60なので940) ↓ ※最終的にこの順番で新しいログファイルnewlog.txtへ保存させたい 940,m,n,o, 440,g,h,i, 200,d,e,f, これらの処理を効率よく1度で行う方法はございますでしょうか。 わかりにくい説明で申し訳ありません。 お忙しい中恐縮ですがご教授いただけましたら幸いです。 何卒宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 多段ソート

    C言語というよりはアルゴリズムの話です。 [名前], [生年月日] の2つのカラムで表される固定長の行データが羅列されたファイルがあります。 また、各カラムを比較して行をソートした場合にどの行が何番目にくるかといったインデックス情報を木構造で保持したファイルがあります。 (このファイルは行データの追加・削除時に更新される) これらのファイルを利用して、生年月日でソートし、かつ日時が同じ場合は名前順にソートした場合の上から10個分だけのデータを取り出したいのですが、効率のよい方法は無いでしょうか? 全データを読み込んでから、バブルソート等の順序を崩さないソートを多重にかけることはなるべく避けたいのです。 そのためにソート済みのインデックス的な役割を持つファイルを用意しているのですが、多段ソート時にどう応用すればよいのかわからなくなってしまいました。 例 日時、名前の順にソートされた上4つ分のデータが欲しい。 【一覧】 [1行目] 10/20, Aさん [2行目] 11/30, Fさん [3行目] 9/10, Cさん [4行目] 11/30, Bさん [5行目] 12/10, Dさん 【生年月日でソートされた インデックス】 9/10, 3行目 10/20, 1行目 11/30, 2行目 11/30, 4行目 12/10, 5行目 【名前でソートされた インデックス】 Aさん, 1行目 Bさん, 4行目 Cさん, 3行目 Dさん, 5行目 Fさん, 2行目 得たい結果 [3行目] 9/10, Cさん [1行目] 10/20, Aさん [4行目] 11/30, Bさん [2行目] 11/30, Fさん

  • アクセス ADO

    Tテーブルと言うファイルは存在するのに、 Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "Tテーブル", cn, adOpenStatic, adLockPessimistic rs.Sort = "順番 ASC" を実行すると 「実行時エラー-2147217900(80040e14) SQLステートメントが正しくありません Delete、Insert、Procedure、SelectまたはUpdateを使用して下さい。」 が発生します。 rs.CursorLocation = adUseClient は問題なく通過する為、 Tテーブルと言うオブジェクトが存在しない為のエラーなのかなと思いましたが Tテーブルは存在します。 http://www.accessclub.jp/bbs2/0128/beginter38279.html を見たのですが 私の場合はクエリではなくテーブルなので パラメーターは関係ないと思っています。