アクセスのレコードの更新直後、他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で接続
<プログラム内容の抜粋>
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("T_確認テーブル", dbOpenDynaset, dbDenyRead)
rs.MoveFirst
If rs!アクセス中フラグ = True Then ' → または”if rs!アクセス中フラグ Then”でも同じ
MsgBox "既に他者が使用", vbExclamation, "入力依頼"
else
rs.movefirst
rs.edit
rs!アクセス中フラグ=True ' フラグをセット
rs.update
End If
db.Close
Set db = Nothing
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
ご多忙の中お教え頂心より感謝致します。
早めの夏休みを頂、PCとを操作できない生活をしていて、返答とお礼が遅れましたことお詫びいたします。
さて、本題ですが、お教え頂いたプログラムと現象が発生するプログラムを比較し、1行毎に詰めたところ、”DBEngine.Idle dbRefreshCache”が抜けていたことが当現象の原因と判明しました。
また、書き込み方が判らず、補足へ書き込みご迷惑をおかけ致しました。
これで、先へ進めます。
誠に有難う御座いました。
No.2
- 回答日時:
>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
No.1
- 回答日時:
キャッシュには入っても、データ.mdbのテーブルが書き換えられていないのでは?
フラグの変更時にトランザクション処理を行えば解決しそうな?
http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?n …
この回答への補足
お教え頂き、トランザクションの設定などを行い、簡単なプログラムでは改善し喜びましたが、200件以上のデータが有るプログラム(作成中)では、やはり、同現象が発生しました。
再度Netで調べたところ、以下URLに同じ様な質問が有りました。(調査不足でした)
アクセスの問題なのでしょうか。
アクセスでは複数のプログラム.mdbとサーバに置いたデータ.mdbで使用するのはNGなのでしょうか。
http://bbs.wankuma.com/index.cgi?mode=al2&namber …
トランザクションを設定することで回避できました。
ご多忙の中有難う御座いました。
キャッシュが有る事すら知らず、トランザクションなどについては未知の世界へ一歩踏み入れたような感じです。
アクセスの勉強をして参ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
【お題】 ・存在しそうで存在しないモノマネ芸人の名前を教えてください
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
あなたの習慣について教えてください!!
あなたが習慣だと思って実践しているものを共有してくださいませんか? 筋肉トレーニングでも朝シャワーでも、あなたが習慣だなと思えば何でも構いません
-
Access サブフォームでの選択行の取得
その他(データベース)
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
ACCESS ADOでupdateが効かない
その他(データベース)
-
-
4
フォームで入力しても反映されない
Access(アクセス)
-
5
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
6
コンボボックスで選択したものをクリアーしたい(アクセス VBA)
Access(アクセス)
-
7
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
8
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
9
ACCESSのフォーム、開くんですが、見えないようにするには
Access(アクセス)
-
10
Accessのフォームにて、詳細行のボタンを行の内容により、表示/非表
その他(Microsoft Office)
-
11
Access フォームのデータがテーブルに反映されない
Access(アクセス)
-
12
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
-
13
ACCESS VBA でのエラー解決の根拠がわかりません エラー「イベントプロパティに指定した式・・
Access(アクセス)
-
14
Accessのクエリで、replace関数を使い、データの中にある”をブランクに置き換えたいのですが
Access(アクセス)
-
15
Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に
Access(アクセス)
-
16
アクセスでテーブルの変更内容をフォームに反映させるには?
その他(データベース)
-
17
Access VBA Me.Requery レコードは削除されています エラー
その他(データベース)
-
18
accessでフィールド追加のあとフォームに反映されない
Access(アクセス)
-
19
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
20
アクセスVBAのMe!と[ ]
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
アクセス レコードセットを更...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
PostgreSQLのパフォーマンスに...
-
このISAMでは、リンクテーブル・・
-
Oracleで上書きImportはできま...
-
Accessの処理速度を速めるため...
-
マテリアライズドビューとスナ...
-
住所のDBテーブル、マスターの...
-
MS Accessを共有した際にファイ...
-
仕事のミス:本番データの削除→...
-
構文エラー : 演算子がありませ...
-
ACCESS2010の最適化が中断される
-
MS Accessの列と行の入れ替えを...
-
「クリップボードにコピーされ...
-
ビューのソートについて
-
飲み会で、座敷orテーブルどち...
-
SELECT 文の NULL列は?
-
テーブルリンク リンク元を知...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
アクセス レコードセットを更...
-
テーブルで一番古いレコードだ...
-
ビューのソートについて
-
Oracleで上書きImportはできま...
-
このISAMでは、リンクテーブル・・
-
構文エラー : 演算子がありませ...
-
マテリアライズドビューとスナ...
-
accessでレコード更新直後の反...
-
ORA-01401が表示され、データが...
-
処理の途中で停止させ、再開さ...
-
Access VBAからエクセルに出力...
-
住所のDBテーブル、マスターの...
-
Accessでの稼働日数計算の方法
-
MS Accessを共有した際にファイ...
-
同一テーブルのデータを参照し...
-
結合テーブルでINSERTする方法...
-
ACCESSで容量が50MBになった...
-
「クリップボードにコピーされ...
おすすめ情報