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
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
顧客マスターテーブル、顧客情報履歴テーブル のフィールド構成、主キー設定を提示してください。
hatena様
いつもお世話になっております。
ご無沙汰しております。
下記はテーブルの構成になりますが、よろしくお願いします。
|顧客マスター
・顧客コード 主キー 数値型 サイズ:整数型,式=Nz(DMax("[顧客コード]","顧客マスター")+1,1)
・顧客情報履歴CD
・登録日
|顧客情報履歴
・顧客情報履歴CD 主キー 数値型 サイズ:バイト型,式=Nz(DMax("[顧客情報履歴CD]","顧客情報履歴")+1,1)
・顧客コード
・顧客名
・ふりがな
・変更日
などです。
顧客マスターと顧客情報履歴は、一対多の関係ですよね。
だとしたら、一側の顧客マスターに 多側の 顧客情報履歴CD を持たせるのはどのような目的でしょうか。
また、顧客マスターの一つのレコードに対して、複数の顧客情報履歴のレコードが紐づきますが、その中のどの 顧客情報履歴CD を入力するのでしょうか。
hatena様
いつもお世話になっております。
顧客マスターに顧客情報を登録後、顧客情報に変更(連絡先や支払い条件等)があった場合、過去の情報を維持したいので顧客情報履歴CDをもたせたいです。顧客マスターの情報変更後以降の処理には最新の顧客情報データを適用したいので最新顧客情報履歴CDを顧客マスターテーブルに反映したいです。
もし、間違っていたらご指摘の程よろしくお願いします。
まず、蛇足から、
上記の主キーですか、バイト型だと255件しか登録できないので、整数型が長整数型にしておいた方かいいでしょう。長整数型をお勧めします。
本題
入力フォームで、入力するするときにVBAで更新することになりますが、現状の入力フォーム設計が不明なので、下記のような設計だと仮定します。
顧客情報履歴 に過去の顧客情報もすべて保存していくということなので、基本的に下記のような処理の流れになると思います。(一例ですが)
顧客情報閲覧フォームで顧客情報(最新のデータ)を表示
もし、データに変更がある場合は、
顧客情報更新フォームを新規レコードで開き(「データ入力」プロパティを「はい」に設定)、
顧客情報閲覧フォームのデータを転記する。
顧客情報更新フォームの更新前処理で、顧客マスター の 顧客情報履歴CD、登録日 を更新する。
顧客情報更新フォームの更新前処理は下記のような感じでいいでしょう。
上記はDAOレコードセットを開いて、Edit、 Updateメソッドで更新してますが、
更新クエリで更新する方法もあります。
hatena様
いつもお世話になっております。
フィールドサイズのご意見ありがとうございます。
参考させていただきます。
VBAで更新コードもありがとうございます。
取り入れてみますが、上手くいかなかった場合はまた相談させてください。
本当にありがとうございました。
VBAの書き方っていうよりACCESSデータベースの設計の話なんですかね?
いろいろ端折って該当部分のVBAだけなら
で済みそうだけど