- ベストアンサー
Access2003でスタック領域不足エラー
- 帳票形式フォームの参照整合性設定された表形式サブフォームから全レコードを削除する際に、スタック領域が不足してエラーが発生します。
- エラーの原因としては、連鎖削除設定して主レコードを削除する方法しかないことが考えられます。
- スタック領域不足エラーを回避するためには、削除処理の回数を制限するなどの対策が必要です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
削除クエリーの場合、サブフォームに#Deletedと表示 me!サブフォーム名.form.requery じゃダメですかね。ゴミレス勘弁。 dao.recordset の件は分かりません。 調べる気力も体力もスキルも。。。 Access2010のヘルプでは Sub SupplierID_AfterUpdate() Dim rst As DAO.Recordset Dim strSearchName As String Set rst = Me.Recordset strSearchName = CStr(Me!SupplierID) rst.FindFirst "SupplierID = " & strSearchName If rst.NoMatch Then MsgBox "Record not found" End If rst.Close End Sub ともなっています。 Sub CheckRSType() Dim rs as Object Set rs=Forms(0).Recordset If TypeOf rs Is DAO.Recordset Then MsgBox "DAO Recordset" ElseIf TypeOf rs is ADODB.Recordset Then MsgBox "ADO Recordset" End If End でRecordsetのどちらを使っているか判別できるようです。 投稿用にタブインデントは全角スペースにしています。
その他の回答 (1)
- nicotinism
- ベストアンサー率70% (1019/1452)
レコードセットを回して順次削除は行ったことがないのですが MyRs.MoveFirst Do Until MyRs.EOF MyRs.Delete MyRs.MoveNext 'ここでエラーとなります。 Loop を考えるに Delete しても実際には削除フラッグのようなものが立って いるだけのような雰囲気ですね。 もしレコードが存在しないのなら、Current Recordの位置はどこになるのでしょう。 削除したレコードの次? なら、その後で MoveNext してるのでレコードは飛び飛びに削除されてよさそうな。 削除したレコードの前? なら、最初のレコードを削除した場合にどこが Currentになるのでしょう。 なのでどのタイミングかは不明ですがある段階まではAccess内部で記憶していると 考えてもよさそうです。 で、この記憶領域が不足したのかな?と。 削除クエリで行えませんか。 Currentdb.Execute("delete * from table where ○=" & forms!▽!□) みたいな感じで。
補足
早速ご検討頂き有難う御座います。 うまくいく時は、全行削除されており、飛び飛び削除状態にはなっておりません。 うまくいかない時は、下の方の1-2行を残した状態となっていました。 削除クエリーの場合、サブフォームに#Deletedと表示されて見た目が悪く、フォームの再表示が必要になるので、この方法をトライしました。 今回、レコードセットオブジェクト変数をDAO.Recordsetと宣言しましたが、対象となるレコードセットが、データベースではなく、サブフォームに属するプロパティーでしたので、DAO.をはずし、Recordsetのみにして確認したところ、エラーが起こらなくなりました。このような区別があるのでしょうか?当面これで様子をみてみたいと思います。
補足
ご教示頂いた方法でRecordsetのタイプを確認したところ、DAO Recordsetとなりました。現状DAO.を除いた宣言でエラーが出ないようですので、これで対応致します。種々お調べ頂き有難う御座いました。