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

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2010.

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 einen Assistenten kennen, mit dem Sie Ihre Tabellen per Mausklick mit Beispieldaten füllen.

Techniken

Formulare, VBA

Voraussetzungen

Access 2002 und höher

Beispieldateien

Beispieldaten-Assistent.mda

Shortlink

www.access-im-unternehmen.de/745

Der Beispieldaten-Assistent

André Minhorst, Duisburg

Auch wenn Software-Entwicklung mit Access normalerweise eine rundum beglückende glücklich machende Beschäftigung ist, so gibt es doch Tätigkeiten, die man nur lustlos ausführt. Der Autor dieser Zeilen etwa ist immer etwas ungehalten, wenn er Beispieldaten in eine oder mehrere Tabellen eingeben muss. Ist das nicht die langweiligste Arbeit überhaupt? Im krassen Gegensatz dazu steht die Aufgabe, einen Assistenten zu programmieren, der einem diese lästige Arbeit abnimmt! Einfach die Zieltabelle auswählen, für jedes Feld die Art der Testdaten auswählen und loslegen - lesen Sie hier, wie das funktioniert!

Herr Fritz Mustermann, Teststraße 1, 12345 Beispielhausen, Deutschland. Telefon 0123/456789, Telefax 0123/987654. Frau Martha Müller ... halt! So geht es nicht weiter. Selbst wenn der Kopf vom Programmieren raucht - Testdaten eingeben ist keine willkommene Abwechslung.

Stattdessen führen wir doch lieber die folgenden Schritte durch:

  • Klicken Sie auf den Menüeintrag Extras|Add-Ins|Beispieldaten-Assistent (Access 2003 und älter) oder den Ribbon-Eintrag Datenbanktools|Add-Ins|Beispieldaten-Assistent (Access 2007 und jünger).
  • Es erscheint der Beispieldaten-Assistent (s. Abb. 1). Wählen Sie hier die Tabelle aus, die Sie mit Beispieldaten bestücken möchten. Die Liste im unteren Bereich des Beispieldaten-Assistenten zeigt nun alle Felder dieser Tabelle an.
  • Geben Sie die Anzahl der Datensätze ein, die der Beispieldaten-Assistent für Sie anlegen soll.
  • Betrachten Sie die Liste der Felder der zu füllenden Tabelle. Alle Felder enthalten in der Spalte Füllen einen Haken. Wenn Sie ein Feld nicht mit Beispieldaten füllen möchten, entfernen Sie einfach den entsprechenden Haken.
  • In der dritten Spalte finden Sie in einigen Zeilen den Eintrag <Auswählen>, in anderen wurden bereits automatisch andere Einträge ausgewählt - zum Beispiel Vorname oder Nachname. Hier stellen Sie die Art der Daten ein, mit der Sie das entsprechende Feld füllen wollen - dazu später mehr.
  • Für manche Datenarten zeigt der Assistent oberhalb der Liste Informationen für Parameter 1, Parameter 2 und Parameter 3 an. Hierbei handelt es sich um zusätzliche Parameter, mit denen Sie etwa für das Anlegen von Datumsangaben den Bereich der Daten eingrenzen (beispielsweise 1.1.2010 bis 30.6.2010).
  • Wenn Sie alle Informationen angegeben haben, brauchen Sie nur noch auf die Schaltfläche Beispieldaten schreiben zu klicken - schon legt der Beispieldaten-Assistent 100, 1.000 oder noch mehr Beispieldatensätze an. Je nach Konfiguration der zu erstellenden Daten kann dies einige Sekunden dauern - aber besser einen Kaffee trinken gehen, als selbst Beispieldaten einzugeben!

pic001.png

Abb. 1: Der Beispieldaten-Assistent im Einsatz

Beispieldaten-Arten

