Access (VBA)

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

 
(Windows 10 Home : Access 2016)
BeforeInsertイベントについて
投稿日時: 20/07/11 07:09:12
投稿者: かつん

BeforeInsertイベントについてよく分からない部分があるので質問させていただきます。
 
レコードが追加されると、

@BeforeInsert→ABefreUpdate→BAfterUpdate→CAfterInsertの順でイベントが発生します。

@は、新規のレコードが追加される前(最初の文字が入力されるとき)に発生
Aは、変更されたレコードが更新される前に発生
Bは、変更されたレコードが更新された後に発生
Cは、新規のレコードが追加された後に発生

上記のような流れ、理解になると思います。
 
@は、一番下のレコード(新規のレコード)の適当なフィールドに文字を入力する瞬間。
Aは、レコードの更新される直前なので、そのレコードの最後のフィールドにいる状態からEnterキーを押したり、他のレコードのフィールドをクリックした瞬間。
と、自分なりに理解しています。
 
分からないのは、BとCです。
Bは、Aの後に起こる。
Cは、Bの時点でレコードが更新されているのだから追加も何も、既にレコードが存在しているので、何をもってして「追加」となるのかよく分かりません。
 
要はBとCは何が違うのでしょうか?というのが、分からない部分です。
何方かご教示お願いいたします。

回答
投稿日時: 20/07/12 20:08:03
投稿者: hatena
投稿者のウェブサイトに移動

かつん さんの引用:
分からないのは、BとCです。
Bは、Aの後に起こる。
Cは、Bの時点でレコードが更新されているのだから追加も何も、既にレコードが存在しているので、何をもってして「追加」となるのかよく分かりません。
 
要はBとCは何が違うのでしょうか?というのが、分からない部分です。

違いは、既存レコードを更新した場合、発生するのはBのみ。
新規レコードを追加した場合は、BとCが発生するということです。
 
新規レコードが追加された時のみ処理したいなら、Cに記述する。
既存レコードの更新、新規レコード追加のどちらでも処理したいのなら、Bに記述するという使い分けでいいでしょう。
 
ちなみに、既存レコードが更新された時のみ処理したい場合は、Bに下記のように記述します。
 
If Not Me.NewRecord Then
    '処理
End If

回答
投稿日時: 20/07/13 09:51:32
投稿者: sk

hatena さんの引用:
ちなみに、既存レコードが更新された時のみ処理したい場合は、
Bに下記のように記述します。

hatena さんの引用:
If Not Me.NewRecord Then
    '処理
End If

新規レコードの追加によって AfterUpdate イベントが発生した時点で、
カレントレコードの NewRecord プロパティは False を返します。
(既に新規レコードではなくなっている)
 
かつん さんの引用:
@は、新規のレコードが追加される前(最初の文字が入力されるとき)に発生
Aは、変更されたレコードが更新される前に発生
Bは、変更されたレコードが更新された後に発生
Cは、新規のレコードが追加された後に発生

厳密に言えば、「更新されたレコードが新規レコードだった時」に
発生するのが AfterInsert イベントです。

回答
投稿日時: 20/07/13 10:49:40
投稿者: hatena
投稿者のウェブサイトに移動

sk さんの引用:
hatena さんの引用:
ちなみに、既存レコードが更新された時のみ処理したい場合は、
Bに下記のように記述します。

hatena さんの引用:
If Not Me.NewRecord Then
    '処理
End If

新規レコードの追加によって AfterUpdate イベントが発生した時点で、
カレントレコードの NewRecord プロパティは False を返します。
(既に新規レコードではなくなっている)

 
おっと、そうでした。このコードは ABefreUpdate に記述する必要がありますね。
 
skさん、ご指摘ありがとうございました。

投稿日時: 20/07/14 07:45:36
投稿者: かつん

hatenaさん、skさん、ありがとうございます。
お二人の解説を読んで理解できたと思っています。自分なりの整理としては、以下のようになります。
 
新しくレコードが追加される時は@〜Cのイベントが発生するが、既存レコードの更新の場合はA→Bのイベントが発生する。
 
@は、一番下のレコード(新規のレコード)の適当なフィールドに文字を入力する瞬間。
Aは、レコードの更新される直前なので、そのレコードの最後のフィールドにいる状態からEnterキーを押したり、他のレコードのフィールドをクリックした瞬間。
Bは、Aのあと。
Cは、Bのあとなので、更新(AfterUpdate)が完了してから起こる。データの更新がきちんと完結したのち、初めて新規レコードが挿入された扱いとなる。
つまり、一例を挙げるとすると新規のレコード(テーブルの一番下のレコード)の全てのフィールドにデータを入力して、最後のフィールドの位置にいる状態からEnterキーを押すことで、A→B→Cが立て続けに起きる。

 
上記のような理解で大丈夫ですかね?
 

