• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:accessでレコード更新直後の反映について)

accessでレコード更新直後の反映について

このQ&Aのポイント
  • アクセスのレコードの更新直後、他PCから該当レコードを読むと更新が反映されていません。回避方法をお教え下さい。
  • ”データ.mdb”をServerへ置き、複数のPCの”プログラム.mdb”から”データ.mdb”のテーブルをリンクし使用する予定です。しかし、PC-Aの”プログラム.mdb”でテーブルを更新した直後PC-Bの”プログラム.mdb”からテーブルを読み込むと更新が反映されていません。しかし、更新後約2秒以上経過した後に読み込むと更新が反映されています。試行錯誤しましたが改善しません。
  • Access2003で”データ.mdb”と”プログラム.mdb”を作成しAccess2010とAccess2003で使用。T_確認テーブルに”Yes/No型”で”アクセス中フラグ”を設定。ServerとPC-AとPC-BはLANで接続。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

補足に気付かず遅くなりました、すみません。 コントロールの位置関係がよくわからないのですが、大雑把な流れは以下の様かと思います。 ※印のところが不明点です。 このサイトではTabインデントが使えないので全角スペースで代用しています。 Private Sub 予約ボタン_Click() On Error GoTo errH   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim WSP As Workspace   Dim reTryCount As Integer   Set db = CurrentDb   Set WSP = DBEngine.Workspaces(0) reTry:   '※Me!機材番号txtコントロール とこのコマンドボタンが同じフォームにあると仮定   Set rs = db.OpenRecordset("SELECT * FROM T_管理テーブル WHERE 機材番号='" & Me!機材番号txt & "'" _     , dbOpenDynaset, dbPessimistic)   DBEngine.Idle dbRefreshCache   If rs.EOF And rs.BOF Then     MsgBox "該当する機材番号はありません", vbOKOnly     Me!機材番号txt.SetFocus '     GoTo atoShimatu   End If   If rs!選択フラグ = True Then     MsgBox rs!機材番号 & "は既に他者に貸出中です。", vbExclamation, "入力依頼"     Me!機材番号txt.SetFocus     GoTo atoShimatu   End If   WSP.BeginTrans 'トランザクション処理開始   rs.Edit 'ここでロック開始     rs!選択フラグ = True '選んだことで選択フラグをセット     rs!担当者 = Forms!F_新規貸出フォーム!担当者 'メインフォームの予約担当者をセット     rs!予約日時 = Forms!F_新規貸出フォーム!年月日 'メインフォームの予約日をセット '        ・ (省略) '  MsgBox "lock" '確認用です   rs.Update 'ロック解除される   WSP.CommitTrans dbForceOSFlush 'トランザクション処理終了   rs.Close   Set rs = db.OpenRecordset("T_TMPテーブル", dbOpenDynaset) '  rs.AddNew '    rs.機材番号= ・・・・(省略) '        ・(省略) '        ・ '    rs.Update 'ここで サブフォームのリクエリーを実施 'DoCmd.GoToControl "検索" ← コントロールをメインフォームへ移動しようとしています。 '※↑コマンドボタンはサブフォームにおいてあるのかな? 'DoCmd.Requery "機材詳細表示リスト" '※以下二行の説明がほしいです。PS.メインフォーム名とサブフォーム名も。 'DoCmd.Requery "予約済み機材表示" errH:   Select Case err.Number     Case 0 '正常処理の場合、何もしない            Case 91 'rs の閉じエラー       err.Clear       Resume Next     Case 3218 '同時に複数から同じレコードに更新処理が掛かった場合       err.Clear       WSP.Rollback       MsgBox "他の人によって更新中です。", vbOKOnly       reTryCount = reTryCount + 1              If reTryCount < 2 Then         Resume reTry       Else         MsgBox "データを更新できませんでした。"       End If     Case Else       Debug.Print err.Number, err.Description       MsgBox err.Number & vbCrLf & err.Description   End Select    atoShimatu:   rs.Close: Set rs = Nothing   Set WSP = Nothing   db.Close: Set db = Nothing End Sub

hishina
質問者

お礼

ご多忙の中お教え頂心より感謝致します。 早めの夏休みを頂、PCとを操作できない生活をしていて、返答とお礼が遅れましたことお詫びいたします。 さて、本題ですが、お教え頂いたプログラムと現象が発生するプログラムを比較し、1行毎に詰めたところ、”DBEngine.Idle dbRefreshCache”が抜けていたことが当現象の原因と判明しました。 また、書き込み方が判らず、補足へ書き込みご迷惑をおかけ致しました。 これで、先へ進めます。 誠に有難う御座いました。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

>200件以上のデータ と >有るプログラム(作成中) の関係は? 作成中で構いませんので 関係ありそうなテーブルの説明とコードを提示できませんか? >アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。 NGではないと思いますが色々と神経細かくやっていかないと・・・。 実際に15人くらいで使っていますし。 ただ、そんなに面倒ならSQLServer やMySQLを使えば 余計なことに労力を使わなくて済むのに・・という意見が多いのは確かです。

hishina
質問者

補足

T_管理テーブルのレコードをメインフォームで絞込み、サブフォーム(リスト型)で表示、対象レコードの[選択]ボタンを押すと「選択フラグ」がTrueへ変更 他端末で同じレコードを選択しボタンを押すと「選択フラグ」をチェックしTrueの場合はMSGを表示し操作を終了させる予定です。これで、重複選択を防ぐつもりでした。 関連するテーブルとコードは以下の通りです。 データ量を減らしても同様なため、量には関係なくプログラムの作成に問題が有ると思っています。 WSP.BeginTransとWSP.CommitTrans dbForceOSFlushの位置は色々と変えて試して見ました。 AccessとVBAについて初心者のため、おかしなプログラムを作成していますのでご理解下さい。 ネットの説明を見ながら悪戦苦闘し作成してます。 T_管理マスターテーブル ← サーバーに有るデータ.mdb内のテーブル。以下項目は一部です。   管理番号:オートナンバー型(主キー)   機材番号:テキスト型   機材名:テキスト型   担当者:テキスト型   予約日:日付/時刻型   貸出日:日付/時刻型   返却日:日付/時刻型   選択フラグ:Yes/No型 ← False=未予約 True=予約済み    ・   ・ T_TMPテーブル ← 各端末のプログラム.mdb内に有るテーブル。最終処理終了後テーブルのデータは削除   管理番号:整数型   機材番号:テキスト型   貸出日:日付/時刻型   返却日:日付/時刻型   Private Sub 予約ボタン_Click()   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim WSP As Workspace   Set db = CurrentDb   Set WSP = DBEngine.Workspaces(0)   Set rs = db.OpenRecordset("T_管理テーブル", dbOpenDynaset, dbDenyRead)   rs.MoveFirst   Do Until rs.EOF    If rs!機材=Me!機材番号 Then      Exit Do    Else     rs.MoveNext    End If   Loop   If rs!選択フラグ = True Then     MsgBox "既に他者が選択しています。", vbExclamation, "入力依頼"     rs.Close: Set rs = Nothing     db.Close: Set db = Nothing     Exit Sub   End If   DBEngine.Idle dbRefreshCache WSP.BeginTrans 'トランザクション処理開始   rs.Edit     rs!選択フラグ = True '選んだことで選択フラグをセット     rs!担当者 = Forms!F_新規貸出フォーム!担当者 'メインフォームの予約担当者をセット     rs!予約日時 = Forms!F_新規貸出フォーム!年月日 'メインフォームの予約日をセット         ・ (省略)   rs.Update   WSP.CommitTrans dbForceOSFlush 'トランザクション処理終了   Set rs = db.OpenRecordset("T_TMPテーブル", dbOpenDynaset, dbDenyRead)   rs.AddNew     rs.機材番号= ・・・・(省略)         ・(省略)         ・     rs.Update   ’ここで サブフォームのリクエリーを実施 DoCmd.GoToControl "検索" ← コントロールをメインフォームへ移動しようとしています。 DoCmd.Requery "機材詳細表示リスト" DoCmd.Requery "予約済み機材表示" Set WSP = Nothing rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

キャッシュには入っても、データ.mdbのテーブルが書き換えられていないのでは? フラグの変更時にトランザクション処理を行えば解決しそうな? http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?no=1450&reno=94&oya=94&mode=msgview

hishina
質問者

お礼

トランザクションを設定することで回避できました。 ご多忙の中有難う御座いました。 キャッシュが有る事すら知らず、トランザクションなどについては未知の世界へ一歩踏み入れたような感じです。 アクセスの勉強をして参ります。

hishina
質問者

補足

お教え頂き、トランザクションの設定などを行い、簡単なプログラムでは改善し喜びましたが、200件以上のデータが有るプログラム(作成中)では、やはり、同現象が発生しました。 再度Netで調べたところ、以下URLに同じ様な質問が有りました。(調査不足でした) アクセスの問題なのでしょうか。 アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=20351&KLOG=39