- ベストアンサー
accessでレコード更新直後の反映について
- アクセスのレコードの更新直後、他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で接続。
- みんなの回答 (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
その他の回答 (2)
- nicotinism
- ベストアンサー率70% (1019/1452)
>200件以上のデータ と >有るプログラム(作成中) の関係は? 作成中で構いませんので 関係ありそうなテーブルの説明とコードを提示できませんか? >アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。 NGではないと思いますが色々と神経細かくやっていかないと・・・。 実際に15人くらいで使っていますし。 ただ、そんなに面倒ならSQLServer やMySQLを使えば 余計なことに労力を使わなくて済むのに・・という意見が多いのは確かです。
補足
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)
キャッシュには入っても、データ.mdbのテーブルが書き換えられていないのでは? フラグの変更時にトランザクション処理を行えば解決しそうな? http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?no=1450&reno=94&oya=94&mode=msgview
お礼
トランザクションを設定することで回避できました。 ご多忙の中有難う御座いました。 キャッシュが有る事すら知らず、トランザクションなどについては未知の世界へ一歩踏み入れたような感じです。 アクセスの勉強をして参ります。
補足
お教え頂き、トランザクションの設定などを行い、簡単なプログラムでは改善し喜びましたが、200件以上のデータが有るプログラム(作成中)では、やはり、同現象が発生しました。 再度Netで調べたところ、以下URLに同じ様な質問が有りました。(調査不足でした) アクセスの問題なのでしょうか。 アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。 http://bbs.wankuma.com/index.cgi?mode=al2&namber=20351&KLOG=39
お礼
ご多忙の中お教え頂心より感謝致します。 早めの夏休みを頂、PCとを操作できない生活をしていて、返答とお礼が遅れましたことお詫びいたします。 さて、本題ですが、お教え頂いたプログラムと現象が発生するプログラムを比較し、1行毎に詰めたところ、”DBEngine.Idle dbRefreshCache”が抜けていたことが当現象の原因と判明しました。 また、書き込み方が判らず、補足へ書き込みご迷惑をおかけ致しました。 これで、先へ進めます。 誠に有難う御座いました。