Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Bauen Sie sich ein Tool zum Vergleichen des Datenmodells verschiedener Versionen einer Datenbank.

Techniken

Tabellen, VBA

Voraussetzungen

Access 2000 und höher

Beispieldatenbank

MDBComparer.mdb

MDB-Comparer

André Minhorst, Duisburg

"Mmmh... irgendwas stimmt nicht. Die Anwendung, die mir der Kunde gerade zurückgeschickt hat, lief doch eben noch? Und jetzt - fehlende Parameter, nicht vorhandene Tabellen?" - Nun, so oder ähnlich sieht das aus, wenn der Anwender im Datenmodell wirkt und dann der Code nicht mehr passt. "Nicht, dass das Debugging allein schon nervend wäre - dann muss ich auch noch die kompletten Tabellen nach Änderungen durchsuchen!" Aber nicht mehr lange - ab jetzt vergleichen Sie die Tabellen und Felder zweier Datenbankversionen vollautomatisch!

Im vorliegenden Beitrag lernen Sie ein Tool kennen, mit dem Sie die Unterschiede der Tabellen und Felder zweier Versionen einer Datenbank ermitteln können.

Funktionen des MDB-Comparers

Der MDB-Comparer soll helfen, die Datenstruktur zweier Access-Datenbanken zu vergleichen. Dazu gehören in dieser ersten Version die Tabellen und die enthaltenen Felder samt wichtigen Eigenschaften wie Datentypen und Feldgrößen. Um weitere wichtige Informationen wie Verknüpfungen zwischen den einzelnen Tabellen oder Indizes soll sich eine erweiterte Fassung der hier vorgestellten Lösung in einer der folgenden Ausgaben von Access im Unternehmen kümmern.

Vergleich der Datenstruktur - wozu?

Gerade noch liegt dem Autor eine Datenbank auf dem Tisch, deren Funktionen nicht mehr wie gewünscht arbeiten, weil der Besitzer die zugrunde liegenden Tabellen geändert hat. Was nun? Am einfachsten wäre es wohl, einfach den durch die Änderungen nicht mehr funktionierenden VBA-Code einfach einmal laufen zu lassen und diesen zu überarbeiten. Mit ein wenig Glück hängt es nur an einer Stelle; anderenfalls kann dies aber auch zu einem lang andauernden Hinterherfixen führen.

Die Analyse der Änderungen am Datenmodell macht auf jeden Fall Sinn: Vielleicht muss man ja gar nicht an den VBA-Code heran, sondern kann das Problem auf andere Weise umgehen? Wenn die Daten wie im vorliegenden Fall aus verknüpften Tabellen stammen, kann man das Problem viel eleganter lösen: Man benennt einfach die Verknüpfungen um - etwa durch Anhängen eines Zeichens wie dem Unterstrich (_) - und erstellt eine Abfrage, die auf der geänderten Tabelle beruht und genauso heißt. Formulare, Berichte und VBA-Code merken es in den meisten Fällen nicht, wenn man diesen statt einer Tabelle eine Abfrage mit dem Namen der eigentlich verwendeten Tabelle präsentiert. Man muss nur den Aufbau der verwendeten Abfragen auf das der ursprünglich verwendeten Tabelle anpassen - im einfachsten Fall durch das Umbenennen von Tabellen- und/oder Feldnamen.

Abb. 1: Die komplette Benutzeroberfläche des MDB-Comparers

Und um zu erkennen, ob dies Sinn macht, muss man zuvor die Änderungen an der Datenstruktur identifizieren.

Das Hauptformular der Anwendung

Die Benutzeroberfläche der Anwendung besteht aus einem einzigen Formular. Dort gibt der Benutzer die Namen der beiden zu untersuchenden Datenbanken ein und klickt auf die Schaltfläche Vergleichen - fertig! Das Tool schreibt nun eine Textdatei auf die Festplatte und öffnet diese direkt im Anschluss mit Notepad.

