#714 あるレコードの更新を他のレコードにも連動させるには? フォーム、VBA

フォーム上のある1レコードを更新したとき、一定のルールでそのレコードを関連した他のレコードの内容も連動して同様の値に更新させる方法です。たとえば、「同じ商品分類の”単位”はすべて同じ値に設定する」という入力規則があるような場合に使えると思います。

ここでは、各レコードの「商品分類」フィールドの値をチェックし、更新されたカレントレコードと同じ商品分類のレコードがあればそのすべての「単位」を更新されたレコードと同じにするという例で説明します。

それには、フォームの「AfterUpdate/更新後処理」イベントプロシージャを下記のようにします。
  • 単位の更新時ではなく、レコード全体が保存されようとしたタイミングで、カレントレコードと同じ商品分類のレコードを「FindFirst」「FindNext」メソッドですべて検索し、見つかったレコードを更新しています。
  • フォームに表示されたレコード上を検索・更新するので、「Me.RecordsetClone」でそのRecordsetオブジェクトを生成しています。
  • 最初に検索を実行する際は「FindFirst」メソッド、その次を順次検索する場合は「FindNext」メソッドを使いますが、いずれも検索条件に合致するレコードが見つからなかった場合には、Recordsetオブジェクトの「NoMatch」プロパティがTrueになります。それをDo〜Loopを抜ける条件とすることで、全該当レコードを検索・更新しています。

Private Sub Form_AfterUpdate()
'フォームの更新後処理

  Dim rst As Recordset
  Dim strCriteria As String

  Set rst = Me.RecordsetClone

  '"商品分類がカレントレコードと同じである"を検索条件とする
  strCriteria = "商品分類 = '" & Me!商品分類 & "'"

  With rst
    '最初の該当レコードを検索
    .FindFirst strCriteria
    '該当レコードがある間のループ
    Do Until .NoMatch
      '見つかったレコードの単位をカレントレコードと同じ値に更新
      .Edit
        !単位 = Me!単位
      .Update
      '次の該当レコードを検索
      .FindNext strCriteria
    Loop
    .Close
  End With

End Sub


実行例:

■実行前


■商品分類「B」のある1レコードの「単位」を変更


■そのレコードが保存されると....
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved