質問

2つのms-access .mdbファイルを比較して、それらに含まれるデータが両方で同じであることを確認します。

これを行うにはどうすればよいですか

役に立ちましたか?

解決

ほとんどの場合、ローカルMDBにWebサイトに入力されたデータから更新を適用する必要がある場合に、この種のことをコードで何度も行いました。あるケースではWebサイトがMDBによって駆動され、別のケースではMySQLデータベースでした。 MDBの場合はダウンロードしたばかりで、MySQLの場合はWebサイトでスクリプトを実行して、テキストファイルをエクスポートおよびFTPしました。

今、主なポイントは、ローカルMDBのデータをWebサイトからダウンロードしたデータと比較し、Webサイトで行われた変更を反映するようにローカルMDBを更新することです(いいえ、単一のデータソース-最初に提案したものでしたが、実行可能ではありませんでした。)

MDB Aをローカルデータベース、MDB Bを比較のためにダウンロードしているデータベースと呼びましょう。確認する必要があるのは:

  1. MDB Aには存在するがMDB Bには存在しないレコード。これらは削除の候補である場合とそうでない場合があります(これは特定のデータによって異なります)。

  2. MDB Bに存在するがMDB Aには存在しないレコード。これらはMDB BからMDB Aに追加します。

  3. 両方に存在するレコード。フィールドごとに比較する必要があります。

ステップ#1および#2は、外部結合を使用して欠落しているレコードを見つけるクエリを使用して、かなり簡単に実行できます。ステップ3にはいくつかのコードが必要です。

コードの背後にある原則は、両方のMDBのすべてのテーブルの構造が同一であるということです。したがって、DAOを使用してTableDefsコレクションを調べ、レコードセットを開き、fieldsコレクションを調べて、データを更新するか、差異のリストを出力する各テーブルの各列でSQLステートメントを実行します。

コードの背後にある基本構造は次のとおりです。

  Set rs = db.OpenRecordset("[SQL statement with the fields you want compared]")
  For Each fld In rs.Fields
    ' Write a SQL string to update all the records in this column
    '   where the data doesn't match
    strSQL = "[constructed SQL here]"
    db.Execute strSQL, dbFailOnError
  Next fld

ここでの主な複雑さは、各フィールドのWHERE句が異なる必要があることです。テキストフィールドは、数値フィールドやデータフィールドとは異なる方法で処理する必要があります。そのため、おそらくフィールドタイプに基づいてWHERE句を記述するSELECT CASEが必要になります。

  Select Case fld.Type
    Case dbText, dbMemo
    Case Else
  End Select

Nz()を使用してテキストフィールドを比較しますが、Nz(TextField、 '')を使用し、Nz(NumericField、0)を数値フィールドまたは日付フィールドに使用します。

実際のサンプルコードでは、上記の構造を使用してWHERE句を定義していません。これは、連結されたZLS(テキストフィールド)と比較して非常にうまく機能するフィールドに限定されているためです。以下は読み通すのがかなり複雑ですが、基本的には上記の構造を拡張したものです。

テーブルの各フィールドに対してSQL UPDATEを実行するため、更新の効率のために書かれました。これは、各行に対してSQL UPDATEを実行するよりもはるかに効率的です。一方、更新を行いたくないが、相違点のリストが必要な場合は、全体を異なる方法で扱うことができます。ただし、出力によってはかなり複雑になります

2つのMDBが同一かどうかだけを知りたい場合は、まず各テーブルのレコード数を確認します。一致しないものが1つある場合は、MDBが終了していないことをユーザーに伝えます同じ。レコード数が同じ場合は、フィールドごとにチェックする必要があります。これは、動的に記述された列ごとのSQLで達成するのが最善であると考えています。 MDBが同一ではないことをユーザーに伝えます。

複雑な部分は、違いを記録してユーザーに通知したい場合ですが、それを入力すると、このすでに不可解な投稿がさらに長くなります!

以下は、保存されたクエリqdfOldMembers(MDB Aから)をqdfNewMembers(MDB Bから)のデータで更新する、より大きなサブルーチンのコードの一部です。最初の引数strSQLは、比較するフィールドに制限されるSELECTステートメントであり、strTmpDBは他のMDB(この例ではMDB B)のパス/ファイル名です。このコードでは、strTmpDBにqdfNewMembersとqdfOldMembersがすでに作成されていると想定しています(

他のヒント

AccessDiff (有料製品)を試すことができます。スキーマ、データを比較し、オブジェクトにアクセスする機能もあります。 GUIとコマンドラインインターフェイスもあります。

開示:私はこのツールの作成者です。

データベーステーブルのテキストダンプを取得し、BeyondCompare(またはその他のテキスト比較ツール)を使用して、ダンプされたテキストファイルを単純に比較します。粗野ですが、機能します!

Cross-Database Comparator の使用経験は非常に豊富です。構造やデータを比較できます。

" table diff"を追加しました少し前の accdbmerge ユーティリティの機能。 この回答は元の質問の解決には役立たないと思いますが、将来同じ問題に直面した人には役立つかもしれません。

ファイルが同一かどうかを知りたい場合

fc file1.mdb file2.mdb 

DOSコマンドラインで。

ファイルが同一ではないが、同じテーブルとレコードが含まれていると思われる場合、最も簡単な方法は、データベースを開き、両方のテーブルを循環して両方のテーブルを循環させて差分を抽出する小さなユーティリティをすばやく書くことです2つのファイル間。

これを行うツールがいくつかありますが、それらはすべてシェアウェアのようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top