Wie bereits angedeutet, gibt es verschiedene Arten von Beispieldaten. Nachfolgend stellen wir diese vor und erläutern die Parameter, die Sie zum Anlegen dieser Daten festlegen müssen.

  • Vorname: Vornamen werden per Zufall aus einer Tabelle gefüllt.
  • Nachname: Gleiches gilt für Nachnamen: Auch sie werden zufällig aus einer Tabelle ausgewählt.
  • AnredeID: Wenn die Zieltabelle ein Feld namens AnredeID enthält, das auf einer Tabelle namens tblAnreden oder ähnlich basiert, die zwei Felder etwa namens AnredeID und Anrede enthält, können Sie diesen Datentyp verwenden. Er trägt automatisch die AnredeID der Tabelle tblAnreden in das Zielfeld ein, das dem Geschlecht des Vornamens des Datensatzes entspricht. Die drei Parameter erwarten die Angabe der Tabelle, aus der die Anreden entnommen werden, den Namen des Primärschlüsselfeldes dieser Tabelle sowie den Namen des Feldes, das die Anreden selbst enthält.
  • Firma: Die Firma besteht aus einem Eintrag der Nachnamen-Sammlung plus einem zufälligen Wert wie GmbH, AG et cetera.
  • Straße: Die Straße wird zufällig einer Straßen-Tabelle entnommen.
  • Hausnummer: Die Hausnummern werden zur Laufzeit per Zufallsgenerator erzeugt. Mit Parameter 1 legen Sie den kleinsten Wert, mit Parameter 2 den höchsten Wert für die Hausnummer fest. Das Tool legt den Bereich standardmäßig auf 1 - 100 fest.
  • Straße mit Hausnummer: Fügt die Informationen wie in Straße und Hausnummer gleichzeitig in ein Feld ein. Auch hier können Sie den Zahlenbereich für die Hausnummer festlegen.
  • PLZ: Die PLZ wird gemeinsam mit dem Ort aus einer Tabelle einiger realer Kombinationen aus PLZ, Ort, Bundesland, Land und Vorwahl zufällig ausgewählt.
  • Ort: siehe PLZ
  • PLZ und Ort: Fügt PLZ und Ort gleichzeitig in ein Feld ein.
  • Land: siehe PLZ
  • Bundesland: siehe PLZ
  • Telefon: Besteht aus Vorwahl und Rufnummer. Die Vorwahl wird ebenfalls aus der Tabelle mit PLZ, Ort und so weiter ermittelt. Die Rufnummer wird per Zufallsgenerator festgelegt. Parameter 1 und Parameter 2 geben die minimale und die maximale Anzahl Stellen der Telefonnummer an, die Standardwerte sind 6 und 8.
  • E-Mail: Die E-Mail wird aus dem Vornamen und dem Nachnamen nach dem Schema <Vorname>@<Nachname>.de zusammengesetzt.
  • Anrede: Wenn es kein Lookup-Feld für die Anrede gibt, sondern nur ein normales Textfeld, trägt diese Datenart je nach dem für den Datensatz ermittelten Vornamen die Anrede Herr oder Frau ein.
  • Geschlecht: Auch das Geschlecht wird entsprechend dem gewählten Vornamen eingestellt.
  • Internet: Die Internetadresse wird nach dem Schema www.<Nachname>.de zusammengestellt.
  • Zahlen: Zahlen werden nach dem Zufallsprinzip ausgewählt. Parameter 1 gibt dabei die untere Grenze der Zahl an, Parameter 2 die obere Grenze und Parameter 3 die Anzahl der Stellen hinter dem Komma.
  • Datum: Auch das Datum wird per Zufallsgenerator ermittelt. Parameter 1 gibt die Untergrenze, Parameter 2 die Obergrenze des Datumsbereichs an.
  • Fremdschlüsselfeld/Nachschlagefeld: Dieser Datentyp ist besonders interessant: Sie können damit Daten aus einer beliebigen Lookup-Tabelle auswählen lassen. Der erste Parameter nimmt dabei den Namen der Lookup-Tabelle auf, der zweite den Namen des Primärschlüsselfeldes dieser Tabelle. Für diesen Datentyp wird je Datensatz ein zufälliger Eintrag der Lookup-Tabelle ausgewählt.
  • Ja/Nein: Dieser Datentyp wählt einen der Werte -1 oder 0 aus. Mit dem ersten Parameter geben Sie einen Wert zwischen 1 und 100 für die Wahrscheinlichkeit für den Wert -1 an.
  • Nummerierte Texte: Für manche Felder ist es schwierig, sinnvolle Zufallswerte zu ermitteln - zum Beispiel Projektnamen. In diesem Fall sollten Sie mit Werten wie Projekt 1, Projekt 2 et cetera vorlieb nehmen. Für diesen Fall verwenden Sie den Datentyp Nummerierte Texte: Sie geben für den ersten Parameter eine beliebige Zeichenkette an, die an irgendeiner Stelle den Ausdruck [] enthält. Für den zweiten Parameter geben Sie die Startzahl an. Ein Ausdruck wie Projekt [] führt bei der Startzahl 12 zu den Beispielwerten Projekt 12, Projekt 13 und so weiter.

Beispiel zum Anlegen von Beispieldaten

Schauen wir uns an, wie der Beispieldaten-Assistent bei einer einfachen Adressentabelle arbeitet. Nachdem Sie die Datenbankdatei mit der zu füllenden Tabelle geöffnet und den Beispieldaten-Assistenten gestartet haben, wählen Sie mit dem Kombinationsfeld im oberen Bereich zunächst die Zieltabelle aus, in diesem Fall tblAdressen. Dann tragen Sie die Anzahl der gewünschten Datensätze ein, zum Beispiel 100. Schließlich geht es an die Festlegung der Art der einzufügenden Daten.

Hier nimmt Ihnen der Beispieldaten-Assistent eine Menge Arbeit ab: Er scannt nämlich die Feldnamen und vergleicht die Werte mit einer beliebig erweiterbaren Mapping-Tabelle, die gleich den richtigen Datentyp für das Hinzufügen der Beispieldaten auswählt.

