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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 2/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 eine Methode kennen, um schnell aus realen Daten Testdaten zu erzeugen.

Techniken

Tabellen, VBA, Datenzugriff

Voraussetzungen

Access 2000 und höher

Beispieldateien

DatenMischen.mdb

Shortlink

www.access-im-unternehmen.de/773

Daten mischen

André Minhorst, Duisburg

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 Abb. 1 aus.

pic001.png

Abb. 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. Abb. 2).
  • pic002.png

    Abb. 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 Abb. 3 aus der Systemtabelle MSysObjects aus.

pic003.png

Abb. 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.

Listing 4: Testen der Mischfunktion

Private Sub cmdTesten_Click()

    Dim strTabelle As String

    Dim strTabelle_Test As String

    Dim db As DAO.Database

    Dim tdf As DAO.TableDef

    Dim prp As DAO.Property

    If Me!lstFelder.ItemsSelected.Count = 0 Then

        MsgBox "Es wurden keine Felder zum Mischen ausgewählt.", vbOKOnly + vbExclamation

        Exit Sub

    End If

    strTabelle = Me!cboTabelle

    strTabelle_Test = TabelleKopieren(strTabelle)

    Set db = CurrentDb

    Set tdf = db.TableDefs(strTabelle_Test)

    On Error Resume Next

    Set prp = tdf.Properties("Description")

    On Error GoTo 0

    If prp Is Nothing Then

        Set prp = tdf.CreateProperty(Name:="Description", Type:=dbText, Value:="~Mischer")

    End If

    tdf.Properties.Append prp

    Call Mischen(strTabelle_Test)

    Me!sfmTabelleTest.SourceObject = "Tabelle." & strTabelle_Test

    Me!reg.Value = 1

End Sub

Danach ruft die Prozedur die Funktion TabelleKopieren auf, die für das Herstellen der Kopie verantwortlich ist und weiter unten beschrieben wird. Als Ergebnis erhalten wir den Namen der neu erstellten Tabelle.

Die Prozedur legt daraufhin ein TableDef-Objekt mit einem Verweis auf die neue Tabelle an und fügt dieser eine Eigenschaft namens Description hinzu. Die Eigenschaft wird im gleichen Zuge mit dem Wert ~Mischer gefüllt.

Der Sinn dieser Aktion ist schlicht und einfach, die temporär für den Mischer erstellten Test-Tabellen so zu markieren, dass der Mischer diese beim Schließen des Formulars erkennen und gegebenenfalls entfernen kann.

Nach dem Anhängen dieser Eigenschaft ruft die Prozedur dann die Mischen-Prozedur auf, um die Werte der ausgewählten Felder in der Testtabelle durcheinanderzuwürfeln.

Schließlich stellt die Prozedur das Unterformular-Steuerelement sfmTabelleTest auf der zweiten Registerseite des Register-Steuerelements auf die neu erstellte Tabelle ein und wechselt auch gleich zu dieser Seite.

Tabelle für Test kopieren

Ein wichtiger Teil der vorherigen Prozedur besteht darin, eine Kopie der ausgewählten Tabelle zu Testzwecken anzulegen. Dies erledigt die Funktion TabelleKopieren (s. Listing 5).

Listing 5: Erstellen einer temporären Tabelle für Testzwecke

Private Function TabelleKopieren(strTabelle As String) As String

    Dim db As DAO.Database

    Dim strTabelleTemp As String

    Dim i As Integer

    Set db = CurrentDb

    On Error Resume Next

    strTabelleTemp = db.TableDefs(strTabelle & "_Temp_" & i).Name

    Do While Len(strTabelleTemp) > 0

        i = i + 1

        strTabelleTemp = ""

        strTabelleTemp = db.TableDefs(strTabelle & "_Temp_" & i).Name

    Loop

    On Error GoTo 0

    db.Execute "SELECT * INTO " & strTabelle & "_Temp_" & i & " FROM " & Me!cboTabelle, dbFailOnError

    RefreshDatabaseWindow

    TabelleKopieren = strTabelle & "_Temp_" & i

End Function

Diese Funktion erledigt im Wesentlichen zwei Aufgaben: Das Finden eines geeigneten Tabellennamens und das Kopieren der Tabelle. Dabei stellt die Funktion zunächst einen neuen Tabellennamen aus dem Namen der Quelltabelle, der Zeichenkette _Temp_ und einer laufenden Zahl zusammen, also beispielsweise tblArtikel_temp_0.

Dies ist nötig, falls der Benutzer gleich mehrere Tests mit der gleichen Tabelle durchführt - er braucht sich dann nicht um die manuelle Eingabe eines noch nicht verwendeten Tabellennamens zu kümmern.

Die Funktion prüft dann, ob es bereits eine Tabelle dieses Namens gibt. Falls ja, erhöht sie so lange den Zähler als letzten Bestandteil des Tabellennamens, bis ein freier Name gefunden wurde.

