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 6/2011.

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

Lernen Sie ein Formular kennen, mit dem Sie die Daten zweier Datensätze abgleichen können.

Techniken

VBA, DAO

Voraussetzungen

Access 2000 und höher

Beispieldateien

Formularabgleich.mdb

Shortlink

www.access-im-unternehmen.de/805

Daten zusammenführen per Formular

André Minhorst, Duisburg

Wenn Sie mit Duplikaten arbeiten oder Daten aus mehreren Datenbanken zusammenführen möchten, kann ein Formular zum Abgleich ähnlicher Datensätze hilfreich sein. Dieses sollte die relevanten Felder beider Datensätze nebeneinanderstellen und dem Benutzer die Möglichkeit bieten, die Daten des einen, des anderen oder auch beider Datensätze in einen Datensatz zu überführen. Dieser Beitrag zeigt, wie Sie ein solches Formular erstellen und damit Datensätze abgleichen.

Das gewünschte Formular soll wie in Abb. 1 aussehen und jeweils die Feldnamen, die Werte der Zieltabelle und die Werte der Quelltabelle anzeigen. Der Benutzer soll alle Felder der Quelltabelle, alle Felder der Zieltabelle oder auch eine Mischung der Daten aus beiden Datensätzen auswählen können. Dies ist bereits die erste Hürde: Wie stellt man dies dar beziehungsweise welche Steuerelemente verwenden wir dafür?

pic001.png

Abb. 1: Das Formular zum Abgleichen von Datensätzen

Die naheliegendste Lösung wäre wohl gewesen, eine Reihe von Textfeldern nebeneinander zu platzieren und diese je nach Datenherkunft zu füllen. Diesmal haben wir uns jedoch für das Listenfeld entschieden - allein, weil es durch die mögliche Mehrfachmarkierung bereits eine wichtige Funktion mitbringt. Genau genommen sind es drei Listenfelder, die im Formular frmAbgleichDetails ihren Dienst tun. Das erste enthält die Feldnamen, das zweite die Daten der Zieltabelle und das dritte die Daten der Quelltabelle. Ganz oben befindet sich noch ein Eintrag, mit dem der Benutzer per Mausklick alle Felder einer Spalte auswählen können soll.

Bevor wir auf die technischen Feinheiten dieser Lösung eingehen, schauen wir uns an, wie Sie das Formular einsetzen können. Der Aufruf erfordert nämlich eine Reihe von Informationen, die Sie dem Formular über das Öffnungsargument OpenArgs übergeben. Der Aufruf sieht beispielsweise wie folgt aus:

DoCmd.OpenForm "frmAbgleichDetails", _

OpenArgs:="LieferantID|LieferantID|1|77|tblLieferanten|tblLieferanten1|LieferantID;
Firma;Kontaktperson;Position;Strasse;Ort;Region;PLZ;
Land;Telefon;Telefax;Homepage", WindowMode:=acDialog

Wenn wir uns den Wert für OpenArgs allein ansehen, sieht das Ganze schon übersichtlicher aus:

LieferantID|LieferantID|1|77|tblLieferanten|tblLieferanten1|LieferantID;Firma;
Kontaktperson;Position;Strasse;Ort;Region;PLZ;Land;Telefon;Telefax;Homepage

Dort gibt es zunächst eine ganze Reihe von Informationen, die durch das Pipe-Zeichen voneinander getrennt werden. Dabei handelt es sich um die folgenden:

  • Primärschlüsselfeld der Zieltabelle
  • Primärschlüsselfeld der Quelltabelle
  • Wert des Primärschlüsselfeldes des Zieldatensatzes
  • Wert des Primärschlüsselfeldes des Quelldatensatzes
  • Name der Zieltabelle
  • Name der Quelltabelle
  • Semikolon-separierte Liste der Felder, die angezeigt werden sollen

Erst wenn Sie für diese sieben Parameter sinnvolle Werte übergeben, zeigt das Formular die Daten zum Abgleich an.

Im vorliegenden Fall soll es den Datensatz mit dem Primärschlüsselwert 1 der Zieltabelle tblLieferanten und den Datensatz mit dem Primärschlüsselwert 77 der (in einer anderen Datenbank befindlichen und verknüpften) Quelltabelle tblLieferanten1 anzeigen, und davon die Felder LieferantID, Firma, Kontaktperson, Position, Strasse, Ort, Region, PLZ, Land, Telefon, Telefax und Homepage.