Für unsere Tabelle tblAdressen bleibt somit nur noch wenig zu tun (s. Abb. 2): Alle Felder wurden gleich mit den richtigen Datentypen versehen. Außerdem hat der Assistent für die Felder, für die Standardwerte vorzugeben sind, passende Werte eingetragen. Dies betrifft beispielsweise das Feld AnredeID. Hier hat der Assistent erkannt, dass womöglich eine Tabelle hinter dem Kombinationsfeld zur Auswahl der Anrede steckt, und gleich die richtigen Parameter voreingestellt: Parameter1 erhält mit tblAnreden die Tabelle, aus der die Anreden stammen, Parameter2 den Namen des Primärschlüsselfeldes dieser Tabelle und Parameter3 das Feld, das schließlich die verwendeten Anreden enthält. Ein weiteres Beispiel ist das Feld Straße, in dem die Felder Parameter1 und Parameter2 mit 1 und 100 den Bereich der Hausnummern enthalten. Auch bei den Feldern Telefon und Telefax wurden automatisch die Parameter für den Datentyp Telefon eingetragen, nämlich die Anzahl der Stellen der Telefonnummer hinter der Vorwahl.

pic002.png

Abb. 2: Die Datenarten werden je nach Feldname gleich automatisch hinzugefügt.

Ein Klick auf die Schaltfläche Beispieldateien schreiben startet den eigentlichen Vorgang, wobei die Anzahl der geschriebenen Datensätze neben der Schaltfläche angezeigt wird. Das Ergebnis beeindruckt: Schnell landen 100 sehr realistisch wirkende Beispieldatensätze in der Tabelle tblAdressen (s. Abb. 3).

pic003.png

Abb. 3: Die Adressen-Tabelle mit frisch angelegten Beispieldaten

Beispieldaten mit Lookup-Tabellen

Wenn Sie schnell Daten in mehreren Tabellen anlegen möchten, erledigen Sie dies hintereinander. Nehmen wir an, Sie möchten die Tabellen des Datenmodells aus Abb. 4 mit Daten füllen. Dann brauchen Sie zunächst eine Reihenfolge, die sich zum größten Teil danach richtet, wie die Tabellen miteinander verknüpft sind. Wir müssen natürlich erst die Tabellen mit Daten füllen, auf die von anderen Tabellen aus per Fremdschlüsselfeld verwiesen wird. Der einfachste Fall ist die Tabelle tblAnreden: Sie wird von zwei Tabellen referenziert und verweist auf keine andere Tabelle. Sie ist aber auch kein Fall für den Beispieldaten-Assistenten, denn die beiden Datensätze mit den Werten Herr und Frau für das Feld Anrede füllen wir schnell von Hand.

pic004.png

Abb. 4: Die Tabellen dieses Datenmodells sollen mit dem Beispieldaten-Assistenten gefüllt werden.

Alle übrigen Tabellen verweisen auf mindestens eine andere Tabelle. Die beiden Tabellen tblKunden und tblMitarbeiter besitzen jedoch nur Fremdschlüsselfelder zur Tabelle tblAnreden, die ja schon gefüllt ist. Also können wir diese zuerst mit Beispieldaten befüllen. Danach kommt die Tabelle tblProjekte dran, die wiederum auf tblKunden verweist - und diese Tabelle wird ja gleich zu Beginn gefüllt. Die letzte zu füllende Tabelle ist die Tabelle tblMitarbeiterProjekte, die festlegt, welcher Mitarbeiter in welchem Projektteam sitzt.

Beginnen wir also mit der Kundentabelle. Die Parameter für diese Tabelle zeigt Abb. 5. Für das Feld Kunde verwenden wir den Datentyp Firma, der praktisch identisch ist. Später erfahren Sie, wie Sie das Mapping von Feldnamen erweitern können, sodass etwa ein Eintrag wie Kunde direkt auf den Datentyp Firma gemappt wird. Die meisten der übrigen Felder werden automatisch erkannt. Sie müssen lediglich noch das Feld KundeSeit und Aktiv einstellen. Ersteres soll mit Datumsangaben gefüllt werden, wobei der Eintritt frühestens am 1. Januar 2003 und spätestens am 30. Juni 2010 erfolgt sein soll. Das Feld Aktiv soll mit Ja/Nein-Werten gefüllt werden, wobei 60% der Datensätze den Wert Ja annehmen sollen.

pic005.png

Abb. 5: Einstellungen zum Füllen einer Kundentabelle

Die Tabelle tblMitarbeiter birgt ebenfalls keine Überraschungen, was die zu füllenden Felder betrifft (s. Abb. 6). Allein die Anzahl sollten wir im Verhältnis zu den Kunden ein wenig reduzieren - 20 sollten für Beispielzwecke ausreichen. Danach widmen wir uns den Projekten und somit der Tabelle tblProjekte. Hier haben wir es mit zwei bislang noch nicht vorgekommenen Datentypen zu tun: Das Feld Projektbezeichnung füllen wir mit den Werten Projekt 1, Projekt 2 und so weiter. Das Feld KundeID hingegen ist ein Fremdschlüsselfeld, das zufällig mit den Werten der Tabelle tblKunden gefüllt werden soll, wobei das Feld KundeID als Primärschlüsselfeld der verknüpften Tabelle angegeben werden muss. Insgesamt wollen wir die Tabelle mit 50 Datensätzen füllen (s. Abb. 7).

pic006.png