引用:
Cは、Bの時点でレコードが更新されているのだから追加も何も、既にレコードが存在しているので、何をもってして「追加」となるのかよく分かりません。

上記の疑問が生まれた理由としては@の時(1番下のレコードにデータを入力中)、入力できているのだから新規レコード自体は既に存在していると、勘違いしていました。つまり頭の中では勝手に@→C→A→Bと理解していたみたいです。何でこんな疑問が生まれたのだろうか?と、自分のことなのですが途中から分からずにいましたが、半ば無意識に変な理解をしていたみたいです。
 

回答
投稿日時: 20/07/14 18:23:38
投稿者: sk

引用:
Cは、Bのあとなので、更新(AfterUpdate)が完了してから起こる。
データの更新がきちんと完結したのち、初めて新規レコードが挿入された扱いとなる。
つまり、一例を挙げるとすると新規のレコード(テーブルの一番下のレコード)の
全てのフィールドにデータを入力して、最後のフィールドの位置にいる状態から
Enterキーを押すことで、A→B→Cが立て続けに起きる。
  
上記のような理解で大丈夫ですかね?

概ねそういうことです。
 
引用:
上記の疑問が生まれた理由としては@の時(1番下のレコードにデータを入力中)、
入力できているのだから新規レコード自体は既に存在していると、勘違いしていました。

BeforeInsert イベントが完了した時点で存在しているのは、
新規レコードを編集するためのバッファです。

投稿日時: 20/07/15 08:09:52
投稿者: かつん

sk さんの引用:

BeforeInsert イベントが完了した時点で存在しているのは、
新規レコードを編集するためのバッファです。

これで理解しました。入力しているのは「新規レコード」に対してではなく、「新規レコードを編集するための一時領域」に対して行っている。だから、まだBeforeUpdateもAfterUpdateは勿論、AfterInsertイベントは発生していない。ということですね。
整理が出来ました。skさんありがとうございました。
 
hatenaさん
偶然なのですが、数日前にhatenaさんのブログを読んでいました。勉強している箇所でFormatイベントの所で詰まってしまい、「レポートのイベントの発生メカニズムの研究(https://hatenachips.blog.fc2.com/blog-entry-147.html)」を拝見いたしました。細かく解説されていて自分なりに理解が進んだと思います。ありがとうございます。
ただ、それでも解消されない箇所が何点かあります。ここの掲示板でまた質問させていただこうと思ったのですが、レポートのデザインビューや、そのレコードソースを見ながらでないと要点を上手く伝えられないような気がしています。なので添付ファイルをアップロードできるyahoo知恵袋に質問を上げるので、一度見ていただけないでしょうか?
 

回答
投稿日時: 20/07/15 10:37:59
投稿者: hatena
投稿者のウェブサイトに移動

[quote="かつん"]

sk さんの引用:
hatenaさん
偶然なのですが、数日前にhatenaさんのブログを読んでいました。勉強している箇所でFormatイベントの所で詰まってしまい、「レポートのイベントの発生メカニズムの研究(https://hatenachips.blog.fc2.com/blog-entry-147.html)」を拝見いたしました。細かく解説されていて自分なりに理解が進んだと思います。ありがとうございます。
ただ、それでも解消されない箇所が何点かあります。ここの掲示板でまた質問させていただこうと思ったのですが、レポートのデザインビューや、そのレコードソースを見ながらでないと要点を上手く伝えられないような気がしています。なので添付ファイルをアップロードできるyahoo知恵袋に質問を上げるので、一度見ていただけないでしょうか?

そういうことなら、私が管理人をしている下記の掲示板に質問してもらえると助かります。
 
Microsoft Access 掲示板 - zawazawa
https://zawazawa.jp/ms-access/
 
ここは、画像をアップロードもできますし、実際のAccessファイルを送信できますので、実際のファイルをみて回答できます。

投稿日時: 20/07/16 15:40:31
投稿者: かつん

hatenaさん
 
掲示板の案内ありがとうございます。
先程、質問を投稿させていただきました。
 
元々の質問は解決しましたのでクローズさせていただきます。
ありがとうございました。