Microsoft Access Club Access超初心者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルサブフォームのレコードを削除するとDELETEイベントが2回発生する
記事No83272
投稿日: 2018/03/13(Tue) 16:44
投稿者ばぜ
解決済: ON
OS:Windows 7
Access Version:Access 2010

こんにちは。いつもお世話にになっております。

親フォーム:単票形式
サブフォーム:表形式
でリンクフィールドを設定した良くある構成のフォームを利用しています。

複数同時削除の防止や削除確認のために
サブフォームのDeleteイベント・AfterDelConfirmイベント・BeforeDelConfirmイベントを用いて
削除の可否と確認メッセージの出力を行っています。

このサブフォームを単体で開いて削除した場合は想定通りの動作をするのですが
親フォームを開いた状態で同様の操作を行い、DeleteイベントをCancelした時に限り
何故かもう一度一連のイベントが発生します。(消すのをやめたあとまたすぐ消そうとする)
Msgboxを埋め込んで確認すると
Delete→Before→Accessの削除確認(いいえを選択)→After→Delete→Before→Accessの削除確認(いいえを選択)→After
という順序でイベントが発生します。

むりやり1回で終わらせるためにグローバル変数でフラグを用意しておき
Deleteイベントの頭でフラグを書き換えてみたのですが
ウォッチで確認するとなんとDeleteイベントがEnd Subに到達した瞬間に
グローバル変数の値が巻き戻ります(こんな事ってありえるんでしょうか?)

一応、サブフォームの「更新の許可」を「はい」にすると上記現象は解決するのですが
「更新の許可」を「いいえ」にしたままなんとかする方法はありませんでしょうか?

またこの挙動は仕様なのでしょうか?仕様であればどこかヘルプ等に原理が記述されているところがありますか?

タイトルRe: サブフォームのレコードを削除するとDELETEイベントが2回発生する
記事No83273
投稿日: 2018/03/13(Tue) 16:56
投稿者ばぜ
解決済: ON
追記ですが「更新の許可」を「はい」にして解決しない理由は、

使用目的がちょっと特殊なフォームで、

「登録と(特定条件を満たしているレコードのみ)削除が可能だが、
  一度登録した物は書き換えることは出来ない。」

という条件が必要だからです。
更新の許可を入れてしまうと登録されたレコードが書き換えることが可能になってしまい
それを防ぐために各コントロールの編集ロックを入れると今度は新規レコードの入力も不可能になってしまいます。

ゆえに、表形式のサブフォームのプロパティは

データ入力用:いいえ
追加の許可:はい
更新の許可:いいえ
削除の許可:はい

になっており、実際に削除が可能かどうかは上述の通りDeleteイベントにてVBAで処理している次第です。

タイトルRe: サブフォームのレコードを削除するとDELETEイベントが2回発生する
記事No83274
投稿日: 2018/03/14(Wed) 04:22
投稿者hatena
解決済: ON
> 複数同時削除の防止や削除確認のために
> サブフォームのDeleteイベント・AfterDelConfirmイベント・BeforeDelConfirmイベントを用いて
> 削除の可否と確認メッセージの出力を行っています。

とりあえず、現状のコードを提示するのが先決でしょう。

それを見ずに回答できる超人はいないでしょう。

タイトルRe: サブフォームのレコードを削除するとDELETEイベントが2回発生する
記事No83275
投稿日: 2018/03/14(Wed) 08:45
投稿者hatena
解決済: ON
> Msgboxを埋め込んで確認すると
> Delete→Before→Accessの削除確認(いいえを選択)→After→Delete→Before→Accessの削除確認(いいえを選択)→After
> という順序でイベントが発生します。

VBAでの確認メッセージ(Msgbox)ではなくシステム(Access)の出す削除確認メッセージのことですね。

提示の条件(サブフォーム, 更新の許可 いいえ)で実験してみたら、症状が再現しました。確かに、
削除確認メッセージが2回出ますね。

サブフォームの場合、更新時や削除時にメイン側との同期をとるための処理が自動で走っているようですが、それとからんで、削除イベントが2回発生している感じですね。あくまで推測ですが。

無理矢理の対処法ですが、
システムの削除確認でキャンセルした場合、グローバルフラグを利用して一定時間、削除をキャンセルするようにしてみました。


Dim flgCancelDel As Boolean

Private Sub Form_AfterDelConfirm(Status As Integer)
    If Status = acDeleteUserCancel Then
        flgCancelDel = True
        Me.TimerInterval = 100 '0.1秒間削除をキャンセル
    End If
End Sub

Private Sub Form_Delete(Cancel As Integer)
    Cancel = flgCancelDel
End Sub

Private Sub Form_Timer()
    Me.TimerInterval = 0
    flgCancelDel = False
End Sub

これで2回確認されることはなくなります。

タイトルRe^2: サブフォームのレコードを削除するとDELETEイベントが2回発生する
記事No83276
投稿日: 2018/03/14(Wed) 16:55
投稿者ばぜ
解決済: ON
> 提示の条件(サブフォーム, 更新の許可 いいえ)で実験してみたら、症状が再現しました。確かに、
> 削除確認メッセージが2回出ますね。
>
> サブフォームの場合、更新時や削除時にメイン側との同期をとるための処理が自動で走っているようですが、
> それとからんで、削除イベントが2回発生している感じですね。あくまで推測ですが。
>
> 無理矢理の対処法ですが、
> システムの削除確認でキャンセルした場合、グローバルフラグを利用して一定時間、削除をキャンセルするようにしてみました。

hatena様

検証頂き有難うございます。
やはり無理矢理回避する以外に道はないのでしょうか。

どうもブレークポイントを入れるとイベントが2回発生しなくなるとか
その場合見た目上何もしてなくてもプログラムが実行中扱いになり
一時停止を押すと関係ないモジュールのとんでもないところに実行中のカーソルが飛んだり
デバッグをステップアウトで抜けてもう一度削除しようとすると
DELETEイベントを発生させずにいきなりレコードの削除が可能だったり

なんか変な挙動をしているみたいです。

御教示の通りタイマーイベントを用いてフラグを立ててみたのですが
DELETEイベントでCancel = Trueを使うと挙動がおかしくなったので(次の操作でイベントが発生しない等)
DELETEイベントでは処理内容を数値フラグとして持たせるだけでCancelは行わず、
BeforeDelConfirmで実際の削除を、AfterDelConfirmでメッセージを表示するようにして対処しました。

DELETEをCancelした場合と違ってBeforeDelConfirmでCancelすると
一瞬レコードが消えてまた復活したのような描写になってしまいますがしょうがないですね…。

ありがとうございました。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る