Ist dies geschehen, ruft sie eine Tabellenerstellungsabfrage auf, die beispielsweise so aussieht:

SELECT * INTO tblArtikel_Temp_0 FROM tblArtikel

Nach erfolgreicher Erstellung wird noch das Datenbankfenster beziehungsweise der Navigationsbereich aktualisiert sowie der Name der erzeugten Tabelle als Funktionswert zurückgegeben.

Der Mischvorgang

Spannend wird es beim Mischvorgang selbst. Die Prozedur aus Listing 6 führt dabei folgende drei Hauptaufgaben aus:

  • Erstellen eines temporären Recordsets, das einen Datensatz für jeden Datensatz der Quelltabelle enthält, aber nur die zu mischenden Felder
  • Füllen dieses temporären Recordsets mit den zu mischenden Werten sowie einem weiteren Feld mit einer Zufallszahl
  • Überschreiben der Felder mit den zu mischenden Werten aus der temporären Datensatzgruppe

Listing 6: Diese Prozedur führt den eigentlichen Mischvorgang durch.

Private Sub Mischen(strTabelle As String)

    '... Diese Prozedur sehen Sie als Abonnent von Access im Unternehmen in wenigen Tagen!

End Sub

Wichtig ist an dieser Stelle, dass Sie einen Verweis auf die Bibliothek Microsoft ActiveX Data Objects x.y Library hinzufügen (s. Abb. 4). Diese bietet im Gegensatz zur DAO-Bibliothek (Microsoft DAO 3.6 Object Library beziehungsweise Microsoft Office x.0 Access database engine Objects) den Vorteil, dass sie temporäre Recordsets erzeugen kann und somit keine weitere temporäre Tabelle nötig ist.

pic004.png

Abb. 4: Verweis auf die ADO-Bibliothek

Die Prozedur Mischen erwartet als einzigen Parameter den Namen der Tabelle, die sie bearbeiten soll. Im ersten Teil erstellt die Prozedur das temporäre ADO-Recordset sowie ein weiteres Recordset, das für den Zugriff auf die zu mischende Tabelle nötig ist. Letzteres wird mit den Daten der mit strTabelle übergebenen Tabelle gefüllt.

Das temporäre Recordset wird zunächst mit einem Feld namens Zufall (Datentyp Double) ausgestattet. Anschließend fügt die Prozedur innerhalb einer For Each-Schleife über alle markierten Einträge des Listenfeldes lstFelder für jedes markierte Feld ein weiteres Feld hinzu.

Den Feldnamen liest die Prozedur dabei direkt aus dem Listenfeld aus, den Datentyp sowie die Feldgröße aus der Datensatzgruppe mit der betroffenen Tabelle. Dies ist auch der Grund, warum nicht nur für das Erzeugen der temporären Datensatzgruppe, sondern auch für die Datensatzgruppe auf Basis der Quelltabelle ein ADO-Recordset verwendet wird: Informationen wie Datentyp oder Feldgröße können so direkt übernommen werden.

Mit Name, Datentyp und Feldgröße ausgestattet fügt die Append-Methode schließlich alle im Listenfeld ausgewählten Felder zur temporären Datensatzgruppe hinzu.

Nun folgt der zweite Teil: In einer Do While-Schleife über alle Datensätze der Tabelle mit den zu mischenden Daten schreibt die Prozedur die zu mischenden Daten in das temporäre Recordset. Dabei legt die Prozedur zunächst mit AddNew einen neuen Datensatz an und durchläuft dann in einer weiteren For Each-Schleife alle ausgewählten Felder, um deren Werte in den aktuellen Datensatz des temporären Recordsets zu übertragen.

Nachdem alle Felder durchlaufen wurden, schreibt eine letzte Anweisung noch einen Zufallswert in das Feld Zufall. Ein Aufruf der Update-Methode speichert den Datensatz, anschließend werden die übrigen Datensätze in das temporäre Recordset geschrieben.

Im dritten Teil werden nun die Datensatzzeiger beider Datensatzgruppen wieder auf den ersten Datensatz eingestellt. Zuvor wurde noch die Sortierung der temporären Datensatzgruppe geändert, und zwar aufsteigend nach dem Wert des Feldes Zufall. Dies garantiert eine gute Durchmischung.

Nun folgt eine weitere Do While-Schleife über alle Datensätze der Tabelle mit den zu verändernden Daten. Wieder werden für jeden Datensatz alle im Listenfeld lstFelder markierten Felder in einer For Each-Schleife durchlaufen. Am Ende eines jeden Durchlaufs schreibt die Prozedur die gemischten Werte aus dem temporären Recordset zurück in die Zieltabelle. Zuvor geschieht jedoch noch ein für eventuell vorhandene abhängige Felder wichtiger Schritt: Dort durchläuft eine letzte For Each-Schleife alle im Listenfeld lstFelderAbhaengig markierten Einträge und ändert die Werte dieser Felder in der Tabelle. Dabei ersetzt sie, soweit auffindbar, einen Teilausdruck des Wertes im abhängigen Feld, der mit dem Originalwert des aktuellen Feldes aus lstFelder übereinstimmt, mit dem neuen, durch die Mischung eingefügten Wert.

