電子書籍の厳選無料作品が豊富!

クライアント側にMicrosoft Access 2010、サーバ側にSQL Server 2008 R2を使った業務ソフトを開発しています。
少々込み入った質問をしますが、お付き合いください。

帳票フォームである列のデータをdeleteキーで削除しようとすると、
「DELETEステートメントはREFERENCE制約"xxxx"と競合しています。競合が発生したのは、データベース "zzzzz"、テーブル"yyyyy"です。」
というメッセージが出ることがあります。

このメッセージですが、子レコードを持つレコードを消そうとした時に出ることはわかっています。

今回、このメッセージを出さずに、「子レコードを消してから親を消してね」というメッセージに差し替えたいと考えています。
既定のメッセージはシステム的でわかりづらいので。

しかし、イベントプロシージャで上記メッセージを感知する方法がわかりません。

Private Sub Form_Delete(Cancel As Integer)
~~~~~
End Sub

というサブプロシージャの中でどうコードを書くか色々調べたのですが、
どうやってもメッセージは出てきてしまいます。

Err.Numberも0と表示されます。
通常のエラーではないので、感知することはできないのでしょうか。


ご存知の方はアドバイスお願いします。

「[Access]削除時のエラーメッセージ」の質問画像

A 回答 (2件)

    • good
    • 0
この回答へのお礼

まさにこのようなページを探していました。
おかげで10分で解決できました。
ありがとうございます。

お礼日時:2011/06/28 13:10

私自身はAccess一辺倒なのですが・・・(汗)



Err.Numberによるトラップができないとのことですが、
既に「子レコードを持つレコードを消そうとしたとき」と
原因を把握されているのでしたら、それを検知する
コードを組む、という対応ではまずいのでしょうか。
(もちろん、エラーコードでの対処の方が手軽では
 あるのですが(汗))


「子レコードの削除」を求める、ということは、当該
テーブルの参照は可能になっているものと思います。

ですので、そのテーブルに対し、結合キーの値が削除
対象と同じものの有無を確認し(→リンクテーブルとして
設定済みならDCount関数が適用できますし、
そうでなければRecordsetを開いてRecordCountを
確認してもOk)、該当レコードがあればMsgBoxを表示、
なければ削除を実行、とすれば、ご質問のエラーは
回避できるのではないでしょうか。
(子側テーブルが複数だったとしても、合算で判定するなり、
 「以下のテーブルに子レコードがあります」といった
 MsgBoxにするなり、といった対処もありえるかと)


「それはわかっているが、コードが長くなるので避けたい」
というのがご質問の主旨でしたらすみません(汗)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
最後にありますように、時間をかけたくない、コードも長くしたくない、というのが実情でして…。
今回はyorozu_yaさんのアドバイスを使わせてもらいました。

お礼日時:2011/06/28 13:11

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