Microsoft Access 掲示板

別テーブルのデータを1つのフォームに取り込む

15 コメント
views
4 フォロー

いつもお世話になっております。

列数やフィールド名が微妙に異なる別テーブルのデータがあります。
テーブル1
テーブル2
テーブル3とする。

これをそれぞれクエリで同じフィールド名、型に統一し、1つのフォームに流し込みたいです。
その際、フォームでは新しいフィールドも追加したいです。

クエリ1:【主キー】テーブル1ID、【フィールド名】タイトル、感想、製作年、国
クエリ2:【主キー】テーブル2ID、【フィールド名】タイトル、感想
クエリ3:【主キー】テーブル3ID、【フィールド名】タイトル、感想、国

フォーム名:合体フォーム
フィールド名:タイトル、感想、製作年、国、【新しいフィールド】おすすめ度合い、タイプ
⇒合体テーブルにデータを保存。

フォームのページから例えば、「現在のデータを流し込む」ボタンを作成したら
合体テーブルに、クエリ1~3のデータを流し込み、流し込んだ後テーブル1~3のデータは削除して大丈夫です。

ユニオンクエリになるのでしょうか?アドバイスいただけると助かります。宜しくお願いいたします。

セロハン
作成: 2020/10/26 (月) 17:03:10
通報 ...
1
セロハン 2020/10/26 (月) 17:43:09 f1ed8@73413

これは、やっぱりユニオンクエリで解決しそうですね…
検索して調べながら作ってみます。失礼しました。

2

ユニオンクエリでできると思います。

ただ、ユニオンクエリは重い処理になりますし、更新できないクエリになりますので、テーブル設計の変更が可能なら、最初から一つのテーブルにしておいて、必要に応じてクエリで必要なデータを取り出すようにした方がいいでしょう。

4
セロハン 2020/10/27 (火) 11:55:22 0029a@1c915 >> 2

ユニオンクエリは重い処理になるとのこと。
作成前に教えていただき、とても助かりました。テーブルを1つにするように考えてみたいと思います。

3
hiroton 2020/10/27 (火) 09:59:32 7c8fb@f966d

一連の質問の延長ですかね?
最終的に合体テーブル(タイトル、感想、製作年、国、おすすめ度合い、タイプ、etc...)を作りたい。とか

    Set rs = db.OpenRecordset(tblname)

Database.OpenRecordset メソッド (DAO)

tblnameにはクエリを指定することもできます

'//テーブル1パターン
Private Sub データ追加_Click()
    Dim strSQL As String
    strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 合体テーブル"
    Call AddData(strSQL, Me.txtデータ)
End Sub

こんな感じで必要な列と並びを指定してあげればデータごとにインポート用のテーブルを作る必要はないですよ

5
セロハン 2020/10/27 (火) 12:07:18 0029a@1c915 >> 3

仰る通り一連の質問の延長でした。
取り込む際に設定して1つのテーブルにすればよかったのですね。
ごめんなさい、例ではフィールド名を同じにしてしまいましたが、
実際は微妙に違う名前ですのでそれで書いてみます。
下記認識で正しいでしょうか…?

パターン1【フィールド名】タイトル、感想、製作年、国
パターン2【フィールド名】題名、作られた年
パターン3【フィールド名】タイトル、思ったこと、国名

パターンごとに3つボタンを作成。それぞれステートメント3行目を下記内容に変える。

パターン1
strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 合体テーブル"

パターン2
strSQL = "SELECT 題名,, 作られた年 FROM 合体テーブル"

パターン3
strSQL = "SELECT タイトル, 思ったこと,,国名 FROM 合体テーブル"

以上、何卒宜しくお願いいたします。

6
hiroton 2020/10/27 (火) 12:45:22 7c8fb@f966d >> 5

「合体テーブル」のフィールド名を挙げてください
(「合体テーブル」も分割したテーブルがなくなると名前が変わりそうですね)

7
セロハン 2020/10/27 (火) 12:53:59 0029a@1c915 >> 5

ありがとうございます。
仰る通り合体テーブルは変更して、「作品テーブル」とさせていただきます。
フィールド名は
タイトル、感想、製作年、国、おすすめ度合い、タイプ
でお願いします。
おすすめ度合い、タイプは後から追記するためのフィールドです。

8
hiroton 2020/10/27 (火) 13:26:58 7c8fb@f966d >> 3

メインのデータ取込処理は

        For j = 0 To UBound(Datas)
            rs(j) = Datas(j)
        Next

ですね。ループ処理になっているのでそれっぽく書き直すと

rs(0) = Datas(0)
rs(1) = Datas(1)
rs(2) = Datas(2)
:
:

な感じになります。これの意味するところはrsの0番目にDatasの0番目を入れる、rsの1番目にDatasの1番目を入れる・・・ということで、元データのフィールド名も作品テーブルのフィールド名も関係ありません。列番号だけ見て同じ列に値を入れているだけです。(列を飛ばしたりもできません)

例えばパターン2ならtblnameの1列目に「題名」を入れる、2列目に「作られた年」を入れるという処理をしていて、対応した列になっていればフィールド名は不問です

というわけで、「作品テーブル」から元データの列に対応する列を持ったテーブルをクエリ(SQL構文)で用意してあげます

パターン1
strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 作品テーブル"