Im Überblick

Zum besseren Verständnis an dieser Stelle ein kleiner Überblick: Wir möchten etwa in einer Tabelle namens tblPersonal alle Kombinationen aus Vorname und Anrede durchmischen. Außerdem sollen Vorkommen des Vornamens im Feld EMail durch den neu zugeordneten Vornamen ersetzt werden. Die Tabelle hat beispielsweise zehn Datensätze. Dann legen wir ein temporäres Recordset mit den drei Feldern Zufall, Vorname und Anrede an. Dieses temporäre Recordset wird mit den entsprechenden Werten der Tabelle tblPersonal sowie dem Zufallswert gefüllt. Eine Sortierung nach diesem Zufallswert sorgt für die Durchmischung der Daten.

Dann wird das Recordset der originalen Tabelle (beziehungsweise der Testkopie) und der gemischten Daten gleichzeitig Datensatz für Datensatz durchlaufen. Dabei ersetzt die Prozedur Vorname und Anrede der Originaltabelle durch den aktuellen Datensatz des temporären Recordsets, also wird beispielsweise Andre durch Anja ersetzt und Herr durch Frau. Außerdem wird beispielsweise die E-Mail-Adresse andre@minhorst.com in anja@minhorst.com geändert, weil die Prozedur dort den Wert andre findet.

Formular schließen und temporäre Tabellen löschen

Fehlt nur der letzte Schritt, der nach dem Mischen der gewünschten Felder nötig ist: Beim Schließen des Formulars sollen die beim Mischen entstandenen temporären Tabellen gelöscht werden.

Dieser Vorgang ist etwas aufwendiger, weil ja genau die Tabellen gelöscht werden sollen, die beim Anlegen durch das Tool mit dem Wert ~Mischer für die Eigenschaft Description ausgestattet wurden. Die Prozedur aus Listing 7, die durch das Ereignis Beim Schließen des Formulars ausgelöst wird, fragt den Benutzer zunächst, ob die temporär angelegten Tabellen überhaupt gelöscht werden sollen - gegebenenfalls sollen diese ja weiterverwendet werden, während die Originaltabellen als Sicherheitskopie in der Datenbank verweilen.

Listing 7: Schließen des Formulars und Löschen der temporären Tabellen

Private Sub Form_Close()

    Dim db As DAO.Database

    Dim tdf As DAO.TableDef

    Dim strBeschreibung As String

    Dim bolLoeschen As Boolean

    bolLoeschen = MsgBox("Temporäre Tabelle(n) löschen?", vbYesNo) = vbYes

    Me!sfmTabelleTest.SourceObject = ""

    Set db = CurrentDb

    For Each tdf In db.TableDefs

        strBeschreibung = ""

        On Error Resume Next

        strBeschreibung = tdf.Properties("Description")

        On Error GoTo 0

        If strBeschreibung = "~Mischer" Then

            If bolLoeschen Then

                db.TableDefs.Delete tdf.Name

            Else

                tdf.Properties.Delete "Beschreibung"

            End If

        End If

    Next tdf

    RefreshDatabaseWindow

End Sub

In beiden Fällen durchläuft die Prozedur alle Tabellen der Datenbank. Findet sie eine Tabelle, deren Description den Wert ~Mischer aufweist, löscht sie diese entweder oder leert einfach die Eigenschaft - je nachdem, ob der Benutzer die Tabellen löschen wollte oder nicht.

Zusammenfassung und Ausblick

Diese Lösung dient dem schnellen Durchmischen realer Beispieldaten zum Zwecke der Entfremdung dieser Daten zur Weiterverwendung als Testdaten. Klären Sie mit dem Auftraggeber beziehungsweise seinem Datenschutzbeauftragten ab, ob so veränderte Daten als Beispieldaten zulässig sind - sicher ist sicher. Auf jeden Fall verkleinern Sie durch das Mischen der Daten das Risiko, dass diese nach einem Diebstahl irgendeinen Nutzen für Dritte haben.

Der Mischer bietet eine Menge Erweiterungspotenzial: So können Sie daraus beispielsweise ein Add-In erstellen, das in allen Datenbanken zur Verfügung steht.

Falls Sie öfter die Daten der gleichen Anwendung erhalten und durchmischen möchten, wäre es außerdem sinnvoll, die einzelnen Schritte beim Mischen festzuhalten. Sie könnten so das Durchmischen automatisieren und etwa durch einen einzigen Mausklick erledigen.

Falls Sie weitere Anregungen haben, schicken Sie uns einfach eine E-Mail an info@access-im-unternehmen.de!

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:

Download

Download

Die .zip-Datei enthält folgende Dateien:

DatenMischen.mdb

Beispieldateien downloaden

© 2003-2015 André Minhorst Alle Rechte vorbehalten.