1229340822 ≪Access2000≫

添付画像のように、レコードをまとめたいのですが、よい方法はありますか?

・画像は両方とも「テーブル1」になってますが、新しくテーブルを作ってもかまいません。
・VBAでもかまいません。各種アクションクエリでもかまいません。

コメント欄は開けておきます。
不足情報があれば請求してください。
回答のオープンは火曜の朝以降になるかもしれません。

よろしくお願いいたします。

※ 方法がない場合、「なし」の回答はお控えください。回答がつかなければ、方法がないものだと思って諦めます。
※ 回答履歴によっては開きませんのでご了承ください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/12/16 11:33:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント100pt

もっとスマートな方法があるかもしれませんが、とりあえず結果を別テーブルに格納する例です。

テーブル2に結果を入れるので、このテーブルがすでにあるときはコード内のテーブル2を好きな

名前に変更してください。

Option Compare Database

Const TMP_TABLE = "テーブル2"   '★★★ 結果テーブル名

Sub SELECT_ALL_01()
     Dim RS As DAO.Recordset
     
     readyTempTable
     
     Dim orderNum As String
     Dim productList As String
     
     Set RS = CurrentDb.OpenRecordset("SELECT * FROM テーブル1 ORDER BY 注文番号;")
     Do Until RS.EOF
        If RS!注文番号 <> orderNum Then
            If orderNum <> "" Then
                CurrentDb.Execute ("INSERT INTO " & TMP_TABLE & " ( 注文番号, 商品) VALUES ('" & orderNum & "','" & productList & "');")
            End If
            orderNum = RS!注文番号
            productList = RS!商品
        Else
            productList = productList & "," & RS!商品
        End If
        RS.MoveNext
    Loop
    If orderNum <> "" Then
        CurrentDb.Execute ("INSERT INTO " & TMP_TABLE & " ( 注文番号, 商品) VALUES ('" & orderNum & "','" & productList & "');")
    End If
    
'     DoCmd.RunSQL "SELECT * FROM " & TMP_TABLE & " ORDER BY [注文番号];"

    Set RS = Nothing
End Sub



Sub readyTempTable()
    Dim tbl As DAO.TableDef
    Dim str As String
  
    For Each tbl In CurrentDb.TableDefs
        If tbl.Name = TMP_TABLE Then
            CurrentDb.Execute ("DELETE FROM " & TMP_TABLE & ";")
            Exit Sub
        End If
    Next
    CurrentDb.Execute "CREATE TABLE " & TMP_TABLE & " ([注文番号] text(50), [商品] text(200) );"
End Sub

実行後、画面が更新されないことがあるかもしれませんが、F5キーを押して最新情報に更新してみてください。

id:panana

回答ありがとうございます。

じっくり読み解こうと思います。


後ほど結果報告します!

----------

・コンパイルエラー ユーザー定義型は定義されていません。

 DAOの参照設定をしてなかったです orz


・readyTempTable内が「FROM句の構文エラー」

 テーブル名にハイフンが入っているのが問題かな…ということで、

 SELECT_ALL_01内のCurrentDb.OpenRecordset部分のテーブル名と

 Const TMP_TABLE のテーブル名を[ ]でくくって対応。


内容も理解しようと思ったのですが、使ったことがないものがいっぱいで、

Do Until や If から、「ここではなんとなくこういうことをやっているんだろう」

程度にしかわかりませんでした。


ですが、今後使う機会が増えそうなので、テストデータをいろいろ作って、

ちょっとずつ改変しながら覚えていこうと思います。


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

気持ち程度ですが、ポイント上乗せしました^^

とても助かりました。

2008/12/16 11:32:56
  • id:Mook
    寝ぼけて回答したので、仕様と異なった回答をしてしまった気がします。

    productList = productList & "," & RS!商品

    productList = productList & "/" & RS!商品
    のように変更してください。

    やり方も回答したものに限らずいろいろと考えられますし、テーブルを自動的
    に表示など改良の余地はありますが、一例ということでご覧ください。


    今回の質問とは関係ないお話ですが、MySQL ではこのようなことを行うために、
    GROUP_CONCAT という関数があります。他のDBでは同様の関数はないようですが。
  • id:kn1967
    データベースの約束事(1つのフィールドには1つの情報)を
    破るような今回の仕様・・・ではありますが現場では多様しますよね。

    例えば、PostgreSQLだとCREATE AGGREGATEで
    集約関数(sumとかavgみたいなの)を自作しちゃえば済みますが
    Accessだと順序を明示するためにレコードセットを開いて
    VBAで1レコードずつ読み込んで処理するか、もしくは
    レポートでVBAを使って集計するか・・・。
    (レポートのほうがシンプルなVBAで済みますけど
    どのように動作しているのかを理解するのには時間がかかりますね)

    以上、余談を引きずってみました・・・。
  • id:panana
    ACCESS以外のDBは名前を聞いたことがあるくらいなんですが、
    独自の機能や関数があるんですね~!
    いつか私が手を出せる日は来るんでしょうか…
  • id:Mook
    ポイントといるか賞ありがとうございます。
    いろいろと改善の余地がありますので、ご自身の手でぜひ使いやすいものに
    改良していってください。

    DB に関してはいろいろと種類はありますが、基本的な SQL 構文は共通なので、
    一つの DB が使用できるようになれば、他の DB を使用するのはそう難しいこと
    ではありません。

    PostgreSQL や MySQL はもともと フリーですし、Oracle も個人使用で利用できる
    フリーバージョンがあります。
    興味があったら、ぜひ一度試してみることをお勧めします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません