Daten zusammenführen per Formular

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.

Nach dem Aktualisieren des Datensatzes wird das Formular nun endgültig geschlossen und der nächste Datensatz der Quelltabelle wird untersucht. Wenn alle Datensätze durchlaufen wurden, ist der Vorgang abgeschlossen.

Aufbau des Formulars

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar