セットアップを要約すると、Accessデータベース(accdb)バックエンドでExcel/VBAフロントエンドを使用しています。フロントエンドには、VBAを使用してデータベースとの間で読み書きを行う多数のGUIがあります。アプリケーションが起動すると、ACE DAOを使用してデータベースを開き、この '接続'はユーザーがアプリケーションを終了するまで開いたままになります。Excel to Access(ACE DAO) - 書き込みキャッシュを手動でフラッシュする方法
私が抱えている問題は、レコードの更新がすぐに他のユーザーに表示されないことです。これは、レコードの更新や変更がすぐに書き込まれるのではなくキャッシュされているためだと思います。このキャッシュをクリアして変更を適用する唯一の方法は、接続を閉じることです。
頻繁に行う必要があるため、接続を閉じることは実際には選択肢ではありません(私はいつも再接続に時間がかかります)。私は現在使用しているストリップダウンコードは次のとおりです。
は、データベースを開く:
Set oDB = DBEngine.OpenDatabase(TARGET_DB, False, False, "MS Access;PWD=" & TARGET_DB_PASS)
私はレコードセットを取得するために、Accessデータベース内のクエリ定義を使用します。私は右のDAO.QueryDefを持っていたら、私はレコードセットを取得するには、以下を呼び出します。
Set oRS = oQryDef.OpenRecordset
私はその後、私は変更したいフィールドを変更.Updateを呼び出し、レコードセットを閉じる:
With oRS
.Edit
.Fields("Record_Locked") = True
.Fields("Locked_By") = UCase(Environ("username"))
.Fields("Locked_Date") = Now
.Update
.Close
End With
この時点で、oDB.Closeが呼び出されるまで、変更はデータベースに対して行われません。
は、明示的にdbSeeChanges
Set oRS = oQryDef.OpenRecordset(dbOpenDynaset, dbSeeChanges)
は、トランザクション内のフィールドへの変更を置くとdbForceOSFlush
DBEngine.BeginTrans
With oRS
.Edit
.Fields("Record_Locked") = True
.Fields("Locked_By") = UCase(Environ("username"))
.Fields("Locked_Date") = Now
.Update
.Close
End With
DBEngine.CommitTrans dbForceOSFlush
とCommitTransをを使用してdbDynatsetとしてレコードセットを開く:私がこれまで試してみました何
Recordsetを開くときに、Recordsetタイプまたはロックタイプを指定していません。明示的に 'dbOpenDynaset'型をリクエストしようとしましたか? – ThunderFrame
@ThunderFrame、それは 'dbOpenDynaset'(私は2と等しいoRS.Typeをチェックしました)にデフォルト設定されているようです。 – Boerdom
AccessデータベースまたはExcelフロントエンドの変更が表示されませんか。これは、GUIの作成時にデータベースを読み取るだけでなく、スナップショットタイプのRSを作成する場合でも、フロントエンドで問題になる可能性があります。 –