Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Access 2016)
複数テーブルに同じデータを追加で入力したいです。
投稿日時: 18/12/19 12:53:30
投稿者: Cst&Dog

以前同内容の質問をさせていただき、下記のコードを教えて頂きました。
 
使用方法としては、CSVでデータを一括インポートしそのデータは【M_顧客情報】に入ります。
マクロ?で【TW_顧客基本情報】【TW_購入履歴】に顧客IDを作成し【TW_購入履歴】の
顧客IDの列を全てコピーし【M_顧客情報】に貼り付けています。
 
【M_顧客情報】を元にしたフォームと【TW_購入履歴】を元にしたフォームを顧客IDで紐づけ、
1つの検索フォームで両方が検索で出てくる様にしました。
 
そこで重複などが見つかった際、手動で訂正をしていました。
 
しかし、追加でデータを入力した際、【TW_顧客基本情報】【TW_購入履歴】に顧客ID
を作成すると訂正したものがリセットされてしまいました。
 
訂正したものはそのままで、新に追加されたものだけに顧客IDを振り分けたいと
思うのですが何か方法はないでしょうか?
 
ご指導ご鞭撻のほど何卒宜しくお願い致します。
 
 
※以前教えて頂いたコードは下記になります※

Option Compare Database
Option Explicit
 
Private Const SourceTableName As String = "M_顧客情報"
Private Const CustomersWorkTableName As String = "TW_顧客基本情報"
Private Const PurchaseWorkTableName As String = "TW_購入履歴"
 

Public Sub subCreateWorkRecords()
     
    Dim db As DAO.Database
    Dim rsSource As DAO.Recordset
    Dim rsCustomers As DAO.Recordset
     
    Dim strSQL As String
    Dim strInsertSQL As String
    Dim strSelectSQL As String
    Dim strFromSQL As String
    Dim strWhereSQL As String
    Dim strGroupSQL As String
    Dim strOrderSQL As String
     
    Dim lngNewCustomerID As Long
    Dim dtCurrentTime As Date
     
    Set db = CurrentDb
     
    strSQL = "DELETE * FROM [" & CustomersWorkTableName & "]"
    db.Execute strSQL, dbFailOnError
     
    strSQL = "DELETE * FROM [" & PurchaseWorkTableName & "]"
    db.Execute strSQL, dbFailOnError
     
    strSelectSQL = " SELECT t1.[名前]" & _
                   ", t1.[メールアドレス]" & _
                   ", t1.[メールアドレス2]" & _
                   ", t1.[メールアドレス3]"
     
    strFromSQL = " FROM [" & SourceTableName & "] t1"
     
    strWhereSQL = " WHERE Nz(t1.[名前],'')<>''"
     
    strGroupSQL = " GROUP BY t1.[名前]" & _
                  ", t1.[メールアドレス]" & _
                  ", t1.[メールアドレス2]" & _
                  ", t1.[メールアドレス3]"
     
    strOrderSQL = " ORDER BY Min(t1.[ID])"
     
    strSQL = strSelectSQL & _
             strFromSQL & _
             strWhereSQL & _
             strGroupSQL & _
             strOrderSQL
     
    Set rsSource = db.OpenRecordset(strSQL, dbOpenSnapshot)
     
    Set rsCustomers = db.OpenRecordset(CustomersWorkTableName, dbOpenDynaset)
     
    lngNewCustomerID = 0
    dtCurrentTime = Now()
     
    With rsSource
        Do Until .EOF
            lngNewCustomerID = lngNewCustomerID + 1
            rsCustomers.AddNew
            rsCustomers![顧客ID] = lngNewCustomerID
            rsCustomers![名前] = ![名前]
            rsCustomers![メールアドレス] = ![メールアドレス]
            rsCustomers![メールアドレス2] = ![メールアドレス2]
            rsCustomers![メールアドレス3] = ![メールアドレス3]
            rsCustomers![登録日時] = dtCurrentTime
            rsCustomers.Update
             
             strInsertSQL = "INSERT INTO [" & PurchaseWorkTableName & "] ("
              
            strInsertSQL = strInsertSQL & _
                           "  [購入履歴ID]" & _
                           ", [顧客ID]" & _
                           ", [購入時顧客名]" & _
                           ", [購入日]" & _
                           ", [商品名]" & _
                           ", [金額]" & _
                           ", [登録日時]"
 
            strInsertSQL = strInsertSQL & _
                           ", [キャッシュバック]" & _
                           ", [連絡日]" & _
                           ", [方法]"
 
            strInsertSQL = strInsertSQL & ") "
             
            strSelectSQL = " SELECT " & _
                           " t1.[ID]" & _
                           ", " & lngNewCustomerID & " AS [顧客ID]" & _
                           ", t1.[名前]" & _
                           ", IIf(IsDate(t1.[購入日]),CDate(t1.[購入日]),Null) AS [購入日]" & _
                           ", t1.[商品名]" & _
                           ", IIf(IsNumeric(t1.[金額]),CCur(t1.[金額]),Null) AS [金額]" & _
                           ", #" & Format(dtCurrentTime, "yyyy/mm/dd hh:nn:ss") & "# AS [登録日時]"
                           
            strSelectSQL = strSelectSQL & _
                           ", t1.[キャッシュバック]" & _
                           ", t1.[連絡日]" & _
                           ", t1.[方法]"

             
            strFromSQL = " FROM [" & SourceTableName & "] t1"
             
            strWhereSQL = " WHERE Nz(t1.[名前],'') = '" & ![名前] & "'" & _
                          " AND Nz(t1.[メールアドレス],'') = '" & ![メールアドレス] & "'" & _
                          " AND Nz(t1.[メールアドレス2],'') = '" & ![メールアドレス2] & "'" & _
                          " AND Nz(t1.[メールアドレス3],'') = '" & ![メールアドレス3] & "'"
             
            strOrderSQL = " ORDER BY t1.[ID]"
             
            strSQL = strInsertSQL & _
                     strSelectSQL & _
                     strFromSQL & _
                     strWhereSQL & _
                     strOrderSQL
 
            db.Execute strSQL, dbFailOnError
 
            .MoveNext
        Loop
    End With
 
    Set rsCustomers = Nothing
    Set rsSource = Nothing
    Set db = Nothing
     
    MsgBox "作業用テーブルにレコードを追加しました。", _
           vbInformation, _
           "実行完了(subCreateWorkRecords)"
     