Abb. 6: Mitarbeiter werden auch benötigt - 20 sollten jedoch ausreichen.

pic007.png

Abb. 7: Die Tabelle tblProjekte benötigt einen durchnummerierten Text und Verweise auf eine andere Tabelle.

Wie Abb. 8 zeigt, sind unsere Bemühungen durchaus von Erfolg gekrönt: Die Tabelle tblProjekte enthält die erwarteten Texte und ist wie gewünscht mit den Datensätzen der Tabelle tblKunden verknüpft.

pic008.png

Abb. 8: Eine per Beispieldaten-Assistent gefüllte Projekttabelle

Fehlt nur noch die Tabelle tblMitarbeiterProjekte, mit der wir die Mitarbeiter den einzelnen Projekten zuteilen und so Projektteams bilden. Die Tabelle enthält lediglich zwei Fremdschlüsselfelder, was aber nicht weiter schlimm ist: Der Beispieldaten-Assistent erkennt selbstständig, dass die beiden Felder MitarbeiterID und ProjektID Fremdschlüsselfelder sind, und liest die entsprechenden Parameter aus. So sollen die Werte für das Feld MitarbeiterID aus der Tabelle tblMitarbeiter mit dem Primärschlüsselfeld MitarbeiterID und die Werte für das Feld ProjektID aus der Tabelle tblProjekte mit dem Primärschlüsselfeld ProjektID entnommen werden. Auch dies gelingt, wie Abb. 9 zeigt, problemlos.

pic009.png

Abb. 9: Auch das Füllen von Verknüpfungstabellen ist problemlos möglich.

Der Assistent enthält sogar Funktionalität, die dafür sorgt, dass Fehler beim Anlegen von Datensätzen, welche die Integrität verletzen, abgefangen werden. Die Tabelle tblMitarbeiterProjekte enthält beispielsweise einen eindeutigen, zusammengesetzten Index für die beiden Felder MitarbeiterID und ProjektID. Dies führt beim Versuch, einen Mitarbeiter zweimal zum gleichen Projekt hinzuzufügen, normalerweise zu einem Fehler.

Der Beispieldaten-Assistent sieht darüber hinweg und legt einfach einen weiteren Datensatz an - solange, bis er ausreichend passende Kombinationen gefunden hat. Das Ergebnis können Sie in Abb. 10 betrachten.

pic010.png

Abb. 10: Die Tabelle tblMitarbeiterProjekte mit frischen Daten

Mapping bearbeiten

Das Hauptformular des Beispieldaten-Assistenten besitzt eine Schaltfläche mit der Beschriftung Mapping bearbeiten, mit der Sie den Dialog aus Abb. 11 öffnen können.

pic011.png

Abb. 11: In diesem Dialog können Sie festlegen, welche Datenarten die Beispieldaten für Felder mit bestimmten Namen aufweisen sollen.

Dieser Dialog bietet eine Liste aller vordefinierten Mappings. Ein Mapping bewirkt Folgendes: Wenn Sie im Beispieldaten-Assistenten die zu füllende Tabelle auswählen, analysiert der Assistent zunächst die Feldnamen aller in der Tabelle enthaltenen Felder. Wenn er auf ein Feld namens Vorname stößt, legt er als Datenart für das Hinzufügen von Beispieldaten automatisch den Typ Vorname fest. Gleiches gilt für alle im Dialog Datenart-Mapping angezeigten Feldnamen: Alle besitzen eine Datenart, die automatisch beim Auswählen einer neuen Tabelle für Felder mit entsprechender Bezeichnung festgelegt wird.

Der Autor hat die Mappings so festgelegt, dass die meisten der in seinen Tabellen vorkommenden Feldnamen automatisch erkannt und auf eine der Datenarten gemappt werden können. Möglicherweise verwenden Sie für das eine oder andere Feld standardmäßig eine andere Bezeichnung, was aber kein Problem ist: Sie können die Zuweisung der Datenarten problemlos anpassen, indem Sie entweder zusätzliche Mappings anlegen oder bestehende anpassen.

Eine Ausnahme macht der Beispieldaten-Assistent übrigens für Fremdschlüsselfelder: Diese werden immer mit der Datenart Fremdschlüsselfeld/Lookuptabelle verknüpft, außerdem stellt der Beispieldaten-Assistent automatisch die ersten beiden Parameter auf die verknüpfte Tabelle und den Namen ihres Primärschlüsselfeldes ein.

Wie funktioniert der Beispieldaten-Assistent?

Der Beispieldaten-Assistent ist als Menü-Add-In ausgelegt, das heißt, dass Sie ihn über den Menüpunkt Extras|Add-Ins|Add-In-Manager (Access 2003 und älter) beziehungsweise den Ribbon-Eintrag Datenbanktools|Add-Ins|Add-In-Manager (Access 2007 und jünger) installieren müssen. Dort erscheint der Dialog Add-In-Manager, mit dem Sie die Datei Beispieldaten-Assistent.mda aus dem Verzeichnis auswählen, in dem Sie diese gespeichert haben, und diesen so installieren (s. Abb. 12).

pic012.png

