• ベストアンサー

[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と表示されます。 通常のエラーではないので、感知することはできないのでしょうか。 ご存知の方はアドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1
souitirou1
質問者

お礼

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

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

私自身はAccess一辺倒なのですが・・・(汗) Err.Numberによるトラップができないとのことですが、 既に「子レコードを持つレコードを消そうとしたとき」と 原因を把握されているのでしたら、それを検知する コードを組む、という対応ではまずいのでしょうか。 (もちろん、エラーコードでの対処の方が手軽では  あるのですが(汗)) 「子レコードの削除」を求める、ということは、当該 テーブルの参照は可能になっているものと思います。 ですので、そのテーブルに対し、結合キーの値が削除 対象と同じものの有無を確認し(→リンクテーブルとして 設定済みならDCount関数が適用できますし、 そうでなければRecordsetを開いてRecordCountを 確認してもOk)、該当レコードがあればMsgBoxを表示、 なければ削除を実行、とすれば、ご質問のエラーは 回避できるのではないでしょうか。 (子側テーブルが複数だったとしても、合算で判定するなり、  「以下のテーブルに子レコードがあります」といった  MsgBoxにするなり、といった対処もありえるかと) 「それはわかっているが、コードが長くなるので避けたい」 というのがご質問の主旨でしたらすみません(汗)

souitirou1
質問者

お礼

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

関連するQ&A