Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Access 2007)
レコードが存在するか調べ、存在しなければ追加するには
投稿日時: 17/11/12 05:44:45
投稿者: EMU-GK

はじめまして。
アクセス初心者です。
VBAは、エクセルで少しかじった程度です。
 
さっそくですが、今回やりたいことを書いていきたいと思います。
 
・日々送られてくる受注データ(CSV)を、"受注テーブル" に読み込み
・上記テーブルから、納品先IDを別テーブル "届け先マスター" に追加
 
まずはアクセスの追加クエリを作成したのですが、!(実行)する度に
コメントが表示されるので、VBAを使おうと思いました。
 
以下、現在のプログラムコードです。
※見やすいように、一部省略しています。
____________________
 
Sub 届先登録()
 
Dim DB As Database
    Set DB = CurrentDb
Dim T_jutyu As Recordset
    Set T_jutyu = DB.OpenRecordset("T_受注データ", dbOpenTable)
  
Dim dtnt_UC, (他複数) As Recordset
 '↑メーカーごとの届先マスター用テーブル
 
Dim dtnt_Item(10) As String '受注データから特定のフィールドを読込用
Dim exist As String '既存IDかどうか調査用
 
    Do Until T_jutyu.EOF
        dtnt_Item(0) = T_jutyu!販売荷主
        dtnt_Item(6) = T_jutyu!納品先CD
        dtnt_Item(10) = T_jutyu!固有ID
            '(↑固有IDは、CSV読込時に "販売荷主 & 納品先CD" で作成しています。)
           '※(ここまではうまくいっています。)
 
           '※(ここから進めずにいます。)
        Select Case dtnt_Item(0)
            Case Is = "UC"
                exist = "SELECT * FROM M_UC届先マスター WHERE 固有ID='" & dtnt_Item(10) & "' ;"
                Set dtnt_UC = DB.OpenRecordset(exist, dbOpenDynaset)
 
'(dtnt_UCの固有IDフィールドの中から、受注データの固有IDを検索して、
   存在しなければ追加登録したい)
 
                    If Not dtnt_UC.EOF Then
                       dtnt_UC.AddNew
                            dtnt_UC!販売荷主 = dtnt_Item(0)
                            dtnt_UC!納品先CD = dtnt_Item(6)
                            dtnt_UC!固有ID = dtnt_Item(10)
                        dtnt_UC.Update
                        dtnt_UC.Close
                        Set dtnt_UC = Nothing
                    End If
        End Select
     T_jutyu.MoveNext
    Loop
End Sub
____________________
 
■上記コード概訳■
 
・受注データ読込時、固有IDを作成(別Module)
・受注データテーブルから、必要項目を変数に格納(一部略)
〜〜〜↑ここまでOK〜〜〜
・フィールド”販売荷主”を元に、それぞれのテーブルに
  同一の "固有ID" が存在しなければ追加
 
IF文のところは当サイト含め色々と検索して試したのですが、
上記コード(現状)では
https://tonari-it.com/excel-vba-access-if-exists/
を参照したものとなっています。(エクセルVBAですが・・・)
 
よろしくお願いいたします。

回答
投稿日時: 17/11/13 01:14:20
投稿者: hatena
投稿者のウェブサイトに移動

EMU-GK さんの引用:

まずはアクセスの追加クエリを作成したのですが、!(実行)する度に
コメントが表示されるので、VBAを使おうと思いました。

 
確認メッセージが表示されるということでしょうか。
だとしたら、下記のようにすればメッセージ表示なしに実行できます。
 
DoCmd.SetWarnings False '確認メッセージ非表示
Docmd.OpenQuery "追加クエリ名"
DoCmd.SetWarnings True '確認メッセージ表示

 
あるいは、下記のようにDAOで実行しても確認メッセージは表示されません。
 
CurrentDb.Execute "追加クエリ名", dbFailOnError

 
または、追加クエリのSQL文を直接記述すれば、追加クエリを作成する必用もないです。
 
CurrentDb.Execute "INSERT INTO ・・・・・・・・", dbFailOnError

 

回答
投稿日時: 17/11/13 16:11:03
投稿者: Suzu

こんにちは。
 
確認メッセージについてはhatenaさんが既に回答を下さいっています。
 
 
ちょと気になったのが、処理速度の部分です。
 
