プロが教える店舗&オフィスのセキュリティ対策術

フォームのForm_BeforeUpdateイベントで、Cancel=Trueを設定し、更新を抑制しました。すると、フォームやAccess自体を×ボタンで閉じようとするときに「レコードを保存することはできません」というメッセージが出てしまいます。このメッセージを抑制する方法はありますか?

A 回答 (2件)

×ボタンでフォームやアクセス本体を閉じる時、まず、未保存の更新があると、フォームに関連付けたレコードセットに対して更新がかかります。



閉じる処理からレコードセットの更新ルーチンが呼ばれ、レコードセットの更新ルーチンからフォームのForm_BeforeUpdateが呼ばれます。ここでCancel=Trueにすると、更新がキャンセルされます。

フォームのForm_BeforeUpdateからキャンセルが返ると、レコードセットの更新ルーチンは「未保存の更新がある」と言うフラグをクリアしません。

「未保存の更新がある」と言うフラグが付いたまま閉じる処理に戻って来ると、閉じる瞬間に「レコードを保存することはできません」との警告が出てしまいます。

ですので「フォームのForm_BeforeUpdateが呼ばれる前に、フォームに関連付けたレコードセットに対してUndoを行って更新そのものが無かった事にして、未保存の更新があるフラグをクリアする」と言う事が必要です。

但し、この処理を入れると「最後の1レコード分のデータ入力を行ってから、レコードの更新をせず、レコードを移動せず、更新ボタンも押さず、いきなりフォームを閉じると、最後のデータ入力が全部パーになり消える」ので注意が必要です。Undoは「最後のデータ入力を全部パーにする命令」なので当然の話なのですが。

「フォームを閉じる際に、フォームのForm_BeforeUpdateで更新に対してキャンセルを返す」のが根本の原因ですので「フォームを閉じる際だけは、フォームのForm_BeforeUpdateで更新に対してキャンセルをしない」と言うのが「警告を出させない正しい方法」です。

この回答への補足

うーん、やってみたのですが、うまくいかなかったです。確かにUndoは機能しているのですが、Undoをした後でも同じメッセージがでました。

ありがとうざいます。

補足日時:2007/03/09 16:23
    • good
    • 0

Cancel=True



というコードそのものを書かないことです。

私は、AfterUpdate() 等でチェックしています。
この場合、不具合レコードが発生することもあるでしょう。
そんな時は、Form_Close() に不具合レコードを削除するコードを書いたらどうですか?

CnnExecute "DELETE FROM XXXX WHERE XXXXXX"

なお、CnnExecute は自作関数です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
入力欄を非連結にして更新部分を自作すればよいだけの話でした。

お礼日時:2007/03/13 15:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A