Daten mischen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Programmieren ohne Testdaten macht keinen Spaß. Schon gar nicht, wenn man weiß, dass es tausende echte Datensätze gibt, die man aber aus Datenschutzgründen nicht einsetzen darf. Aber vielleicht reicht es ja, wenn man die Daten einfach unkenntlich macht Bei Personendaten etwa könnte man schlicht alle Vor- und Nachnamen sowie gegebenenfalls die Adressdaten ordentlich durcheinanderwirbeln. Dann hat man ausreichend realistisches Testmaterial und außerdem ist der Datenschutzbeauftragte zufriedengestellt.

Meistens enthält eine Tabelle ja nur wenige wirklich datenschutzrelevante Daten wie etwa die Namen von Personen, Adressen, E-Mail-Adressen et cetera. In vielen Fällen reicht es tatsächlich aus, die Daten einmal durchzumischen, also beispielsweise alle Nachnamen der Tabelle zu nehmen und den Datensätzen neu zuzuordnen. Wenn man dies mit Vorname und Nachname durchführt, sollten die Daten nur noch schlecht reproduzierbar sein.

Etwas interessanter wird es, wenn Felder Informationen enthalten, die aus mehreren Feldern zusammengesetzt sind. Gut: Normalerweise sollte dies nicht geschehen, zumindest nicht in einer sorgsam normalisierten Datenbank. Manchmal lässt sich dies aber nicht verhindern: Dann landen Vor- und Nachname etwa im Feld mit der E-Mail-Adresse, deren Inhalt dann nach dem Schema <Vorname>.<Nachname>@<Firma>.xyz aufgebaut ist. Hier brauchen Sie gegebenenfalls eine kleine Spezialbehandlung. So könnte man in einer Abfrage prüfen, ob die E-Mail-Adresse den Vor- und/oder Nachnamen des aktuellen Datensatzes enthält, und die E-Mail-Adresse entsprechend aufbereiten.

Welche Anforderungen gibt es noch an ein Tool, mit dem Sie die Daten einer Tabelle nach dem Zufallsprinzip vermischen möchten Viele Tabellen enthalten beispielsweise ein oder mehrere abhängige Felder. Auch das entspricht im Grunde nicht den Normalisierungsregeln, lässt sich aber manchmal nicht vermeiden. Der Vorname und die Anrede (Herr/Frau) sind ein solches Beispiel: Sie könnten zwar eine Tabelle bereitstellen, welche die passende Anrede für jeden denkbaren Vornamen enthält. Aber was ist mit Namen, die nicht eindeutig einem Geschlecht zugeordnet werden können Die Existenz eines Anrede-Feldes ist also berechtigt. Wenn Sie nun aber die Vornamen der Datensätze Ihrer Tabelle vermischen, dann müssen Sie darauf achten, dass die Anreden nachher zu den Vornamen passen – so realistisch sollen die gemischten Daten schon sein. Das Tool sollte also die Möglichkeit bieten, Kombinationen aus mehreren Feldern zu vertauschen.

Der Datenmischer

Schauen wir uns an, was die Lösung dieses Beitrags für Funktionen bereithält. Sie besteht aus einem einzigen Formular, das gleichzeitig den kompletten Code enthält. Das Formular heißt frmMischer und sieht wie in Bild 1 aus.

pic001.png

Bild 1: Das Formular mit den Funktionen zum Mischen von Daten

Mit dem Kombinationsfeld Tabelle wählen Sie zunächst die Tabelle aus, deren Daten Sie durcheinanderwürfeln möchten. Die Auswahl wirkt sich auf drei weitere Steuerelemente aus: Die beiden Listenfelder Felder und Abhängige Felder zeigen die Felder der auswählten Tabelle an, das Unterformular auf der Registerseite Originaldaten zeigt die Daten der Tabelle selbst an.

Im Listenfeld Felder wählen Sie eines oder mehrere Felder aus, die einzeln oder in Kombination gemischt werden sollen. Wählen Sie hier beispielsweise nur das Feld Geburtstdatum aus, werden die Geburtsdaten zufällig einem der enthaltenen Datensätze zugewiesen.

Dabei bleiben alle Geburtsdaten erhalten, sie finden sich jedoch mit hoher Wahrscheinlichkeit in einem neuen Datensatz wieder (natürlich kann ein Wert auch im gleichen Datensatz landen – dies wird von der Anwendung nicht ausgeschlossen). Wenn Sie zwei oder mehr Felder im Listenfeld Felder auswählen, werden die Kombinationen vertauscht.