Nach diesem Aufruf erscheint das Formular und zeigt den gewünschten Datensatz an. Sie können nun die Feldinhalte auswählen und das Formular mit einem Klick auf die Schaltfläche OK schließen. Das Formular übernimmt nur die Darstellung und Markierung der gewünschten Daten, den Code zum Auslesen der gewählten Daten müssen Sie wie die Anweisung zum Öffnen des Formulars selbst bereitstellen.

In einem einfachen Beispiel sieht das wie in Listing 1 aus. Hier werden die beiden zu vergleichenden Datensatzgruppen geöffnet und per Recordset-Variable referenziert. Die Prozedur durchläuft die Datensätze der Quelltabelle und prüft, ob es in der Zieltabelle bereits einen Datensatz mit dem gleichen Wert im Feld Firma gibt. Falls nicht, wird der Datensatz zur Zieltabelle hinzugefügt, falls doch, tritt unser Formular für den Datenabgleich auf den Plan.

Listing 1: Abgleich zweier Datensätze mit Untersuchung im Formular durchführen

Public Sub DatenZusammenfuehren_Lieferanten_MitAbgleich()

    Dim db As DAO.Database

    Dim rstQuelle As DAO.Recordset, rstZiel As DAO.Recordset

    Dim lngZielID As Long

    Set db = CurrentDb

    Set rstQuelle = db.OpenRecordset("SELECT * FROM tblLieferanten1", dbOpenDynaset)

    Set rstZiel = db.OpenRecordset("SELECT * FROM tblLieferanten", dbOpenDynaset)

    db.Execute "DELETE FROM tblPKAltUndNeu", dbFailOnError

    Do While Not rstQuelle.EOF

    lngZielID = Nz(DLookup("LieferantID", "tblLieferanten", "Firma = '" _

            & Replace(rstQuelle!Firma, "'", "''") & "'"))

        If lngZielID = 0 Then

            rstZiel.AddNew

            rstZiel!Firma = rstQuelle!Firma

            '... weitere Felder

            lngZielID = rstZiel!LieferantID

            rstZiel.Update

        Else

            DoCmd.Close acForm, "frmAbgleichDetails"

            DoCmd.OpenForm "frmAbgleichDetails", OpenArgs:="LieferantID|LieferantID|" & lngZielID _

                & "|" & rstQuelle!LieferantID & "|tblLieferanten|tblLieferanten1|LieferantID;" _

                & "Firma;Kontaktperson;Position;Strasse;Ort;Region;PLZ;Land;Telefon;Telefax;" _

                & "Homepage", windowMode:=acDialog

            If mdlTools_Abgleich.IstFormularGeoeffnet("frmAbgleichDetails") Then

                rstZiel.FindFirst "LieferantID = " & lngZielID

                rstZiel.Edit

                rstZiel!Firma = Forms!frmAbgleichDetails.Wert("Firma")

                rstZiel!Kontaktperson = Forms!frmAbgleichDetails.Wert("Kontaktperson")

                '... weitere Felder

                lngZielID = Forms!frmAbgleichDetails.Wert("LieferantID")

                rstZiel.Update

                DoCmd.Close acForm, "frmAbgleichDetails"

            End If

        End If

        rstQuelle.MoveNext

    Loop

    Set db = Nothing

End Sub

In diesem Fall wird dieses mit einigen variablen Parametern geöffnet, namentlich den Primärschlüsselfeldern der beiden zu vergleichenden Datensätze, die ja mit jedem Satz zu vergleichender Datensätze wechseln. Der Primärschlüsselwert des Zieldatensatzes wurde dazu bereits vorher in der Variablen lngZielID gespeichert, der Quelldatensatzwert wird direkt aus dem Datensatz eingelesen.

Nun öffnet sich das Formular und der Benutzer legt fest, welches Feld mit welchem Wert der beiden Datensätze gefüllt werden soll. Danach klickt er auf OK und sorgt dafür, dass das Formular unsichtbar wird und somit den Fokus verliert.

Da es als modaler Dialog geöffnet wurde, läuft die aufrufende Prozedur erst jetzt weiter. Nach einer Prüfung, ob das Formular frmAbgleichDetails noch geöffnet ist, werden die Daten entsprechend den Angaben im Formular in den Zieldatensatz geschrieben. Das unsichtbare, aber noch nicht geschlossene Formular bietet eine Funktion namens Wert an, die den Namen eines Feldes erwartet und den ausgewählten Wert zurückliefert.

Die Prozedur sucht den Zieldatensatz aus der Datensatzgruppe heraus und schreibt die im Formular ausgewählten Werte in die jeweiligen Felder des Datensatzes.

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.