2016-05-10 15 views
0

フォーム内にサブフォームがあります。既定では、サブフォーム内のレコードを変更すると、サブフォーム外をクリックするとレコードが自動的に保存されます。フォームとサブフォームに手動でレコードを保存するボタンをメインフォームに追加したので、サブフォーム出口で保存をキャンセルして書き込みの競合を回避しました。Access 2013のサブフォームの変更をキャンセルします。

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Me.Undo 
    Cancel = True 
End Sub 

このコードでは、サブフォームの外側をクリックするだけで、保存がキャンセルされるだけでなく、サブフォームに入力したものもクリアされます。つまり、最初にサブフォームの変更を取り消すことなくフォームを保存することはできません。

サブフォームの自動保存をキャンセルして、メインフォームを終了するまで編集を続けるにはどうすればよいですか?

答えて

4
Me.Undo 

は、(サブ)フォームのデータ編集を元に戻します。その行を削除するだけです。

この

Cancel = True 

は更新をキャンセルするのに十分です。

要件の次の部分は、解決するのがはるかに困難です。 Accessでデータにバインドされたフォームを残すと、の変更がに保存されます。

これを防ぐには、2つの方法があります。

1.)いずれかのレコードソースにバインドされていないアンバウンドフォームを使用してください。クエリ/レコードセットを使用してデータを読み取り、フォームのコントロールに書き込んだり、後でVBAを使用して変更した値をデータベースに書き込む必要があります。 - これは、連続/データシートフォームでは機能しません。

2)または、メインテーブルと同じ構造のテンポラリテーブルを作成し、サブフォームをそのテンポラリテーブルにバインドします。あなたの(メイン)フォームが開いたら、サブフォームのすべての関連レコードを一時テーブルにコピーします。メインフォームが閉じられたり終了したりすると、実際のデータテーブルが一時テーブルからの変更で更新されます。

+1

フォームに発生するすべてのデータイベントをトランザクションでラップし、フォームのイベントに基づいてトランザクションを明示的にコミット(またはロールバック)することもできます。 –

+1

第4のオプション:切断されたレコードセットにフォームをバインドします。これにより、連続フォームを作成し、複数のレコードに対してコミットされていない値を保持し、明示的に書き込みまたは拒否することができます。切断されたレコードセットでは、ADOを使用する必要があります.ADOを使用する必要がある場合は素晴らしいですが、学習曲線が少しあります。 –

関連する問題