Die Optionen des Formulars sind schnell erklärt: Das Kontrollkästchen "gleiches Verzeichnis wie oben" sorgt dafür, dass beim Öffnen des Datei öffnen-Dialogs direkt das Verzeichnis angezeigt wird, aus dem auch die erste Version der Datenbank stammt, und mit der Option Systemtabellen einbeziehen entscheidet man, ob man selbige ebenfalls vergleichen möchte.

Vorüberlegungen

Auch für den Bau einer scheinbar einfachen Anwendung wie dem MDB-Comparer sind einige sorgfältige Planungen notwendig. Sonst programmiert man einfach los und stellt irgendwann fest, dass man etwa eine Menge VBA-Code geschrieben hat, aber dieser so aussieht, dass man ihn nicht sinnvoll von einem Formular aus steuern und dessen Ergebnisse nicht in diesem darstellen kann.

Daher stellt man sich zunächst einen Plan zusammen, welche Aufgaben die Anwendung erledigen soll, welche Eingangswerte dafür erforderlich und welches Ergebnis die Anwendung liefern soll. Die Eingangswerte stehen schon fest: Dabei handelt es sich um die beiden zu vergleichenden Datenbanken. Zur Eingabe eigenen sich zwei Textfelder, gegebenenfalls um zwei Schaltflächen zum Aufrufen eines Datei öffnen-Dialogs ergänzt.

Bei den Ergebnissen sieht das schon anders aus: Wie sollen denn die Unterschiede in den Datenmodellen der beiden Datenbanken ausgegeben werden? Sollen alle enthaltenen Informationen gegenübergestellt und die Unterschiede markiert werden, oder soll das Ergebnis nur die Unterschiede liefern? Welche Unterschiede sind denn eigentlich zu erwarten? Und wo soll das Ergebnis ausgegeben werden? In einem Textfeld im gleichen Formular, das die Eingabe der zu vergleichenden Datenbanken ermöglicht? Nun, wenn viele Unterschiede vorhanden sind, ist das in Abhängigkeit von der geplanten Größe des Formulars gegebenenfalls etwas unkomfortabel. Vielleicht kann man die Ergebnisse einfach in eine Textdatei schreiben, wie es auch Versionierungstools beim Vergleichen verschiedener Dateien tun? Die Textdateien kann sich der Benutzer dann im Texteditor seiner Wahl ansehen und dessen Möglichkeiten wie etwa zum Durchsuchen der Datei voll ausschöpfen.

Ausgabe der Unterschiede

Wo Sie die Unterschiede ausgeben, spielt letzten Endes keine Rolle - die unterschiedlichen Techniken unterscheiden sich nur durch wenige Handgriffe voneinander.

Aber welche Unterschiede soll die Anwendung nun ausgeben und wie ermittelt man diese?

