- ベストアンサー
[Access]削除時のエラーメッセージを変更
クライアント側に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と表示されます。 通常のエラーではないので、感知することはできないのでしょうか。 ご存知の方はアドバイスお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
私自身はAccess一辺倒なのですが・・・(汗) Err.Numberによるトラップができないとのことですが、 既に「子レコードを持つレコードを消そうとしたとき」と 原因を把握されているのでしたら、それを検知する コードを組む、という対応ではまずいのでしょうか。 (もちろん、エラーコードでの対処の方が手軽では あるのですが(汗)) 「子レコードの削除」を求める、ということは、当該 テーブルの参照は可能になっているものと思います。 ですので、そのテーブルに対し、結合キーの値が削除 対象と同じものの有無を確認し(→リンクテーブルとして 設定済みならDCount関数が適用できますし、 そうでなければRecordsetを開いてRecordCountを 確認してもOk)、該当レコードがあればMsgBoxを表示、 なければ削除を実行、とすれば、ご質問のエラーは 回避できるのではないでしょうか。 (子側テーブルが複数だったとしても、合算で判定するなり、 「以下のテーブルに子レコードがあります」といった MsgBoxにするなり、といった対処もありえるかと) 「それはわかっているが、コードが長くなるので避けたい」 というのがご質問の主旨でしたらすみません(汗)
お礼
回答ありがとうございます。 最後にありますように、時間をかけたくない、コードも長くしたくない、というのが実情でして…。 今回はyorozu_yaさんのアドバイスを使わせてもらいました。
お礼
まさにこのようなページを探していました。 おかげで10分で解決できました。 ありがとうございます。