Frage

Ich möchte zwei ms-Zugriff auf Dateien vergleichen .mdb zu prüfen, ob die Daten, die sie enthalten, ist in beiden gleich.

Wie kann ich das tun?

War es hilfreich?

Lösung

Ich habe diese Art der Sache in Code getan viele, viele Male, vor allem in Fällen, in denen eine lokale MDB benötigten Updates, um es aus den Daten gezogen angewendet haben auf einer Website eingegeben. In einem Fall wurde die Website durch eine MDB angetrieben, in anderen war es eine MySQL-Datenbank. Für die MDB, heruntergeladen wir es ja, für MySQL, wir Skripte auf der Website zu exportieren und FTP Textdateien lief.

Nun ist der wichtigste Punkt, dass wir auf die Daten von der Website und aktualisieren Sie die lokalen MDB zu reflektieren Änderungen auf der Website (nein, es war nicht möglich, heruntergeladen vergleichen Daten in dem lokalen MDB wollten einen einzigen zu verwenden Datenquelle -. es war das erste, was ich vorgeschlagen, aber es war nicht möglich)

Lassen Sie sich MDB A lokale Datenbank aufrufe und MDB B diejenige, die Sie zum Vergleich sind Download. Was Sie überprüfen ist für:

  1. Datensätze, die in MDB A existieren, aber in MDB B. nicht Dies kann oder auch nicht Kandidaten für die Löschung sein (dies wird auf Ihren speziellen Daten abhängen).

  2. Datensätze, die in MDB B existieren, aber nicht in MDB A. Diese werden Sie von MDB B MDB A anhängen.

  3. Datensätze, die in beiden existieren, das Feld werden muß, verglichen mit Feld.

Steps # 1 und # 2 sind relativ leicht mit Anfragen durchgeführt, die eine äußere Verwendung kommen Sie mit den fehlenden Aufzeichnungen zu finden. Schritt 3 erfordert einen Code.

Das Prinzip hinter dem Code ist, dass die Struktur aller Tabellen in beiden MEB identisch ist. So verwenden Sie DAO die TableDefs Sammlung zu gehen, ein Re-Cord öffnen und zu Fuß die Felder Sammlung eine SQL-Anweisung auf jeder Spalte jeder Tabelle auszuführen, die entweder die Daten aktualisiert oder gibt eine Liste der Unterschiede.

Die Grundstruktur hinter dem Code ist:

  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

Nun, hier die große Komplexität ist, dass Ihre WHERE-Klausel für jedes Feld verschieden sein muss - Textfelder müssen anders Zahlen- und Datenfelder behandelt werden. So werden Sie wahrscheinlich eine SELECT-CASE wollen, dass Ihre WHERE-Klausel schreibt basierend auf dem Feldtyp:

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

Sie wollen Nz () verwenden, um die Textfelder zu vergleichen, aber Sie würden verwenden Nz (TextField-, ‚‘) für die, während Nz (NumericField, 0) mit für numerische Felder oder Datumsfelder.

Mein Beispiel-Code nicht tatsächlich die Struktur verwendet über die WHERE-Klausel zu definieren, da sie auf Bereiche beschränkt sind, die sehr gut mit ZLS (Textfeldern) verketteten arbeiten Vergleichen. Was unten ist, ist ziemlich kompliziert zu lesen, doch es ist im Grunde eine Erweiterung auf der obigen Struktur.

Es wurde für die Effizienz von Updates geschrieben, da es ein SQL-UPDATE für jedes Feld der Tabelle führt, die wesentlich effizienter ist ein SQL-UPDATE für jede Zeile als die Ausführung. Wenn auf der anderen Seite, nicht wahr, ein Update tun wollen, aber eine Liste der Unterschiede wollen, könnten Sie die ganze Sache anders behandeln. Aber das wird ziemlich kompliziert, je nach dem Ausgang,

Wenn alles, was Sie wissen wollen, ist, wenn zwei MDBs identisch sind, würden Sie zuerst in jeder Tabelle die Anzahl der Datensätze prüfen Sie zuerst, und wenn man ein nicht-Spiel hat, Sie beenden und dem Benutzer sagen, dass der MEB nicht das Gleiche. Wenn die recordcounts gleich sind, dann müssen Sie Feld überprüfen, indem Sie Feld, das ich glaube, am besten mit geführt wird Spalte-für-Spalte geschrieben SQL dynamisch - sobald einer der resultierenden SQL WÄHLT gibt 1 zurück oder mehrere Datensätze, Sie abbrechen und erzählen Sie Ihren Benutzer, dass der MEB nicht identisch ist.

Der komplizierteste Teil ist, wenn Sie die Unterschiede aufnehmen möchten, und den Benutzer darüber informieren, sondern in das gehen würde diese bereits interminable Post noch länger machen!