Beginnen wir mit einer Liste der möglichen Unterschiede. Die Anwendung soll

  • hinzugefügte Tabellen und alle enthaltenen Felder und Eigenschaften mit dem Vermerk "Hinzugefügt:",
  • gelöschte Tabellen und alle enthaltenen Felder und Eigenschaften mit dem Vermerk "Gelöscht:",
  • hinzugefügte Felder inklusive Angabe der Tabellen und Eigenschaften mit dem Vermerk "Hinzugefügt:",
  • gelöschte Felder inklusive Angabe der Tabellen und Eigenschaften mit dem Vermerk "Gelöscht:" und
  • geänderte Feldeigenschaften unter Angabe der Tabelle, des Feldes und der geänderten Eigenschaft in der alten und der neuen Version mit den Vermerken "Alt:" und "Neu:"
  • ausgeben.

    Dabei sollte man noch klären, inwieweit man versucht, Tabellen mit geänderten Tabellennamen oder Felder mit geänderten Feldnamen zu identifizieren oder ob man die jeweiligen Elemente als gelöscht und wieder hinzugefügt deklariert.

    Hier spielen dann auch die zur Verfügung stehenden Techniken eine Rolle: Sicher sollte man für ein Tool wie dieses darauf verzichten, einen Algorithmus zu entwickeln, der prüft, ob eine Tabelle mit geändertem Namen neu ist oder nur eine neue Fassung einer bestehenden Tabelle - wer viel Zeit hat, kann sich sicher einmal mit diesem Thema befassen, aber an dieser Stelle soll mit wenig Aufwand ein brauchbares Tool zum Erkennen der Unterschiede zweier Versionen einer Datenbank her.

    Unvermeidlich scheint, dass man zunächst die Elemente der einen Version der Datenbank durchläuft und schaut, ob die passenden Elemente in der zweiten Version der Datenbank ebenfalls enthalten sind und dies anschließend für die Elemente der zweiten Version wiederholt. Und wie das genau passiert, zeigt das folgende Kapitel.

    Beispieldaten

    Als Beispiel kommt wieder mal die Nordwind-Datenbank zum Zuge - wenn auch diesmal in zweifacher und vor allem unterschiedlicher Ausführung.

    Die beiden Beispieldatenbanken heißen Nordwind_Alt.mdb und Nordwind_Neu.mdb, wobei die erstgenannte die Tabellen im Originalzustand enthält.

    Die neuere Version enthält folgende Änderungen, die der MDB-Comparer erkennen soll:

  • eine neue Tabelle namens tblBeispiel mit zwei Feldern,
  • in der Tabelle Bestellungen fehlt das Feld VersandÜber,
  • die Tabelle Versandfirmen fällt weg,
  • die Tabelle Personal wird in Mitarbeiter umbenannt,
  • das Feld Personal-Nr der neuen Tabelle Mitarbeiter wird in MitarbeiterID umbenannt, ebenso das gleichnamige Feld der Tabelle Bestellungen,
  • die Tabelle Artikel wird in Produkte umbenannt,
  • die Tabelle Bestellungen erhält ein neues Feld namens Rechnungsdatum,
  • und das Feld Beschreibung der Tabelle Kategorien erhält den Datentyp Text mit einer Feldgröße von 255 statt des Datentyps Memo.
  • Abb. 2: Das Datenmodell der Beispieldatenbank

    Datenmodell

    Das Datenmodell besteht aus zwei Tabellen, die die einzelnen Tabellen sowie die Felder und deren Eigenschaften speichern (s. Abb. 2). Zusätzlich dazu bekommt jede Tabelle zwei Felder, die angeben, in welcher der beiden Datenbankversionen die Tabelle beziehungsweise das Feld enthalten ist.

    Die Tabellen speichern nicht das endgültige Ergebnis der Untersuchung, sondern lediglich die beim Untersuchen vorgefundenen Tabellen, Felder und deren Eigenschaften. Die Auswertung übernehmen die im nächsten Kapitel beschriebenen VBA-Prozeduren.

    Die beiden Tabellen sind über das Fremdschlüsselfeld TabelleID miteinander verknüpft; für die Verknüpfung ist referentielle Integrität festgelegt. Außerdem stellt die Aktivierung der Löschweitergabe sicher, dass beim Löschen der Einträge der Tabelle tblTabellen auch die passenden Einträge der Tabelle tblFelder gelöscht werden.

    Abb. 3: Ein aus mehreren Feldern zusammengesetzter eindeutiger Schlüssel

    Damit die nachfolgend beschriebenen Routinen bereits vorhandene Elemente beim Einfügen identifizieren können, stellen Sie die Eigenschaft Indiziert des Feldes Tabellenname der Tabelle tblTabellen auf Ja (Ohne Duplikate) ein.

    Für die Tabelle tblFelder erzeugen Sie einen zusammengesetzten eindeutigen Schlüssel wie in Abb. 3. Auf diese Weise markiert das Tool nur solche Felder als in beiden Versionen vorhanden, die wirklich exakt gleich sind. Wie dies genau ermittelt wird, erfahren Sie weiter unten.

    Das Hauptformular

    Das Formular frmVergleichen dient als Benutzerschnittstelle zu den im Modul mdlCompare enthaltenen Funktionen. Hier gibt man die zu vergleichenden Datenbanken sowie zwei weitere Optionen ein und startet den Vorgang mit der passenden Schaltfläche.

    Da der Schwerpunkt dieses Tools auf dem Vorgang zum Vergleichen der Tabellen und Felder zweier Datenbanken liegt, sollen die wenigen Funktionen des Formulars nicht in aller Länge beschrieben werden.

    Wichtig ist allein, dass die Prozedur, die durch einen Klick auf die Schaltfläche cmdVergleichen ausgelöst wird, erst die in den Tabellen des MDB-Comparers enthaltenen Daten löscht, diese dann über die Routine Einlesen mit den aus den angegebenen Datenbanken gewonnen Informationen füllt und den Inhalt der Tabellen dann mit der Prozedur Auswertung analysiert und die Ergebnis in einer Textdatei speichert.

    Eingesetzte Techniken

    Die Untersuchung erfolgt in zwei Schritten: Im ersten Schritt liest der MDB-Comparer die benötigten Informationen über Tabellen und Felder der beiden Datenbanken ein und schreibt diese in die Datenbank, im zweiten Schritt analysiert das Tool die gewonnen Daten und gibt ein Ergebnis aus.

    Quellcode 1: Modulkopf und die Steuerroutine für das Einlesen der Tabellen- und Feldinformationen der zu vergleichenden Datenbanken

    Option Compare Database

    Option Explicit

    Dim db As DAO.Database

    Dim rstFelder As DAO.Recordset

    Const cstrLine = "------------------------------------------"

    Public Function Einlesen(strDatenbankAlt As String, _
        strDatenbankNeu As String, bolSystemtabellen As Boolean) _
        As String

        Dim dbAlt As DAO.Database

        Dim dbNeu As DAO.Database

        Set db = CurrentDb

        Set dbAlt = DBEngine.OpenDatabase(strDatenbankAlt)

        Set dbNeu = DBEngine.OpenDatabase(strDatenbankNeu)

        TabellenErfassen dbAlt, bolSystemtabellen, 1

        TabellenErfassen dbNeu, bolSystemtabellen, 2

        Set db = Nothing

        Set dbAlt = Nothing

        Set dbNeu = Nothing

    End Function

    Einlesen der Tabellen und Felder

    Das Speichern der Tabellen und Felder samt Informationen in den zwei beschriebenen Tabellen erleichtert die anschließende Auswertung - erstens kostet das Einlesen von Informationen aus externen Datenbanken Zeit, die man möglichst nur einmal aufwenden sollte, und zweitens bereiten die nachfolgenden Routinen gleichzeitig die Daten für eine einfachere Untersuchung vor.

    Quellcode 1 enthält den Kopf des Standardmoduls mdlCompare, das alle für das Vergleichen benötigten Routinen enthält, sowie die erste Routine namens Einlesen.

    Diese Routine erzeugt Objektverweise des Typs Database auf die beiden zu vergleichenden Datenbanken und ruft die Routine TabellenAuflisten einmal für die alte und einmal für die neue Version der zu vergleichenden Datenbank auf.

    Die Routine TabellenErfassen durchläuft alle Tabellen der per Parameter übergebenen Datenbank und schreibt diese in die Tabelle tblTabellen. Dazu durchläuft sie in einer For Each-Schleife alle TableDef-Objekte der zu erfassenden Datenbank und prüft dort zunächst, welchen Wert der Parameter bolSystemtabellen hat - ist dieser gleich False, dann soll die Routine die Systemtabellen nicht erfassen.

    Innerhalb der Schleife versucht die Routine zunächst, einfach den Tabellennamen in die Tabelle tblTabellen zu schreiben und je nach der aktuell untersuchten Version das Feld Version_1 oder Version_2 auf den Wert True zu setzen. Damit markiert das Tool jeden Tabelleneintrag so, dass man bereits aus der Tabelle tblTabellen erkennen kann, ob eine Tabelle in der ersten, der zweiten oder gar beiden Versionen enthalten ist (s. Abb. 4).

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.