検索して
 あれば 追加
 無ければ スルー
 
なのですよね。
 
 
固有キー 固有ID を検索しますが、固有ID以外の内容が、必ず格納先のテーブルの内容と一致する
 
が、保障されているなら、
1.格納先のテーブルのデータから、CSV 内に存在する 固有IDのデータを削除
    削除クエリ
       DELETE * FROM 格納先テーブル WHERE 格納先テーブル.固有ID = CSVデータ一時格納テーブル.固有ID
 
2.CSV内のデータを 格納先テーブルに追加
    追加クエリ
       INSERT INTO 格納先テーブル (固有ID, フィールド1, フィールド2,・・・ )
       SELECT CSVデータ一時格納テーブル.固有ID, CSVデータ一時格納テーブル.フィールド1,
                      CSVデータ一時格納テーブル.フィールド2, ・・・
              FROM CSVデータ一時格納テーブル
 
の方が、処理速度は速いと思います。
 
既存テーブルをコピーしテストしてみてください。

回答
投稿日時: 17/11/13 17:14:09
投稿者: hatena
投稿者のウェブサイトに移動

Suzu さんの引用:

1.格納先のテーブルのデータから、CSV 内に存在する 固有IDのデータを削除
    削除クエリ
       DELETE * FROM 格納先テーブル WHERE 格納先テーブル.固有ID = CSVデータ一時格納テーブル.固有ID
 
2.CSV内のデータを 格納先テーブルに追加
    追加クエリ
       INSERT INTO 格納先テーブル (固有ID, フィールド1, フィールド2,・・・ )
       SELECT CSVデータ一時格納テーブル.固有ID, CSVデータ一時格納テーブル.フィールド1,
                      CSVデータ一時格納テーブル.フィールド2, ・・・
              FROM CSVデータ一時格納テーブル
 
の方が、処理速度は速いと思います。

 
質問で実行したい処理は、
 
csvファイルから"受注テーブル"にインポート
"受注テーブル"に"届け先マスター"にない届け先データが存在すれば、"届け先マスター"に追加
 
という処理だと思いました。だとすると、"受注テーブル"のデータを削除するのはまずいですね。
追加のためだけに別に一時テーブルを用意するのも無駄ですね。
 
"受注テーブル"と"届け先マスター"で不一致クエリを作成して、それを追加クエリにするのが妥当だという気がします。
あるいは、"届け先マスター"の"固有ID"を主キーにしておけば、"受注テーブル"の届け先データをすべて追加するクエリにすれば、重複するデータははじいて追加されます。

回答
投稿日時: 17/11/13 18:06:16
投稿者: Suzu

当方のデータのやり取りのイメージとしては
 
T_受注データ から M_UC届先マスター へのデータ 追加の時の処理のイメージをした回答です。

回答
投稿日時: 17/11/14 02:38:00
投稿者: hatena
投稿者のウェブサイトに移動

Suzu さんの引用:
当方のデータのやり取りのイメージとしては
 
T_受注データ から M_UC届先マスター へのデータ 追加の時の処理のイメージをした回答です。

 
なるほど、読み違えてました。
マスターの方の重複するデータを削除しておいて、追加ということですね。
それなら、問題ないですね。

投稿日時: 17/11/14 20:32:04
投稿者: EMU-GK

皆様、ご回答ありがとうございます。
また、返信が大変遅くなり、申し訳ありません。
 
質問を投稿した翌日から、ちょっとプライベートで立て込んでおりまして、
現在開発ができない状況です。
たぶん、今度の土日あたりで何かとテストできると思いますので、
お教えいただいた内容のテストや結果、及びお礼は、後日改めて報告させていただきます。
 
ありがとうございます。

投稿日時: 17/11/19 18:41:53
投稿者: EMU-GK

>Hatenaさん
 
ご回答、ありがとうございました。
こんな簡単に目的の動作ができると思ってませんで、驚きましたが(笑)
応用で、商品登録もすることができました。
 
 
>Suzuさん
 
実は質問文で抜き出した届先マスターテーブルから若干の編集が必要な作業があるので、
今回はお教え戴いた内容では対応できないというのが結論です。
が、処理速度のことまで考えていただき、大変参考になりました。
もしも別の機会に何かあれば、踏み込んだ開発ができるのではないかと思います。
ありがとうございました。