Was folgt, ist nur ein Teil des Codes von einem größeren Unterprogramm, das den gespeicherten Abfrage qdfOldMembers (von MDB A) aktualisiert mit Daten aus qdfNewMembers (von MDB B). Das erste Argument, strSQL, ist eine SELECT-Anweisung, die auf die Felder beschränkt ist, die Sie vergleichen wollen, während strTmpDB der Pfad / Dateinamen der anderen MDB (MDB B in unserem Beispiel). Der Code geht davon aus, dass strTmpDB hat qdfNewMembers und qdfOldMembers bereits erstellt (der ursprüngliche Code schreibt die gespeicherte QueryDef on the fly). Es könnte genauso gut direkt Tabellennamen sein (der einzige Grund, warum ich eine gespeicherte Abfrage verwenden, da die Feldnamen zwischen den beiden MEB nicht genau übereinstimmen geschrieben für wurde).

Public Sub ImportMembers(strSQL As String, strTmpDB As String)
  Const STR_QUOTE = """"
  Dim db As Database
  Dim rsSource As Recordset '
  Dim fld As Field
  Dim strUpdateField As String
  Dim strZLS As String
  Dim strSet As String
  Dim strWhere As String

  ' EXTENSIVE CODE LEFT OUT HERE

  Set db = Application.DBEngine(0).OpenDatabase(strTmpDB)

  ' UPDATE EXISTING RECORDS
  Set rsSource = db.OpenRecordset(strSQL)
  strSQL = "UPDATE qdfNewMembers INNER JOIN qdfOldMembers ON "
  strSQL = strSQL & "qdfNewMembers.EntityID = qdfOldMembers.EntityID IN '" _
                       & strTmpDB & "'"
  If rsSource.RecordCount <> 0 Then
     For Each fld In rsSource.Fields
       strUpdateField = fld.Name
       'Debug.Print strUpdateField
       If InStr(strUpdateField, "ID") = 0 Then
          If fld.Type = dbText Then
             strZLS = " & ''"
          Else
             strZLS = vbNullString
          End If
          strSet = " SET qdfOldMembers." & strUpdateField _
                     & " = varZLStoNull(qdfNewMembers." & strUpdateField & ")"
          strWhere = " WHERE " & "qdfOldMembers." & strUpdateField & strZLS _
                       & "<>" & "qdfNewMembers." & strUpdateField & strZLS _
                       & " OR (IsNull(qdfOldMembers." & strUpdateField _
                       & ")<>IsNull(varZLStoNull(qdfNewMembers." _
                       & strUpdateField & ")));"
          db.Execute strSQL & strSet & strWhere, dbFailOnError
          'Debug.Print strSQL & strSet & strWhere
       End If
     Next fld
  End If
End Sub

-Code für die Funktion varZLSToNull ():

Public Function varZLStoNull(varInput As Variant) As Variant
  If Len(varInput) = 0 Then
     varZLStoNull = Null
  Else
     varZLStoNull = varInput
  End If
End Function

Ich weiß nicht, ob das zu komplex ist sinnvoll, aber vielleicht wird es jemanden helfen.

Andere Tipps

Sie können versuchen, AccessDiff (bezahltes Produkt). Es hat die Fähigkeit, das Schema, um die Daten zu vergleichen, und auch Objekte zugreifen. Es verfügt über eine GUI und auch eine Kommandozeilen-Schnittstelle.

Disclosure:. Ich bin der Schöpfer dieses Werkzeug

Text-Dumps von Datenbanktabellen nehmen und einfach zu vergleichen, die abgeladen Textdateien mit BeyondCompare (oder einem anderen Textvergleich-Tool). Crude kann aber arbeiten!

Ich habe sehr gute Erfahrungen mit Cross-Database Vergleicher . Es ist in der Lage Struktur zu vergleichen und / oder Daten.

Siehe Vergleichen Access-Datenbanken Abschnitt an den Microsoft Access Dritten Dienstprogramme, Produkte, Werkzeuge , Module, usw. Seite auf meiner Website.

Ich habe hinzugefügt "table diff" -Funktion, um mein accdbmerge Dienstprogramm nicht so lange vor. Ich glaube, dass diese Antwort nicht ursprüngliche Frage lösen helfen, aber es kann für jemanden konfrontiert mit dem gleichen Problem in der Zukunft hilfreich sein.

Wenn Sie wollen wissen, ob die Dateien identisch sind dann

fc file1.mdb file2.mdb 

auf einer DOS-Kommandozeile.

Wenn die Dateien nicht identisch sind, aber Sie vermuten, sie enthalten die gleichen Tabellen und Datensätze dann ist der einfachste Weg, um schnell ein kleines Programm schreiben würde, die beide Datenbanken und Zyklen durch die Tabellen beider öffnet eine heterogene Abfrage Ausführen des Diff zu extrahieren zwischen den beiden Dateien.

Es gibt einige Tools gibt, die dies für Sie tun, aber sie scheinen alle Shareware zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top