私は、MSAccess2007で非常に簡単に実行できるはずの処理方法をかなり長い間探していました。
受信したファイルの数をタイプごと、日ごとに追跡するメインテーブルitems_movedがあります。基本的な構造は次のとおりです。
ID(自動番号)、ドライブ(テキスト)、タイプ(テキスト)、日付(DateTime)、file_count(番号)、file_size(番号)
一般的なデータは次のようになります。
1777, F:\snaps, pics, 6/09/2010, 66, 151616131
1778, F:\snaps, pics, 6/10/2010, 5, 464864
1779, G:\pics, pics, 6/09/2010, 58, 45645646
1780, G:\pics, pics, 6/10/2010, 70, 123456667
まったく同じデータ構造の一時テーブルがあります。一時テーブルは、items_movedテーブルの最終日から開始(およびそれを含む)して、何が新しいかを見つけることによって生成されます。
一般的なデータは次のようになります。
1, F:\snaps, pics, 6/10/2010, 366, 6531616131
2, F:\snaps, pics, 6/11/2010, 5, 464864
3, G:\pics, pics, 6/10/2010, 70, 123456667
4, G:\pics, pics, 6/11/2010, 56, 123645964
私がやろうとしているのは、一時テーブルをメインテーブルに追加して、次のようにすることだけです。
- 重複はありません(ドライブと日付に基づく)
- 一時テーブルに一致するドライブと日付、およびそれより大きい値がある場合、メインテーブルが上書きされます
- 行が一時テーブルに存在するがメインテーブルには存在しない場合、その行はメインの末尾に追加されます。
結果はitems_movedテーブルにあり、1-1776は変更されずに記録されますが、次のように終了します。
1777, F:\snaps, pics, 6/09/2010, 66, 151616131 (Unchanged)
1778, F:\snaps, pics, 6/10/2010, 366, 6531616131 (Updated temp was larger)
1779, G:\pics, pics, 6/09/2010, 58, 45645646 (unchanged)
1780, G:\pics, pics, 6/10/2010, 70, 123456667 (unchanged)
1781, F:\snaps, pics, 6/11/2010, 5, 464864 (added)
1782, G:\pics, pics, 6/11/2010, 56, 123645964 (added)
私は考えられる結合のすべてのバリエーションを試しました。
日付が一致する行を取得できるので、それを更新ステートメントに使用できます。items_movedテーブルに一致する日付がない一時的な行を取得できないため、挿入を実行できません。
最後のポイントは、ユーザーがアクセスデータベースからレポートを要求したときに、VBアクションの一部としてこれを実行することです。
これがスニペットです
INSERT INTO items_moved (drive, type, file_date, file_count, file_size)
SELECT 'F:\snaps','pics', temp_table.created, Count(temp_table.created),
Sum(temp_table.size) FROM temp_table where temp_table.drive = 'F:\snaps'
GROUP BY temp_table.created
これは機能しますが、テーブルの最後に追加するだけです。重複の問題が残っています。テーブルをその場で重複排除する方法があると確信していますが、それは無駄のようです。unionを使用するためのヒントをいくつか見つけましたが、 unionを使用してunion内のテーブルの1つを更新する方法については何もありません。
任意の入力をいただければ幸いです。ありがとう。