End Sub

回答
投稿日時: 18/12/19 16:29:25
投稿者: Suzu

【1つのデータ入力で複数のテーブルに入力することが出来るかどうか】
https://www.moug.net/faq/viewtopic.php?t=77641
 
の続きですね。
 
このコードの内容を理解した上でのご質問なのでしょうか。
 
TW_顧客基本情報
TW_購入履歴
  に修正を加えようが、
  ・TW_顧客基本情報/TW_購入履歴 のレコード 削除し
  ・M_顧客情報 の情報を基にTW_顧客基本情報/TW_購入履歴 のレコードを作成
 
と言う流れですから、そうなって当然ですよ。
 

引用:
訂正したものはそのままで、新に追加されたものだけに顧客IDを振り分けたいと
思うのですが何か方法はないでしょうか?
  
ご指導ご鞭撻のほど何卒宜しくお願い致します。

 
ってことはヒントを貰ってご自分で改造するおつもりなのですね。
 
1.「訂正した」と言う情報を、TW_顧客基本情報/TW_購入履歴 それぞれに持たる為、
   フィールド「訂正済」(Yes/No型)を追加
 
2. TW_顧客基本情報/TW_購入履歴 は、フォームのレコードソースになっているでしょうから
   更新後処理等で、先程追加した「訂正済」にチェックを入れる。
 
3. TW_顧客基本情報/TW_購入履歴 への削除クエリの実行時に、訂正済 が Yesのレコードを削除対象から外す
 
4. TW_顧客基本情報 に 残った 顧客ID の情報を更に別のワークテーブル TW_訂正済顧客情報 に コピー
   TW_顧客基本情報 のデータを削除
 
5. M_顧客情報にデータがあり、TW_訂正済顧客情報 にデータが無いレコードを
   の情報を基にTW_顧客基本情報/TW_購入履歴 に追加

投稿日時: 18/12/19 18:06:24
投稿者: Cst&Dog

ご回答ありがとうございます。
 
まったくの素人の為、全くどういったものだったのか理解しておりませんでした。
また、お教えいただいたこともあまり理解ができておりません。
 
やりたい挙動としては、
 
1.CSVでデータを一括入力
2.名前、メアドが一致する人に同じ顧客IDを作成
3.一致しないものは、手動で変更
4.後日、追加でデータをCSVでいれる
5.元々のデータと照らし合わせ2から繰り返し
 
といった流れを考えております。
 
これは、可能でしょうか?
可能な場合どうすればいいのでしょうか?
 
大変お手数ではございますが、ご回答いただけますと幸いです。
何卒宜しくお願い致します。

回答
投稿日時: 18/12/19 19:06:00
投稿者: Suzu

ここまでを拝見すると、スキルアップをして自分でどうにかコードを理解して実現しよう
と言うスタンスでは無い様に見受けられます。
  
業務として、そういう仕組みが必要だから、それを実現させるにはどうしたら良いか
一から 手とり足とり 教えて。 の様に見受けられます。
 
 
仮にコードを誰かが提示したとしましょう。
 
当初は、順当に動作していたとして
 
今後仕様変更もあるでしょう。
入力したデータ から 間違ったデータがもたらされる事も考えられます。
 
掲示板でまた一から説明し、コード提示し修正版を下さいと言いますか?
 
その間業務は止まるのですよね?
 
本当に業務で必要で、あなたの手に余るのであれば、
プログラミングを生業としている所へ依頼して対価を支払い
きちんと動作検証までされた物を使うべきと思いますよ。
 
少なくとも、やりたい事 全てを 掲示板のなかのやりとりだけで完結するのは
質問者/回答者 双方にとって非効率的です。

投稿日時: 18/12/20 09:41:26
投稿者: Cst&Dog

ご回答ありがとうございます。
 
おっしゃることはごもっともです。
 
ただ、専門の場所に頼むことが出来ないため、仕事の合間で私が制作をしております。
すでにあるもので、動作自体はできておりますので業務が停止することはございません。
 
本なども購入しましたが、元々の知識不足の為、掲示板でお力添えいただきたく
こちらに書き込みをしております。
 
ご不快な思いをさせてしまっておりましたら申し訳ございません。
 
できるのであればご回答を頂きたいと思っております。
お分かりになる方がいらっしゃいましたらご回答いただけますと幸いです。
 
何卒宜しくお願い致します。

トピックに返信