Abb. 12: Installieren des Beispieldaten-Assistenten

Die Add-In-Datei Beispieldaten-Assistent.mda enthält eine Tabelle namens USysRegInfo. Diese liefert die Informationen, die beim Installieren des Add-Ins in die Windows-Registry eingetragen werden. Access liest diese Informationen beim Start aus und entdeckt, dass es in der Liste der Menü-Add-Ins einen Eintrag namens Beispieldaten-Assistent einfügen soll, der beim Anklicken unsere Add-In-Datei startet. Einzelheiten zum Erstellen solcher Add-Ins erhalten Sie im Beitrag Access-Add-Ins (www.access-im-unternehmen.de/643).

Funktionsweise des Hauptformulars

Das Hauptformular heißt frmBeispieldaten und sieht in der Entwurfsansicht wie in Abb. 13 aus.

pic013.png

Abb. 13: Das Hauptformular des Assistenten in der Entwurfsansicht

Die Auswahl der mit Beispieldaten zu füllenden Tabelle erfolgt über ein Kombinationsfeld namens cboTabellen. Dieses wird gleich beim Öffnen des Formulars mit den Namen der Tabellen der betroffenen Datenbankdatei gefüllt. Dies erledigt die folgende Prozedur, die durch das Ereignis Beim Öffnen des Formulars ausgelöst wird:

Private Sub Form_Open(Cancel As Integer)

    Dim objTable As Object

    Dim strTable As String

    Do While Me!cboTabellen.ListCount > 0

        Me!cboTabellen.RemoveItem 0

    Loop

    Me!cboTabellen.AddItem "<Auswählen>"

    For Each objTable In CurrentData.AllTables

        strTable = objTable.Name

        If Not strTable Like "MSys*" And Not strTable Like "USys*" Then

            Me!cboTabellen.AddItem strTable

        End If

    Next objTable

    Me!cboTabellen = Me!cboTabellen.ItemData(0)

End Sub

Die Prozedur verwendet die RemoveItem- und die Add-Methoden des Kombinationsfeldes, um alle Tabellen anzuzeigen, deren Name nicht mit MSys... oder USys... beginnt - dies sind Systemtabellen, die sicher nicht mit Beispieldaten gefüllt werden sollen. Als erster Eintrag wird jedoch der Wert <Auswählen> hinzugefügt. Damit dieser gleich beim Öffnen des Formulars im Kombinationsfeld erscheint, stellt die letzte Anweisung der Prozedur den Wert des Kombinationsfeldes auf den Wert des ersten Eintrags, hier <Auswählen>, ein.

Auswahl einer Tabelle

Die Auswahl einer Tabelle löst die Prozedur aus Listing 1 aus. Sie verwendet zwei Objektvariablen des Typs Database, um jeweils einen Verweis auf die geöffnete und einen auf die Add-In-Datenbank zu speichern. Der Hintergrund ist, dass das Add-In sowohl auf die Tabellen des Frontends zugreifen muss (um die Beispieldaten zu schreiben) als auch auf die Daten der Add-In-Datenbank (etwa um Beispieldaten aus den dafür vorgesehenen Tabellen auszulesen).

Listing 1: Füllen des Unterformulars mit den Feldern der ausgewählten Tabelle und den entsprechenden Datenarten und Parametern

