Microsoft Access 掲示板

マスタテーブルの値を更新するようなVBA

7 コメント
views
4 フォロー

お世話になっております。
以前テーブルの設計で相談をして、ご教示をして頂いたAccess初心者のStrikeです。
顧客情報履歴テーブルの顧客情報(顧客情報履歴CD)が変更された場合、顧客マスターテーブルの顧客情報履歴CDを更新するようなVBAの書き方を調べていたんですが、私の調べ方が悪いのか?コード書き方が見つからずご教示して頂きたく改めて書き込ませて頂きました。
宜しくお願い致します。

Strike
作成: 2021/06/14 (月) 23:14:24
通報 ...
1

顧客マスターテーブル、顧客情報履歴テーブル のフィールド構成、主キー設定を提示してください。

2
Strike 2021/06/15 (火) 22:57:46 70517@63fff

hatena様
いつもお世話になっております。
ご無沙汰しております。
下記はテーブルの構成になりますが、よろしくお願いします。

|顧客マスター
 ・顧客コード 主キー 数値型 サイズ:整数型,式=Nz(DMax("[顧客コード]","顧客マスター")+1,1)
 ・顧客情報履歴CD
 ・登録日

|顧客情報履歴
 ・顧客情報履歴CD 主キー 数値型 サイズ:バイト型,式=Nz(DMax("[顧客情報履歴CD]","顧客情報履歴")+1,1)
 ・顧客コード
 ・顧客名
 ・ふりがな
 ・変更日
 などです。

3

顧客マスターと顧客情報履歴は、一対多の関係ですよね。
だとしたら、一側の顧客マスターに 多側の 顧客情報履歴CD を持たせるのはどのような目的でしょうか。
また、顧客マスターの一つのレコードに対して、複数の顧客情報履歴のレコードが紐づきますが、その中のどの 顧客情報履歴CD を入力するのでしょうか。

4
Strike 2021/06/16 (水) 23:22:47 70517@63fff

hatena様
いつもお世話になっております。
顧客マスターに顧客情報を登録後、顧客情報に変更(連絡先や支払い条件等)があった場合、過去の情報を維持したいので顧客情報履歴CDをもたせたいです。顧客マスターの情報変更後以降の処理には最新の顧客情報データを適用したいので最新顧客情報履歴CDを顧客マスターテーブルに反映したいです。
もし、間違っていたらご指摘の程よろしくお願いします。

5

まず、蛇足から、

 ・顧客情報履歴CD 主キー 数値型 サイズ:バイト型,式=Nz(DMax("[顧客情報履歴CD]","顧客情報履歴")+1,1)

上記の主キーですか、バイト型だと255件しか登録できないので、整数型が長整数型にしておいた方かいいでしょう。長整数型をお勧めします。

本題

入力フォームで、入力するするときにVBAで更新することになりますが、現状の入力フォーム設計が不明なので、下記のような設計だと仮定します。

顧客情報履歴 に過去の顧客情報もすべて保存していくということなので、基本的に下記のような処理の流れになると思います。(一例ですが)

顧客情報閲覧フォームで顧客情報(最新のデータ)を表示
もし、データに変更がある場合は、
顧客情報更新フォームを新規レコードで開き(「データ入力」プロパティを「はい」に設定)、
顧客情報閲覧フォームのデータを転記する。

顧客情報更新フォームの更新前処理で、顧客マスター の 顧客情報履歴CD、登録日 を更新する。

顧客情報更新フォームの更新前処理は下記のような感じでいいでしょう。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Not Me.NewRecord Then Exit Sub
    
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset( _
             "SELECT * FROM 顧客マスター WHERE 顧客コード =" & Me.顧客コード, dbOpenDynaset)
    rs.Edit
    rs!顧客情報履歴CD = Me.顧客情報履歴CD
    rs!登録日 = Date
    rs.Update
    rs.Close
End Sub

上記はDAOレコードセットを開いて、Edit、 Updateメソッドで更新してますが、
更新クエリで更新する方法もあります。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Not Me.NewRecord Then Exit Sub
    
    Dim stSQL As String
    '更新クエリのSQL生成
    stSQL = "UPDATE 顧客マスター SET " & _
            " 顧客情報履歴CD= " & Me.顧客情報履歴CD & _
            ",登録日= " & Date & _
            " WHERE 顧客コード =" & Me.顧客コード
    
    CurrentDb.Execute stSQL '更新クエリ実行

End Sub
6
Strike 2021/06/17 (木) 23:57:26 70517@63fff

hatena様
いつもお世話になっております。
フィールドサイズのご意見ありがとうございます。
参考させていただきます。
VBAで更新コードもありがとうございます。
取り入れてみますが、上手くいかなかった場合はまた相談させてください。
本当にありがとうございました。

7
hiroton 2021/06/18 (金) 15:59:46 1b487@f966d

VBAの書き方っていうよりACCESSデータベースの設計の話なんですかね?

いろいろ端折って該当部分のVBAだけなら

Private Sub Form_AfterInsert()
    Me.Parent!顧客情報履歴CD = Me.顧客情報履歴CD
End Sub

で済みそうだけど