Das rechte Listenfeld Abhängige Felder behandelt solche Fälle, in denen die Daten der Felder des ersten Listenfeldes in weiteren Feldern wiederholt werden. Wenn Sie die Nachnamen aller Datensätze vertauschen möchten, passen die E-Mail-Adressen möglicherweise nicht mehr dazu – im geschäftlichen Bereich ist es ja mittlerweile die Regel, dass der Name in der E-Mail-Adresse auftaucht.

Alle Felder, die im rechten Listenfeld ausgewählt wurden, werden also auf Vorkommen der Werte der im linken Listenfeld ausgewählten Felder geprüft. Treten solche Werte auf, werden diese entsprechend der Vertauschung mit ersetzt.

Mischvorgang auslösen

Den Mischvorgang können Sie auf zwei Arten auslösen:

  • Die Schaltfläche Mischen führt den Mischvorgang direkt durch. Dieser Vorgang lässt sich nicht rückgängig machen – es sei denn, Sie hätten noch eine Kopie der Daten und würden diese wiederherstellen. Das Ergebnis können Sie gleich auf der Registerseite Originaldaten des Registers unten betrachten (s. Bild 2).
  • pic002.png

    Bild 2: Das Formular frmMischen in der Entwurfsansicht

  • Die Schaltfläche Testen erstellt erst eine Kopie der Tabelle und führt den Mischvorgang mit den ausgewählten Parametern mit den Daten der Kopie aus. Das Ergebnis wird auf der Registerseite Testdaten des Registersteuerelements angezeigt.

Wenn Sie den Mischvorgang zuerst getestet haben, können Sie zwischen den beiden Seiten des Registersteuerelements hin- und herwechseln und sich die Unterschiede ansehen.

Beim Schließen des Formulars fragt dieses noch, ob die temporären Tabellen gelöscht werden sollen.

Steuerelemente des Formulars

Das Formular enthält die folgenden Steuerelemente:

  • cboTabellen: Auswahl der Tabellen
  • cmdMischen: Stößt den Mischvorgang mit den Originaldaten an.
  • cmdTesten: Kopiert die Tabelle zuerst und mischt die Daten dann in der Kopie.
  • lblFelder und lblFelderAbhaengig: Beschriftungsfelder, die dynamisch die Anzahl der in den Listenfeldern ausgewählten Einträge anzeigen.
  • lstFelder: Erlaubt das Auswählen einzelner Felder oder von Kombinationen aus mehreren Feldern, die zwischen den Datensätzen ausgetauscht werden sollen.
  • lstFelderAbhaengig: Legt die Felder fest, die auf Vorkommen der Inhalte der Felder aus lstFelder untersucht werden sollen.
  • reg: Registersteuerelement zum Anzeigen der Original- und der Testdaten.
  • sfmTabelle: Unterformularsteuerelement, das die Daten der Originaltabelle anzeigt
  • sfmTabelleTest: Unterformularsteuerelement, das die Daten der zu Testzwecken kopierten Tabelle anzeigt

Tabelle auswählen

Das Kombinationsfeld cboTabellen soll alle Tabellen der aktuellen Datenbank anzeigen – mit Ausnahme der Systemtabellen und temporären Tabellen.

Die Namen der Tabellen lesen Sie mit einer Abfrage wie der aus Bild 3 aus der Systemtabelle MSysObjects aus.

pic003.png

Bild 3: Abfrage zur Ermittlung der Tabellen der aktuellen Datenbank

Damit das Kombinationsfeld zusätzlich zu den Tabellennamen einen Eintrag mit dem Wert <Auswählen> enthält, ändern Sie den SQL-Code der Abfrage wie folgt ab:

SELECT "<Auswählen>" AS Name FROM MSysObjects
UNION
SELECT Name FROM MSysObjects
WHERE Name Not Like ''MSys*''
And Name Not Like ''~*'' AND Type=1 ORDER BY Name;

Außerdem verwenden Sie die folgende Prozedur, die durch das Ereignis Beim Laden des Formulars ausgelöst wird, um diesen Eintrag gleich beim Öffnen des Formulars anzuzeigen:

Private Sub Form_Load()
    Me!cboTabelle = Me!cboTabelle.ItemData(0)
    Me!sfmTabelle.SourceObject = ""
    Me!sfmTabelleTest.SourceObject = ""
End Sub

Die Prozedur leert gleichzeitig die beiden Unterformulare. Das Auswählen eines der Einträge des Kombinationsfeldes löst die Prozedur aus Listing 1 aus. Diese Prozedur prüft zunächst, ob der Benutzer den Eintrag <Auswählen> oder einen der Tabellennamen ausgewählt hat. Im Falle einer Tabelle nimmt die Prozedur einige Einstellungen vor:

