2011-01-10 22 views
0

私はAccessデータベースのフロントエンドを持っており、現在のレコードを削除するためのボタンをフォームに配置しようとしています。私はレコードを削除するには、次のVBAコードを使用:レコードを削除しようとしたときにエラー2501

If Me.NewRecord Then 
    Me.Undo 
    Exit Sub 
End If 

DoCmd.RunCommand acCmdDeleteRecord 

Me.Requery 
Me.Refresh 

私はフォームをデータベースに挿入されたレコードでこれを実行すると、それはのDoCmdに実行時エラー「2501」を返します。しかし、データベースにすでに存在していたレコードで実行すると、コードは意図したとおりに完了します。

さらに、他の誰もこのデータベーステーブルにアクセスしていません。私は1つのフォームしか開いていませんでした。

アクセス時に手動でリンクテーブルから削除する場合、同じエラーが発生しましたが、SQL Server Management Studioを使用してデータベースから削除できました。

これは何が起こるのでしょうか?

EDIT

私はいくつかのより多くの調査を行なったし、私はどちらかのアクセスを使用して、ベーステーブル内の新しいレコードを編集することができませんことを見出しました。別のユーザーがレコードを変更したというエラーが表示されます。

+0

ユニークなキーをお持ちですか?リンクを削除して再作成する場合、同じ問題がありますか? – Fionnuala

+0

このテーブルは、良好な主キーで完全に定義されています。 私はテーブルを再リンクしようとしましたが、私はまだ同じ問題があります。 – Rister

+0

テーブルにタイムスタンプフィールドがありますか? –

答えて

1

テーブルにタイムスタンプフィールドを持つことをお勧めします(SSMAアシスタントは、Accessからアップサイズするためにこれを使用すると、これをすべてのテーブルに追加しますが、間違いなく推奨します) 。私はこのように書くでしょう:

If Me.NewRecord Then 
    Me.Undo 
    Else 
    DoCmd.RunCommand acCmdDeleteRecord 
    Me.Requery 
    End If 

最新のデータをすでに持っているので、再クエリー後にリフレッシュは冗長です。

Exit Subを使用すると、排他的ではないガード句に役立ちますが、この場合、既存のレコードを削除するか、新しいレコードを元に戻すかどちらかがあります。これは、単一のIf/Then/Elseブロック内で処理することができ、サブルーチンの出口点が1つしかないため、将来的にコードが複雑になる場合に役立ちます。

+0

タイムスタンプを追加して問題を修正しました。 私はこれまでにこの問題に遭遇していませんか? – Rister

+0

Access/Jet/ACEテーブルをSQL Serverにアップサイジングしていれば、それはアップサイジングの推奨事項の一部です。これは、Jet/ACEが更新されたものと何がないのかを記録する唯一の方法であるため、バインドされたフォームの必要性です(すべてのフィールドの比較が不十分で、Nullがあると信頼できません)。 –

関連する問題