テーブルの配列 (文字列配列として格納) を使用してテーブルをループし、一連のクエリの削除/更新を実行するクエリがあります。クエリはテーブル名以外は同じであるため、ループを使用して、テーブル名を変数として使用して繰り返します。
問題は、私の削除クエリがテーブルをロックし、その後更新クエリの実行が速すぎることです。「データベースがロックされています」というエラーが表示されます。
次の 2 つのいずれかが必要です。
- VBAに「前のコマンドを待つ」ように指示する方法または
- これらのクエリを 1 つ (または 2 つ) のクエリに連結する方法: 1 つはデータベースの行を削除し、もう 1 つは新しい行をインポートします。これにより、標準アクセス クエリからクエリを実行することができます (適切な時間を割り当て、クエリを終了する必要があります)。
これに対する唯一の問題は、親子関係があることです。そのため、親テーブルはその子の前に更新する必要があります (現在、配列の順序付けによって実現されています)。
(時々)「DB locked/in use」メッセージを生成する現在のコードは次のとおりです。
For i = 0 To UBound(tables)
'Delete all data first
sql = "DELETE * FROM " & tables(i)
DoCmd.RunSQL sql
'Update all data second
sql = "INSERT INTO " & tables(i) & " IN """ & toDB & """ SELECT " & tables(i) & " .* FROM " & tables(i) & " IN """ & fromDB & """;"
DoCmd.RunSQL sql
Next
明確にする必要があります: クエリはfromDB
、同一のテーブルから 1 つのバックエンドの ( ) 行を取得し、それを別のバックエンドの ( toDB
) 行にプッシュします
編集: に関する質問に答えてINSERT INTO
、私の問題は、フィールドを に追加すると、toDB
上書きすると削除されることです。このバックドア アプローチを行う必要がある理由は、データベースがまだ開発中であり、選択テーブルでも使用されているためです。更新と機能の改善は毎日行われます。データベースにアクセスしている他のコンピューターが常にネットワーク上にあるとは限らないため (ネットワークに戻ったときに手動で同期する必要があります)、単純な分割バックエンドも使用できません。同一の(スキーマの更新を差し引いた)バックエンド。