Listing 1: Füllen der übrigen Steuerelemente nach Auswahl der Tabelle mit den zu verändernden Daten

Private Sub cboTabelle_AfterUpdate()
    If Not Me!cboTabelle = "<Auswählen>" Then
        Me!lstFelder.RowSource = Me!cboTabelle
        Me!lstFelderAbhaengig.RowSource = Me!cboTabelle
        Me!sfmTabelle.SourceObject = "Tabelle." & Me!cboTabelle
    Else
        Me!lstFelder.RowSource = ""
        Me!lstFelderAbhaengig.RowSource = ""
        Me!sfmTabelle.SourceObject = ""
    End If
    Me!sfmTabelleTest.SourceObject = ""
End Sub
  • Die beiden Listenfelder lstFelder und lstFelderAbhaengig werden mit den Feldnamen der ausgewählten Tabelle gefüllt.
  • Das Unterformular sfmTabelle erhält die ausgewählte Tabelle als Herkunftsobjekt.

Damit die Listenfelder tatsächlich die Feldnamen anzeigen, stellen Sie die Eigenschaft Datensatzherkunft dieser beiden Steuerelemente auf den Wert Feldliste ein.

Wenn der Benutzer den Eintrag <Auswählen> selektiert, werden diese drei Steuerelemente wieder geleert. Gleiches geschieht in beiden Fällen mit dem Unterformular sfmTabelleTest.

Auswählen der betroffenen Felder

Die beiden Listenfelder lstFelder und lstFelderAbhaengig sollen außerdem beide die Auswahl mehrerer Einträge erlauben. Dazu stellen Sie die Eigenschaft Mehrfachauswahl auf Einzeln ein. Der Benutzer braucht dann nur noch jeweils einfach auf die betroffenen Felder zu klicken.

Da es vorkommen kann, dass eine Tabelle sehr viele Felder enthält und somit nicht alle markierten Einträge gleichzeitig sichtbar sind, sollen die Bezeichnungsfelder der beiden Listenfelder hinter der Beschriftung in Klammern die Anzahl der markierten Einträge anzeigen. Damit diese Anzahl jeweils beim Aktivieren oder Deaktivieren eines Eintrags aktualisiert wird, fügen Sie die beiden Prozeduren aus Listing 2 hinzu.

Listing 2: Aktualisierungen der Anzahl der markierten Einträge in den Bezeichnungsfeldern

Private Sub lstFelder_Click()
    Me!lblFelder.Caption = "Felder (" & Me!lstFelder.ItemsSelected.Count & "):"
End Sub
Private Sub lstFelderAbhaengig_Click()
    Me!lblFelderAbhaengig.Caption = _
    "Abhängige Felder (" & Me!lstFelderAbhaengig.ItemsSelected.Count & "):"
End Sub

Aufruf des Misch-Vorgangs

Die Schaltfläche cmdMischen ruft den eigentlichen Mischvorgang auf (s. Listing 3). Sie prüft zunächst, ob der Benutzer einen oder mehrere Einträge im Listenfeld lstFelder ausgewählt hat.

Listing 3: Aufruf der Mischfunktion

Private Sub cmdMischen_Click()
    If Me!lstFelder.ItemsSelected.Count = 0 Then
        MsgBox "Es wurden keine Felder zum Mischen ausgewählt.", vbOKOnly + vbExclamation
        Exit Sub
    End If
    If MsgBox("Sie ändern nun die Daten der Tabelle ''''. Fortsetzen", vbYesNo) = vbYes Then
        Call Mischen(Me!cboTabelle)
    End If
End Sub

Falls nicht, erscheint eine entsprechende Meldung und der Vorgang wird abgebrochen.

Anderenfalls gibt es einen Hinweis, dass die nachfolgend vorgenommenen änderungen nicht rückgängig gemacht werden können. Bestätigt der Benutzer diese Meldung, wird durch den Aufruf der Prozedur Mischen der eigentliche Mischvorgang gestartet – mehr dazu weiter unten.

Mischvorgang testen

Der Test des Mischvorgangs verläuft prinzipiell genau so wie der Vorgang selbst – allerdings wird die betroffene Tabelle zuvor kopiert und der Test anhand dieser Tabelle durchgeführt.

Verantwortlich für die Vorbereitungen und den Aufruf der Mischen-Prozedur ist die Prozedur, die durch das Ereignis Beim Klicken der Schaltfläche cmdTesten ausgelöst wird (s. Listing 4). Auch diese prüft zunächst die Anzahl der im Listenfeld lstFelder markierten Einträge, um den Benutzer gegebenenfalls darauf hinzuweisen, dass er noch keine Felder zum Mischen markiert hat.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar