• ベストアンサー

[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

  • ADODBのRecordset.Deleteのエラーについて誰か助けてください!!

    データベースはAccess2000 プロバイダはJet4.0です。 (1)まずレコードがない状態でレコードを追加します。 (2)そのまま削除ボタンを押します。 (3)エラーが発生します。 「行が見つからなかったため更新できません。列の値は最後に読み込   まれた後で変更された可能性があります。」 (4)終了し起動します。 (5)なぜかレコードが1件あります。(削除が失敗?) (6)削除します。メッセージボックスがでて削除成功します。  このときレコードはありません。(データグリッド上) (7)レコードを追加します。成功します。 (8)削除するとデータグリッド上ではレコードがあるのに  メッセージボックスが出て追加を促してきます。 (9)追加して削除するとまたメッセージボックスが出てきます。  このときデータグリッド上のレコードは増えています。  (8)~(9)が繰り返しおきます。 その後vbを終了させてAccessで内容を確認するとレコードが増えていますが、 顧客IDフィールドの増加処理がされていなくすべて1になっています。 Update,Addnew,Deleteメソッドの理解が不十分なのか、カーソルの位置 の理解不足なのかわかりません。 どなたか手を貸してください。 Private Sub cmdDelete_Click() If Rs.RecordCount = 0 Then MsgBox "レコードがありません。追加してください。", vbOKOnly Exit Sub End If Rs.Delete If Rs.RecordCount = 0 Then MsgBox "レコードがありません。追加してください。", vbOKOnly Exit Sub End If Rs.MoveNext If Rs.EOF Then Rs.MoveLast End If End Sub Private Sub cmdNew_Click() Rs.AddNew "顧客ID", "増加する処理済" End Sub Private Sub cmdUpdate_Click() Rs.Update End Sub

  • access サブフォーム間の連動について

    Access2013について メイン親単票フォーム上に連動する二つのサブフォームを配置させました。 内一つは帳票、もう一つは単票にし、帳票からレコードを選択するとデータ詳細が単票側が連動するまで至りましたが、ここでサブフォーム帳票を並べ替えや抽出を実行すると、サブフォーム間の連動が出来なくなり、解決に困っております。 解決方法をご存知の方、お力添え願います。 親フォームに VBA Private Sub Form_Open(Cancel As Integer) Set Me.SubForm2.Form.Recordset = Me.SubForm1.Form.Recordset End Sub 抽出方法としては帳票サブフォーム上からとメインフォーム上からの実行までを試しておりますが、いずれも抽出後にサブフォーム間の連動が出来なくなってしまう状況です。 お力添え、宜しくお願いいたします。

  • サブフォームのレコード削除

    サブフォーム(帳票)のレコード削除をしたいのですが、レコードセクレタをクリックして選んだレコードではなく、テーブルの最初のレコードから順番に削除されてしまいます。 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim ret As Integer '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset rs.Open "T支店", cn, adOpenKeyset, adLockOptimistic '削除 ret = MsgBox("表示中のレコードを削除しますか?", vbYesNo + vbQuestion, "削除") Select Case ret Case vbYes rs.Delete Me!sub支店.Form.Requery Case vbNo Exit Sub End Select '終了 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing WINDOWS98、ACCESS2000をしようしています。よろしくお願いします。

  • HPがwww.で表示されない。エラー

    お名前.comで独自ドメインを取得し、ロリポップをサーバーで使ってHP運用しています。 HPのアドレスが「http://example.com」では表示されるのに、「http://www.example.com」ではエラーになってしまいます。 これはサーバー側の問題ではなくドメイン側の問題なんでしょうか? 初心者で分かりませんが、ドメイン取得会社でDNSレコードの設定でサブドメインwww.を設定するのですか? ちなみに今DNSレコードのページは空欄です。

  • サブフォームの帳票のレコードを編集している時

    ここに、親フォームと子フォーム(サブフォーム)があって 子フォームのレコードソースは、Workテーブルとします。 子フォームを編集・新規レコード追加すると、 親フォームの保存ボタン処理で、子フォームのレコード内容をWorkから、元テーブルに更新をかける知りをつくろうと考えています。 この時、 子側の帳票のレコードを編集したり、新規レコードを追加している時には ■『親側で、別のレコードに移動出来ないようにし、親側にある「保存」ボタンを押して、上記の処理をしたあとに、親側で別レコードに移動できる』 ような作りにしたいです。 これを実現するために、上の■『・・・』を実現できるようにするのには、どのようにしたら良いでしょうか? よろしくお願いします。

  • クリレポでブランクのページが印刷される問題

     お世話になっております。  顧客にC/Sで業務システムを導入済みですが、帳票で枠だけが印刷されてしまう問題が発生しております。 [開発環境] <サーバ> Windows Server 2003 Oracle 9i Server <クライアント> Windows XP SP2 VB.NET 2002 (+ Crystal Report) Oracle 9i Client [顧客側環境] <サーバ> Windows 2000 Server Oracle 9i Server <クライアント> Windows XP SP2 Oracle 9i Client  業務システムの概要は、VBで作成した画面の[印刷]ボタンを押せば、ワークテーブルを一旦クリア(DELETE)し、その後、該当レコードをINSERTし、そのワークテーブルを参照している帳票4種類が印刷されるようになってます。  問題は、4番目の帳票で、レコードが入ってない枠だけの紙が印刷されることが時々あります。(昨年は1回。今年はここ2ヶ月で5回ほどに増えてます。)  考えられる原因としては、[印刷]ボタンを素早くクリックすると、一回目のクリックで作成されたレコードが、二回目のクリックでクリアされてしまうためと思いましたが、顧客はそのような操作はしてないと言ってます。  原因を特定させることができずに困ってます。  もし同様の症例で解決された方、ご教授下さい。  よろしくお願い致します。

  • Access2003でスタック領域不足エラー

    帳票形式フォームの参照整合性設定された表形式サブフォームから全レコードを削除する為、下記のモジュールを作成しました。しかし、実行すると「28:スタック領域が不足しています。」のエラー表示でフリーズ状態となってしまいます。エラーとなるのは毎回ではありません。原因と回避方法をご教示下さい。 連鎖削除設定して主レコードを削除する方法しかないのでしょうか? On Error GoTo Err_削除_Click Dim MyAnswer As Variant, MyRs As DAO.Recordset Set MyRs = Me.SubForm.Form.Recordset MyRs.MoveFirst Do Until MyRs.EOF MyRs.Delete MyRs.MoveNext 'ここでエラーとなります。 Loop Recovery_削除_Click: Set MyRs = Nothing Exit_削除_Click: Exit Sub Err_削除_Click: If Err.Number = 3021 Then Resume Recovery_削除_Click Else MsgBox Err.Number & ":" & Err.Description Resume Exit_削除_Click End If

  • データベースメールのプロファイルが削除できません。

    SQL Server 2005 Workgroup Edition で、データベースメールのプロファイルを削除しようとすると、エラーになってしまいます。 レポートは下記です。 ・------------------------------------------------------------・ - プロファイル 'プロファイル名' を削除します (エラー) メッセージ プロファイル 'DBmail' を削除できません。 ------------------------------ ADDITIONAL INFORMATION: MailProfile 'DBmail' の削除に失敗しました。 (Microsoft.SqlServer.Smo) ヘルプを表示するには http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=9.00.3042.00&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=削除+MailProfile&LinkId=20476 をクリック ------------------------------ Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.ConnectionInfo) ------------------------------ @force_delete はプロシージャ sysmail_delete_profile_sp のパラメータではありません。 (Microsoft SQL Server、エラー: 8145) ヘルプを表示するには http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.1406&EvtSrc=MSSQLServer&EvtID=8145&LinkId=20476 をクリック ・------------------------------------------------------------・ エラー番号から検索しても解決方法がわかりませんでした。 どなたかご教授お願いいたします。

  • ASP.NET:複数結合テーブルのデータ変更方法について

    ASP.NET:複数結合テーブルのデータ変更方法について こんにちは。 現在Visual Studio2008(ASP.NET、ADO.NET) +SQL Server2005 Stdの環境でデータベースを参照したWebアプリケーションを作成しています。 GridViewを使い、データベースの内容を表示し、修正や追加、削除を行いたいと思っています。 (SQLのUpdate,Insert,Deleteに該当) 主キーが設定された単独のテーブルに対しては、GridView内のデータソースでデータベースを選び、 該当のテーブルを選択。その後「INSERT,UPDATEおよびDELETEステートメントの作成」オプションを選ぶことでこれらの変更方法が簡単に実装できるのを確認しております。 しかし、主キー外部キーの関係を持つ2つ以上のテーブルを結合したものに関してこれらの変更を行う場合は通常どのようにするのでしょうか。 何かヒントになるキーワードや参考になるコードを教えていただけないでしょうか? 単独のテーブルの時と同じく、結合したテーブルデータ(ビューに該当)をGridViewに表示し、そのGridView上で変更を行いたいと思っています。 SQL Server側でこれらのテーブルを結合したViewを作成し、これを選ぶことでGridViewに表示する事が可能なのは確認したのですが、やはり「INSERT,UPDATEおよびDELETEステートメントの作成」オプションは選択できませんでした。 以上よろしくお願いいたします。

  • 100万件レコードdelete

    お世話になります SQL Serverで、 100万件のレコードを削除したいのですが どのような方法が効率よいでしょうか また、メモリ負荷など、クライアント側から分かるような実行計画とかは ありませんでしょうか? 1.100万件を1回でdelete 2.100万件を複数回に分けてdelete 3.100万件を1行ずつキー指定でdelete(deleteを100万回実行) 100万件deleteしてる場合も、他処理でレコードが登録、更新される可能性が高いため、 そちらの処理がタイムアウトなどのエラーにならないようにしたいです 詳しい方に聞いたところ、 delete発行する際に、メモリにアクセスしてるので、 3だとそれが単純計算で100万倍になるので、負荷が高いのでは? という事でした。 ご教授の程、よろしくお願い致します