パターン2
strSQL = "SELECT タイトル, 製作年 FROM 作品テーブル"

パターン3
strSQL = "SELECT タイトル, 感想, 国 FROM 作品テーブル"
9
セロハン 2020/10/27 (火) 15:10:46 0029a@1c915 >> 3

ありがとうございます。
取込不要の列があった場合にはどうなりますか?以下のように空欄にしてよいでしょうか。
※例えばパターン4の3列目に「取込不要列」があったとする。

パターン4
strSQL = "SELECT タイトル, 感想,, 国 FROM 作品テーブル"

もしくは
パターン4?
strSQL = "SELECT タイトル, 感想,取込不要列, 国 FROM 作品テーブル"
11
hiroton 2020/10/27 (火) 16:25:00 7c8fb@f966d >> 9

ちょっと脱線しますがクエリSQLについての知識を身につけましょう
ざっくりですが、SQLはデータベースを扱うための命令書の仕様、クエリはSQLに従って作成された実際の命令書といった感じです

ACCESSはSQLを意識することなくクエリを扱えるアプリケーションですが、クエリの実態はきちんとSQLです。クエリデザインでリボンの「表示」からSQLビューデザインビューを相互に切り替えることができ、ACCESSのGUI(クエリデザイン)で作成するものがSQLであることが確認できます

つまり、SQL構文を記述するというのはクエリを作成すると同じことをしているわけです

それでは、クエリデザインを起動しテーブルの表示では何も選ばずに閉じて、SQLビューを表示してみましょう

SELECT;

と表示された画面が表示されるはずです。選択クエリを作成しようとし、テーブルを一つも選んでいないので選択クエリであることを表すSQLの命令SELECTのみが表示されている状態です。これを

SELECT タイトル, 感想, 製作年, 国 FROM 作品テーブル

に書き換えてデザインビューデータシートビューと切り替えてみましょう。よく使う形のものを見ることができると思います。このデータシートビューをみれば「対応する列を持ったテーブルを作成する」の意味が分かると思います

うまく動いたらSQLビューデザインビューを切り替えて見比べてみてください。何となくSQL構文のどこがどういう意味なのか分かると思います

そうしたら次に

SELECT タイトル, 感想,, 国 FROM 作品テーブル
SELECT タイトル, 感想,取込不要列, 国 FROM 作品テーブル

も同様にSQLビューにコピペして試してみましょう


掲示板ではクエリデザインでのイメージを伝えるのが難しいものです。SQLビューを使ったSQL文のコピペのやり取りができると間違いのないやり取りができるようになるのでうまく活用できるようになりましょう

12
セロハン 2020/10/27 (火) 17:34:16 f1ed8@73413 >> 9

長文ありがとうございます🙇‍♂️
後ほど試させていただきます

10
セロハン 2020/10/27 (火) 15:54:33 0029a@1c915

作成してみたのですが、エラーが出ます。

以下のコードが黄色に反転される
Set rs = db.OpenRecordset(tblname)

実行時エラー'3075'
クエリ式 '国 FROM 作品テーブル' の構文エラー :演算子がありません。

14
strSQL = "(SQL文)"

(SQL文)はどのように指定していますか?
上で紹介した方法で、実際にクエリを表示してみてください。エラーが表示されると思うので「作品テーブル」に必要なフィールドがないか、SQL文そのものが間違っているか確認してください

やりたいことが理解できていたなら、クエリデザインでクエリを作成し、SQLビューのSQL文をコピーしてVBAコードとして貼り付けという方法で作成するのもありです。
(クエリデザインから自動で作られるSQLは省略可能な部分も表記されるので醜いですが)

13
hiroton 2020/10/27 (火) 18:15:35 7c8fb@f966d

不要列がある場合

1.エラーにして無視する

strSQL = "SELECT タイトル, 感想, 1, 国 FROM 作品テーブル"

実処理部分が

        On Error Resume Next '//エラーを無視する
        For j = 0 To colCount
            rs(j) = Datas(i)
            i = i + 1
        Next
        On Error GoTo 0 '//エラー無視を解除する

となってるのでダミーの列を用意すれば取込はできます(処理的にはエラーが出てるのであんまりよくはない)

2.作品テーブルにダミー列を用意する

フィールド名「ダミー」を作っておきます

strSQL = "SELECT タイトル, 感想, ダミー, 国 FROM 作品テーブル"

余計な列が必要なので残念な感じですが、大きな問題はでないんじゃないかなと

3.取り込まない列制御処理を入れる

上記で問題がある場合ケースバイケースで何かしらの制御を入れることもあるかもしれません(複雑な処理を組むくらいなら次の方法のほうが楽なのであんまりやらない)

4.最初の構想通り一時テーブルを用意する

スタートが違う(個別にデータを解析して取り込む必要がある)ので紹介しなかったですが、個別にテーブルを用意してそれぞれから追加クエリを発行すると、フィールド名の対応を取りつつ不要列は取り込まないようにできます。データ形式が決まりきったファイルでインポート定義を使って取り込めるようなデータならこれをやります

15
セロハン 2020/10/30 (金) 23:33:11 f1ed8@2b9f5 >> 13

詳しくありがとうございました。プリントして保存し、今後じっくり理解していきたいと思います。仰るとおり、結局4の方法で対応いたしました。