Private Sub cboTabellen_AfterUpdate()

    'Deklaration aus Platzgründen nicht abgedruckt

    Set db = CurrentDb

    Set dbc = CodeDb

    If Me!cboTabellen = "<Auswählen>" Then

        Exit Sub

    End If

    strTable = Me!cboTabellen

    dbc.Execute "DELETE FROM tblTabellenfelder", dbFailOnError

    Me!frmTabellenfelder.Form.Requery

    Set tdf = db.TableDefs(strTable)

    For Each fld In tdf.Fields

        lngDatenartID = Nz(CLookup("DatenartID", "tblDatenartMapping", "Feldname = '" & fld.Name & "'"))

        strParameter1 = Nz(CLookup("Parameter1", "tblDatenarten", "DatenartID = " & lngDatenartID), "")

        strParameter2 = Nz(CLookup("Parameter2", "tblDatenarten", "DatenartID = " & lngDatenartID), "")

        strParameter3 = Nz(CLookup("Parameter3", "tblDatenarten", "DatenartID = " & lngDatenartID), "")

        On Error Resume Next

        strDisplayControl = fld.Properties("DisplayControl")

        If Err.Number = 0 Then

            Select Case strDisplayControl

                Case 109 'Textbox

                Case 106 'Checkbox

                Case 111 'ComboBox

                    If fld.Properties("RowSourceType") = "Table/Query" Then

                        Set rstCombo = db.OpenRecordset(fld.Properties("RowSource"), dbOpenDynaset)

                        strParameter1 = rstCombo.Fields(0).SourceTable

                        strParameter2 = rstCombo.Fields(fld.Properties("BoundColumn") - 1).Name

                        If lngDatenartID = 14 Then 'AnredeID

                            strColumnWidths = fld.Properties("ColumnWidths")

                            For i = LBound(Split(strColumnWidths, ";")) To

                                UBound(Split(strColumnWidths, ";"))

                                If Split(strColumnWidths, ";")(i) > 0 Then

                                    strParameter3 = rstCombo.Fields(i).Name

                                    Exit For

                                End If

                            Next i

                        Else

                            lngDatenartID = 20

                        End If

                    End If

                Case Else

                    Debug.Print strDisplayControl

            End Select

        Else

            strDisplayControl = ""

        End If

        On Error GoTo 0

        dbc.Execute "INSERT INTO tblTabellenfelder(Tabellenfeld, Fuellen, DatenartID, Parameter1, _

            Parameter2, Parameter3) VALUES('" & fld.Name & "', True, " & lngDatenartID & ", '" _

            & strParameter1 & "', '" & strParameter2 & "', '" & strParameter3 & "')", dbFailOnError

    Next fld

    Me!frmTabellenfelder.Form.Requery

End Sub

Den Verweis auf die aktuelle Datenbank liefert die Funktion CurrentDB, den auf die Add-In-Datenbank die Funktion CodeDB.

Die Prozedur speichert den Namen der Tabelle in einer Variablen und löscht dann zunächst alle Einträge der Tabelle tblTabellenfelder. Diese Tabelle speichert die Konfiguration zum Anlegen der Beispieldaten in der ausgewählten Tabelle (s. Abb. 14) und dient auch als Datenherkunft des Unterformulars frmTabellenfelder, mit dem der Benutzer die Konfiguration editieren kann.

pic014.png

Abb. 14: Diese Tabelle der Add-In-Datenbank speichert die Konfiguration für das anstehende Einfügen der Beispieldaten.

Anschließend erzeugt die Prozedur ein TableDef-Objekt auf Basis dieser Tabelle und durchläuft ihre Felder, wobei das aktuelle Feld jeweils mit der Field-Variablen fld referenziert wird.

Hier kommt das bereits erwähnte Mapping von Feldern mit bestimmten Feldnamen auf die für das Anlegen vorgesehenen Datenarten ins Spiel: Die Funktion CLookup durchsucht die Tabelle tblDatenartMapping und liefert eine DatenartID zurück, wenn sie einen Eintrag gefunden hat, der den Feldnamen des aktuellen Feldes enthält.

Warum CLookup und nicht DLookup? Nun: DLookup greift immer auf die Daten der aktuell geöffneten Datenbank zu, aber nicht auf die in der Add-In-Datenbank gespeicherten Tabellen. Daher haben wir eine kleine Ersatzfunktion geschrieben, die genau so wie DLookup funktioniert, aber die Tabellen der Add-In-Datenbank verwendet. Sie finden diese Funktion im Modul mdlTools der Add-In-Datenbank. Desweiteren lesen drei Aufrufe von CLookup eventuell voreingestellte Parameter ein und schreiben diese in entsprechende Variablen.

Falls der Benutzer eine Beschriftung für ein Tabellenfeld eingegeben hat, wird diese statt des Feldnamens verwendet.

Danach erfolgt eine Untersuchung der Anzeige des jeweiligen Feldinhalts: Hier kommen Textfelder, Kontrollkästchen und Kombinationsfelder zum Einsatz. Falls es sich um ein Kombinationsfeld handelt, prüft die Prozedur, ob dieses Daten aus einer verknüpften Tabelle anzeigt. Falls ja, erhält das aktuelle Feld als Datenart den Eintrag Fremdschlüsselfeld/Lookuptabelle und die Parameter werden auf den Namen der verknüpften Tabelle sowie ihres Primärschlüsselfeldes eingestellt.

Felder, die zuvor über die Mapping-Tabelle für die Datenart AnredeID erkannt wurden, erhalten ebenfalls eine Sonderbehandlung, da auch deren Inhalt meist aus einer verknüpften Tabelle stammt.

Schließlich wird für jedes Feld ein Datensatz in die Tabelle tblTabellenfelder der Add-In-Datenbank geschrieben. Nach dem Durchlaufen aller Felder der Tabelle aktualisiert die Prozedur schließlich das Unterformular frmTabellenfelder.

Schreiben der Beispieldaten

Wenn der Benutzer die über das Mapping ermittelte Konfiguration geprüft und gegebenenfalls korrigiert hat, betätigt er die Schaltfläche Beispieldaten schreiben.

Diese löst einen etwas umfangreicheren Vorgang aus, der im Wesentlichen durch die Prozedur cmdBeispieldaten_Click gesteuert wird (Listing 2 zeigt eine stark gekürzte Fassung). Diese Prozedur prüft zunächst ein paar Eingaben, zum Beispiel, ob der Benutzer eine Tabelle ausgewählt und die gewünschte Anzahl Datensätze angegeben hat.

Listing 2: Gekürzte Fassung der Prozedur, die das Schreiben der Beispieldaten steuert

Private Sub cmdBeispieldatenSchreiben_Click()

    '...

    Set objBeispieldaten = New clsBeispieldaten

    Set rst = db.OpenRecordset("SELECT * FROM " & Me!cboTabellen & " WHERE 1 = 2", dbOpenDynaset)

    Set rstTabellenfelder = dbc.OpenRecordset("SELECT * FROM tblTabellenfelder WHERE DatenartID IS " _

        & "NOT NULL", dbOpenDynaset)

    DoCmd.Hourglass True

    Me!lbl.Visible = True

    Me!lblAnzahl.Visible = True

    For i = 1 To Me!txtAnzahlDatensaetze

        DoEvents

        Me!lblAnzahl.Caption = i & "/" & Me!txtAnzahlDatensaetze

        With objBeispieldaten

            rst.AddNew

            .GetVorname strVorname, strGeschlecht, strAnrede

            .GetNachname strNachname

            '... weitere Get...-Aufrufe

            Do While Not rstTabellenfelder.EOF

                strLand = "Deutschland"

                strEMail = LCase(strVorname & "@" & strNachname & ".de")

                strInternet = LCase("http://www." & strNachname & ".de")

                Select Case rstTabellenfelder!DatenartID

                    Case 1 'Vorname

                        rst(rstTabellenfelder!Tabellenfeld).Value = strVorname

                    Case 2 'Nachname

                        rst(rstTabellenfelder!Tabellenfeld).Value = strNachname

                        '... Behandlung weiterer Datenarten

                End Select

                rstTabellenfelder.MoveNext

            Loop

        End With

        rst.Update

        rstTabellenfelder.MoveFirst

    Next i

    Me!lblAnzahl.Visible = False

    Me!lbl.Visible = False

    DoCmd.Hourglass False

End Sub

Es gibt eine Reihe Funktionen, die Beispieldaten auf Basis der Datenart erzeugen. All diese Funktionen stecken in der Klasse clsBeispieldaten, die in der Prozedur cmdBeispieldaten_Click deklariert und instanziert wird.

Danach erzeugt die Prozedur ein Recordset namens rst auf Basis der angegebenen Tabelle, wobei als Kriterium der Ausdruck 1=2 verwendet wird, um bereits enthaltene Datensätze nicht zu berücksichtigen. Ein weiteres Recordset namens rstTabellenfelder wird mit allen Datensätzen der Tabelle tblTabellenfelder gefüllt, also mit der kompletten Konfiguration der anzulegenden Beispieldaten.

Die beiden Bezeichnungsfelder lbl und lblAnzahl werden eingeblendet, um den Fortschritt anzuzeigen. Schließlich startet das eigentliche Ermitteln der Beispieldaten und der Schreibvorgang, und zwar in einer For...Next-Schleife. Diese wird entsprechend der Anzahl der zu erzeugenden Datensätze durchlaufen.

Dabei ermittelt die Prozedur, unabhängig davon, ob solche Daten benötigt werden, einen Satz mit Vorname, Nachname, Anrede, Firma, Straße und weiteren typischen Daten einer Adresse. Dazu verwendet sie verschiedene Methoden der Klasse clsBeispieldaten, von denen wir später einige kurz vorstellen. Der Grund, warum diese Daten vorab in einem Rutsch ermittelt werden, ist einfach: Die Beispieldaten sollen möglichst realistisch sein. Daher werden beispielsweise die E-Mail-Adresse auf den Namen (<Vorname>@<Nachname>.de) oder die Postleitzahl auf den Ort abgestimmt (genau so wie Bundesland, Land und Telefonvorwahl).

Nachdem die grundlegenden Daten für diesen Datensatz ermittelt wurden, durchläuft die Prozedur die einzelnen Felder in einer Do While-Schleife über die Datensätze des Recordsets rstTabellenfelder und füllt diese. Hier kommen weitere Methoden der Klasse clsBeispieldaten zum Einsatz, zum Beispiel GetDatum, GetLookup, GetZahl et cetera.

Schauen wir uns beispielhaft einige der Get...-Methoden und ihren Aufruf an.

Ermittlung von Vorname, Geschlecht und Anrede

Vorname, Geschlecht und Anrede sind eng miteinander verbunden, da der Vorname meist das Geschlecht und somit die Anrede (Herr oder Frau) vorgibt. Zum Speichern dieser Daten deklariert die Prozedur cmdBeispieldaten_Click drei Variablen namens strVorname, strGeschlecht und strAnrede. Diese übergibt sie der Methode GetVorname des Objekts objBeispieldaten:

.GetVorname strVorname, strGeschlecht, strAnrede

Die Methode GetVorname erzeugt ein Recordset auf Basis der Abfrage qryVornameZufall. Diese ermittelt einen Datensatz der Tabelle tblVornamen, der auch gleich Geschlecht und Anrede mitliefert. Die ermittelten Werte schreibt die Methode in die von der aufrufenden Instanz übergebenen Variablen:

Public Sub GetVorname(Optional strVorname As String, Optional strGeschlecht As String, Optional strAnrede As String)

    Set rst = dbc.OpenRecordset("qryVornameZufall", dbOpenDynaset)

    strAnrede = rst!Anrede

    strVorname = rst!Vorname

    strGeschlecht = rst!Geschlecht

End Sub

Nach einem gleichen oder ähnlichen Prinzip funktionieren die Methoden zur Ermittlung der übrigen Datenarten.

Die Abfrage qryVornameZufall funktioniert nach einem ganz einfachen Prinzip: Sie enthält alle Felder der Tabelle tblVornamen sowie ein zusätzliches Feld. Dieses ermittelt auf Basis des Primärschlüsselwertes der Tabelle einen Zufallswert, der als Sortierkriterium der Ergebnisse dient. Gleichzeitig ist die Anzahl der zurückzugebenden Datensätze auf einen limitiert. Den Aufbau dieser Abfrage zeigt Abb. 15.

pic015.png

Abb. 15: Diese Abfrage liefert einen zufällig ausgewählten Datensatz der zugrunde liegenden Tabelle.

Ermittlung von Zahlen

Ein weiteres interessantes Beispiel ist die Methode zum Ermitteln einer Zufallszahl. Diese erwartet drei Parameter: den kleinsten Wert, den größten Wert sowie die Anzahl der Nachkommastellen. Werden diese nicht übergeben, liefert die Methode Zahlen zwischen 1 und 1.000 ohne Nachkommastelle:

Public Sub GetZahl(varZahl As Variant, Optional dblMin As Double, Optional dblMax _

        As Double, Optional intDecimal As Integer)

    Dim dblBereich As Double

    If dblMin = 0 Then dblMin = 1

    If dblMax = 0 Then dblMax = 1000

    dblMin = dblMin * 10 ^ intDecimal

    dblMax = dblMax * 10 ^ intDecimal

    dblBereich = dblMax - dblMin

    varZahl = CLng((Rnd() * (dblBereich) + dblMin)) / 10 ^ intDecimal

End Sub

Die Methode multipliziert die Bereichsgrenzen mit einer der Anzahl der Nachkommastellen entsprechenden Zehnerpotenz und ermittelt aus der Differenz den gewünschten Bereich. Die mit Rnd ermittelte Zufallszahl zwischen 0 und 1 wird mit dem Bereich multipliziert, dann wird die unterste Grenze hinzuaddiert. Die resultierende Zahl enthält Nachkommastellen, welche durch das Konvertieren mit der CLng-Funktion entfernt werden. Schließlich wird der Wert durch die gleiche Zehnerpotenz wie oben geteilt, um die gewünschte Anzahl Nachkommastellen zu erhalten.

Ja/Nein-Werte ermitteln

Die Methode zum Ermitteln von Ja/Nein-Werten erwartet zwei Parameter: intPercentTrue liefert die Wahrscheinlichkeit, dass die Methode True zurückliefert, und bol enthält schließlich das Ergebnis. Die Prozedur ermittelt einen Zufallswert zwischen 0 und 100 und prüft, ob dieser kleiner als die gewünschte Quote ist. Falls ja, liefert die Prozedur True zurück, sonst False.

Public Sub GetTrueFalse(intPercentTrue As Integer, bol As Boolean)

    Dim sng As Single

    bol = False

    sng = Rnd

    If sng * 100 < intPercentTrue Then

        bol = True

    End If

End Sub

Weitere Methoden

Der Platz reicht bei weitem nicht aus, um alle in der Lösung verwendeten Techniken zu beschreiben. Allerdings dürften Sie schnell das System erkennen und eigene Methoden beziehungsweise Datenarten einsetzen können. Dazu fügen Sie zunächst eine neue Datenart zur Tabelle tblDatenarten hinzu. Anschließend ergänzen Sie die Prozedur cmdBeispieldatenSchreiben_Click um einen entsprechenden Eintrag in der Select Case-Bedingung. Sofern Sie eine neue Methode zum Hinzufügen der gewünschten Daten brauchen, legen Sie diese in der Klasse clsBeispieldaten an.

Zusammenfassung und Ausblick

Der Beispieldaten-Assistent nimmt Ihnen eine Menge Arbeit ab, wenn Sie mal eben eine oder mehrere Tabellen, die auch miteinander verknüpft sein können, mit beliebig vielen Beispieldaten füllen wollen. Es gibt aber auch noch Erweiterungsmöglichkeiten. Eine davon ist ganz einfach: Sie können eigene Mappings für die Zuordnung von Datenarten zu den Feldnamen in Ihren Tabellen schreiben, damit Sie diese nicht mehr von Hand eintragen müssen. Weitere erfordern den Eingriff in den Code beziehungsweise den Entwurf des Assistenten: So wäre ein weiterer Anwendungsfall, ein oder mehrere Felder einer Tabelle mit bestehenden Datensätzen nachträglich zu füllen. Außerdem erlaubt der Assistent in der vorliegenden Version noch nicht, mehrere gleichartige Felder wie PLZ und PLZGeschaeftlich mit verschiedenen Daten zu füllen. Teilen Sie uns doch einfach Ihre Erfahrungen mit dem Beispieldaten-Assistenten mit und liefern Sie Vorschläge für Erweiterungen - ganz einfach per E-Mail an info@access-im-unternehmen.de.

Download

Download

Die .zip-Datei enthält folgende Dateien:

Beispieldaten-Assistent.mda

Beispieldateien downloaden

© 2003-2010 André Minhorst Alle Rechte vorbehalten.