Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7全般 : Access 2013)
一時テーブル使用でのテーブルの移動
投稿日時: 18/10/29 09:48:11
投稿者: yamasho

お世話になります。
 
一時テーブルをレコードソースにしています。
フォームは単票形式です。
 
前のレコードに移動したいときは、
「前へ」というコマンドボタンを押して
移動できるようにしたいです。
 
いったん一時テーブルを削除、
その後前のレコードを一時テーブルに
書き込んでいます。
 
--------------------------------------------------------------------
cn.Execute "DELETE * FROM W_入金データ"
     
strSQL = "INSERT INTO W_入金データ(入金ID,日付,・・・)" _
       & " SELECT ID,日付,・・・・" _
       & " FROM T_入金データ" _
       & " WHERE ID = " & rsWk!ID
     
cn.Execute strSQL
Me.Requery
--------------------------------------------------------------------
 
1件前に移動するときは問題なくできます。
更に1件前に移動しようとすると、
「レコードは削除されています」というエラーになってしまいます。
 
一時テーブルを見るとレコードは存在しています。
Me.Requeryの直前にMsgBoxで確認しても存在しています。
 
あまりこのような使い方はしない方がいいのでしょうか?
 
 
 
 
 

回答
投稿日時: 18/10/29 10:50:34
投稿者: Suzu

yamasho さんの引用:
前のレコードに移動したいときは、
「前へ」というコマンドボタンを押して
移動できるようにしたいです。
 
いったん一時テーブルを削除、
その後前のレコードを一時テーブルに
書き込んでいます。
 
--------------------------------------------------------------------
cn.Execute "DELETE * FROM W_入金データ"
     
strSQL = "INSERT INTO W_入金データ(入金ID,日付,・・・)" _
       & " SELECT ID,日付,・・・・" _
       & " FROM T_入金データ" _
       & " WHERE ID = " & rsWk!ID
     
cn.Execute strSQL
Me.Requery
--------------------------------------------------------------------

 
1.このコードはどのイベントの処理なのですか?
 
2.このフォームは連結フォームですか?
 
3.IDは主キーですか?
 
 
連結フォームの場合以下
4.レコードソースが「W_入金データ」であり、レコードロックが掛かっていれば
  レコード削除は失敗しませんか?
  このコードを実行する前にレコードソースに空白を渡すべきです。
 
5.エラー処理の為、Execute の部分で、dbFailOnError を指定し、きちんとエラートラップをするべきです。
  単に、On Error Resume Next をしているなら、上記の部分のレコード削除失敗が無視されているのでは?
 
6.
引用:
いったん一時テーブルを削除、その後前のレコードを一時テーブルに

  IDが主キーなら提示頂いたコードでは、前後になっていません。
  整合性が取れてないので、
引用:
1件前に移動するときは問題なくできます。
以降にはお答えする事が難しいです。

回答
投稿日時: 18/10/29 12:59:11
投稿者: hatena
投稿者のウェブサイトに移動

フォームのカレントレコードを、別処理(ADOとか)で削除するとそのようなエラーがでるときがありますね。
フォームのレコードをコマンドで直接削除すればいいかと。
 
DoCmd.RunCommand acCmdDeleteRecord
 
 
ところで、1件のレコードの一時テーブルを単票フォームのレコードソースにしているのですよね。
別案の提案ですが、
現在のレコードを削除して、「前のレコード」を追加するというのではなく、
現在のレコードに「前のレコード」を上書きする方がシンプルだし、
提示のエラーも発生することはないと思います。
 

strSQL = "UPDATE W_入金データ AS W, T_入金データ AS T" _ 
       & " SET W.ID=W.ID, W.日付=T.日付,・・・・" _ 
       & " WHERE T.ID = " & rsWk!ID 
cn.Execute strSQL
Me.Requery

 
ていうか1件だけなら、非連結フォームでもいいような気が。

投稿日時: 18/10/30 11:35:26
投稿者: yamasho

お世話になります。
 
Suzu様、hatena様ありがとうございます。
 
Suzu様
 
1.このコードはどのイベントの処理なのですか?
 
「前へ」というコマンドボタンを押したときのイベントです。
 
2.このフォームは連結フォームですか?
  
一時テーブルと連結になっています。
 
3.IDは主キーですか?
 
レコードソースの一時テーブルのW_入金データは主キーではありません。
しかし一時テーブルから書き込む、
T_入金データでは主キーになっています。
 
  
4.レコードソースが「W_入金データ」であり、レコードロックが掛かっていれば
  レコード削除は失敗しませんか?
  このコードを実行する前にレコードソースに空白を渡すべきです。
  
レコードの削除は失敗していないです。
 
 
5.エラー処理の為、Execute の部分で、dbFailOnError を指定し、きちんとエラートラップをするべきです。
  単に、On Error Resume Next をしているなら、上記の部分のレコード削除失敗が無視されているのでは?
 
エラー処理はしていません。
On Error Resume Nextもしていません。
 
hatena様
 
> フォームのカレントレコードを、別処理(ADOとか)で削除すると
> そのようなエラーがでるときがありますね。
 
そうなんですね。
そういえば過去にも同じようなことがあり、
非連結で対応したことがありました。
 
> 現在のレコードに「前のレコード」を上書きする方がシンプルだし、
> 提示のエラーも発生することはないと思います。
 
ぜんぜん思いつきませんでした。
勉強になります。
 
> ていうか1件だけなら、非連結フォームでもいいような気が。
 
そうですね、非連結で対応致します。

投稿日時: 18/11/02 22:02:38
投稿者: yamasho

非連結にすることで解決しました。
 
Suzu様、hatena様、ありがとうございました。

投稿日時: 18/11/02 22:03:01
投稿者: yamasho

解決にするの忘れました。