私は Access でプロジェクトに取り組んできましたが、そのプロジェクトに長く取り組んでいるほど、それを軽視しています。私は一日中グーグルで回避策を試みてきましたが、私がやろうとしていることを見つけることができません.
テーブルにリンクされたフォームがあります。フォームのレコードを新しいレコードに設定するボタンが 1 つあります。いずれかのテキスト ボックスに入力を開始すると、レコードの更新が開始されますが、この時点では実際には挿入が行われていません。ただし、オフレコをナビゲートすると、更新が呼び出されます。ユーザーが私が見つけた新しいレコードを追加したくない場合、更新が行われないようにするためにできることは何もありません。私は使用しています
DoCmd.GoToRecord , , acNewRec
すべてのテキスト ボックスが新しいレコードに移動するようにフォームを取得するには。この時点で、いずれかのテキスト ボックスに入力を開始するとすぐに戻ることができなくなります。自動番号が増加し、自動番号をプレフィックスに連結してシリアル番号として機能させる SKU ビルダーがあります。
私がする必要があるのは、ユーザーが閉じるをクリックした場合に更新をキャンセルする方法を見つけることです。閉じるを無効にしようとしましたが、いつでもバーを右クリックして、そこから [閉じる] を選択できます。これは、処理中のレコードのコミットを閉じるようにフォームに促し、その後「afterUpdate」イベントを発生させるものと一緒です。Microsoft のドキュメントをいくつか読んだところ、「form_unload」がワークフローで最初に呼び出されましたが、挿入は常にその前に行われました。「beforeUpdate」も使用しようとしましたが、「afterUpdate」の直前ではなく、ボックスの1つに書き込もうとするとすぐに起動します
beforeUpdate と afterUpdate の間のスペースにかなり大きな穴があるようです。ここで試みているのはそれほど複雑な操作ではないと思いますが、おそらく長い間取り組んできたので、より簡単な解決策を見逃してしまったのでしょう。挿入操作をキャンセルするか、開いているレコードでフォームを閉じていることをユーザーに確認する必要があります。彼らがヒットした場合、インサートは発火しません。
また、タイムラインの関係で、ADO 用に書き直す気もありません。いくつかのフォームをすばやくまとめて、それを完了する必要があります。ADO挿入用に設定したくないフィールドもたくさんあります。それらはすべて構築されていますが、私はこの 1 つの問題に悩まされており、この解決策をすべてのフォームに適用する必要があります。
TLDR - ユーザーがテキストを入力してフォームを終了しようとした場合に、データバインドされたフォームの挿入を停止します。
解決策の編集: フォームをモーダル/ポップアップに変更し、クローズを無効にします。クローズを処理するボタンを追加します。ブールフラグを追加
Private Sub Form_BeforeInsert(Cancel As Integer)
NR = True
End Sub
次に、閉じるボタンのコードを追加します。
Private Sub cmdClose_Click()
Dim msgRes As VbMsgBoxResult
If NR Then
msgRes = MsgBox("Do you want to save the current new record?", vbYesNoCancel, "Closing form...")
If msgRes = vbYes Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close
ElseIf msgRes = vbNo Then
Me.Undo
DoCmd.Close
End If
End If
DoCmd.Close
End Sub