{"id":55000303,"date":"2005-10-01T00:00:00","date_gmt":"2020-05-06T15:18:07","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=303"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Beispieldaten_generieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/","title":{"rendered":"Beispieldaten generieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<h3>Zusammenfassung<\/h3>\n<p>Legen Sie mit wenigen Codezeilen Beispieldaten f&uuml;r Ihre Datenbanken in der Entwicklungsphase an. <\/p>\n<h3>Techniken<\/h3>\n<p>Zufallsfunktionen, Rnd, Int, zuf&auml;llige Auswahl von Datens&auml;tzen<\/p>\n<h3>Voraussetzungen<\/h3>\n<p>Access 97 oder h&ouml;her<\/p>\n<h3>Beispieldateien<\/h3>\n<p><a href=''fileadmin\/files\/39_45_acc0505kh07.zip''>Testdaten97.mdb, Testdaten00.mdb<\/a><\/p>\n<h3><\/h3>\n<p><b>Andr&eacute; Minhorst, Duisburg<\/b><\/p>\n<p><b>Eine der leidigsten Aufgaben bei der Datenbankentwicklung ist das Eintippen von Testdaten. Es ist ja ganz sch&ouml;n, zwischendurch mal eine etwas weniger anspruchsvolle T&auml;tigkeit auszu&uuml;ben, aber diese Zeit k&ouml;nnte man sicher sinnvoller nutzen, indem man einen Kaffee trinkt oder ein wenig im Internet surft. Ein wenig Vorarbeit ist nat&uuml;rlich notwendig, aber dann sind die Beispieldaten im Nu generiert.<\/b><\/p>\n<p>Mancher Entwickler ist sich seiner selbst so sicher, dass er Anwendungen locker ohne Testdaten entwickelt. Wenn die Anwendung in Betrieb geht, ist der Nachholbedarf dann allerdings gro&szlig;:<\/p>\n<p>Fehler treten auf, die Daten passen nicht in die Steuerelemente und die Berichte zeigen nur die H&auml;lfte der gew&uuml;nschten Informationen an.<\/p>\n<p>Mit ein wenig Aufwand l&auml;sst sich eine Menge &auml;rger vermeiden: Wenn Testdaten vorhanden sind, lassen sich viele Funktionen zuverl&auml;ssig pr&uuml;fen und die Steuerelemente in Formularen und Berichten der gew&uuml;nschten Gr&ouml;&szlig;e anpassen.<\/p>\n<p>Die optimalen Beispieldaten kommen nat&uuml;rlich vom Auftraggeber selbst: Wenn eine zu entwickelnde Anwendung dem Verwalten bestehender Daten dienen soll, liegt nichts n&auml;her, diese nach dem Entwurf des Datenmodells direkt in die passenden Tabellen zu integrieren. Diesen Schritt m&uuml;ssen Sie fr&uuml;her oder sp&auml;ter vermutlich ohnehin gehen, also warum nicht sofort Die Beispieldaten kommen somit &#8222;frei Haus&#8220;.<\/p>\n<p>Es gibt allerdings auch F&auml;lle, in denen die Beispieldaten nicht auf der Stra&szlig;e liegen: Wenn Sie etwa ein Produkt entwickeln m&ouml;chten, dessen Abnehmer noch nicht feststehen oder f&uuml;r das es einfach noch keine bestehenden Daten gibt, m&uuml;ssen Sie die Tabellen selbst f&uuml;llen.<\/p>\n<p>Es gibt einige Assistenten f&uuml;r Access, die Tabellen relativ &#8222;blind&#8220; mit Beispieldaten f&uuml;llen, die dem jeweiligen Datentyp entsprechen. Das klappt f&uuml;r einige F&auml;lle, aber sobald es an verkn&uuml;pfte Tabellen geht, h&ouml;rt der Spa&szlig; meist auf.<\/p>\n<p>Au&szlig;erdem macht es doch wesentlich mehr Laune, beispielsweise eine Adressenliste zu testen, die richtige Namen enth&auml;lt und keine per Zufall generierten Zeichenketten wie kUDvkxKskKNN. &#8222;Richtige&#8220; Beispieldaten machen auch einen wesentlich besseren Eindruck, wenn es um die Vorf&uuml;hrung oder um eine Demoversion der jeweiligen Anwendung geht.<\/p>\n<h2>Woher nehmen, wenn nicht stehlen<\/h2>\n<p>Um etwa eine Adresstabelle mit einigen hundert oder tausend Datens&auml;tzen zu f&uuml;llen, ben&ouml;tigen Sie nat&uuml;rlich einige Basisdaten &#8211; aber nicht unbedingt so viele, wie Sie Datens&auml;tze erzeugen m&ouml;chten. Mit 20 bis 30 Vornamen, Nachnamen, Orten und Stra&szlig;en l&auml;sst sich schon eine Menge eindeutige Kombinationen erzeugen. Die m&uuml;ssen Sie nat&uuml;rlich irgendwo her nehmen &#8211; also greifen Sie sich einfach das n&auml;chste Telefonbuch und &#8222;hacken&#8220; ein paar Daten in eine Basistabelle. Denn merke: Nichts ist monotoner, als Beispieldaten einzugeben &#8211; au&szlig;er, sich die Beispieldaten auch noch ausdenken zu m&uuml;ssen &#8230;<\/p>\n<h2>Art der Daten<\/h2>\n<p>Welche Daten ben&ouml;tigt man &uuml;berhaupt, um eine Datenbank mit Beispieldaten zu f&uuml;llen In der Regel sollten Daten f&uuml;r die folgenden Felder ausreichen:<\/p>\n<li>Vorname<\/li>\n<li>Nachname<\/li>\n<li>Anrede<\/li>\n<li>Firma<\/li>\n<li>Stra&szlig;e und Hausnummer<\/li>\n<li>PLZ<\/li>\n<li>Ort<\/li>\n<li>Land<\/li>\n<li>Telefon (Telefax, Mobil)<\/li>\n<li>E-Mail<\/li>\n<li>Internet<\/li>\n<li>Datumsangaben<\/li>\n<li>Zahlenwerte<\/li>\n<li>Verkn&uuml;pfungsfelder<\/li>\n<li>Sonstige Felder wie Projektnamen, Fahrzeugnamen &#8230; <\/li>\n<h3>Daten generieren<\/h3>\n<p>Die Daten f&uuml;r die oben genannten Felder gewinnen Sie auf unterschiedliche Arten. F&uuml;r die ersten acht Felder halten Tabellen mit bestehenden Daten als Quelle her.<\/p>\n<p>Die &uuml;brigen k&ouml;nnen mit einfachen Funktionen erzeugt werden, die Sie ebenfalls wie die Funktion zum zuf&auml;lligen Ausw&auml;hlen der bestehenden Daten im Folgenden kennen lernen.<\/p>\n<p>Zum Anlegen von Datens&auml;tzen mit Beispieldaten m&uuml;ssen Sie nun irgendwie daf&uuml;r sorgen, dass die Daten &#8211; woher auch immer &#8211; in der Zieltabelle landen. Dazu verwendet man am Besten eine passende SQL-Anweisung, die per VBA mit den entsprechenden Daten best&uuml;ckt wird. F&uuml;r die Kontakttabelle aus Bild 1 k&ouml;nnte die Anweisung wie folgt aussehen:<\/p>\n<pre>db.Execute \"INSERT INTO tblPersonen\r\n(Anrede, Vorname, Nachname, Firma, \r\nStrasse, PLZ, Ort, Bundesland, Telefon, \r\nTelefax, EMail) VALUES(''\" & strAnrede & \r\n\"'', ''\" & strVorname & \"'', ''\" & \r\nstrNachname & \"'', ''\" & strFirma & \"'', ''\" \r\n& strStrasse & \" \" & intHausnummer & \"'', \r\n''\" & strPLZ & \"'', ''\" & strOrt & \"'', ''\" & \r\nstrBundesland & \"'', ''\" & strVorwahl & \"\/\" \r\n& strTelefon & \"'', ''\" & strVorwahl & \"\/\" \r\n& strTelefax & \"'', ''\" & strEMail & \"'')\"<\/pre>\n<p>Bleibt nur noch die kleine Aufgabe, die Variablen f&uuml;r die einzuf&uuml;genden Daten mit den entsprechenden Werten zu f&uuml;llen.<\/p>\n<p>Die dazu notwendige Funktionalit&auml;t soll der &uuml;bersicht halber auf eine &ouml;ffentliche Routine und eine Klasse aufgeteilt werden, deren Methoden per Zufall die einzelnen Daten ermitteln.<\/p>\n<p><b>Quellcode 1: Routine zum Anlegen von Beispieldaten in einer Personen-Tabelle<\/b><\/p>\n<pre>Public Sub TabelleFuellen(lngAnzahlDatensaetze As Long)\r\n    Dim db As DAO.Database\r\n    Dim i As Integer\r\n    Dim objBeispieldaten As clsBeispieldaten\r\n    Dim strAnrede As String\r\n    Dim strVorname As String\r\n    Dim strNachname As String\r\n    ... weitere Deklarationen, siehe Beispieldatenbank\r\n    ''Klasse f&uuml;r die Ermittlung der Zufallsdaten instanzieren\r\n    Set objBeispieldaten = New clsBeispieldaten\r\n    Set db = CurrentDb\r\n    ''Gew&uuml;nschte Anzahl Datens&auml;tze durchlaufen\r\n    For i = 1 To lngAnzahlDatensaetze\r\n        ''Beispieldaten ermitteln\r\n        With objBeispieldaten\r\n            .GetVorname strVorname, strGeschlecht, strAnrede\r\n            .GetNachname strNachname\r\n            .GetNachname strNameFirma\r\n            .GetFirma strNameFirma, strFirma\r\n            .GetStrasse strStrasse\r\n            .GetHausnummer 1, 100, intHausnummer\r\n            .GetOrt strPLZ, strOrt, strBundesland, strVorwahl\r\n            .GetTelefon 6, 8, strTelefon\r\n            .GetTelefon 6, 8, strTelefax\r\n            .GetEMail strVorname, strNachname, strEMail\r\n        End With\r\n        ''Datensatz schreiben\r\n        db.Execute \"INSERT INTO tblPersonen(Anrede, Vorname, Nachname, Firma, Strasse, PLZ, \" _            & \"Ort, Bundesland, Telefon, Telefax, EMail) VALUES(''\" & strAnrede & \"'', ''\" _            & strVorname & \"'', ''\" & strNachname & \"'', ''\" & strFirma & \"'', ''\" & strStrasse & \" \" _            & intHausnummer & \"'', ''\" & strPLZ & \"'', ''\" & strOrt & \"'', ''\" & strBundesland _            & \"'', ''\" & strVorwahl & \"\/\" & strTelefon & \"'', ''\" & strVorwahl & \"\/\" & strTelefax _            & \"'', ''\" & strEMail & \"'')\"\r\n    Next i\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p><IMG height=\"240\" src=\"..\/fileadmin\/_temp_\/{290E42C7-4B31-4C0D-B682-E523BB2C369F}\/pic001.png\" width=\"282\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1:  Diese Tabelle soll mit Beispieldaten gef&uuml;llt werden.<\/span><\/b><\/p>\n<p>Die Routine aus Quellcode 1 deklariert und instanziert zun&auml;chst die Klasse mit den Methoden zum Ermitteln der Beispieldaten und die Variablen f&uuml;r die per Zufall ermittelten Daten. Dann durchl&auml;uft die Routine eine Schleife und dabei die einzelnen Methoden zur Ermittlung der Daten. Diese Daten schreibt sie schlie&szlig;lich in einen neuen Datensatz der Personen-Tabelle.<\/p>\n<p>Die Klasse clsBeispieldaten enth&auml;lt die Methoden zum Ermitteln von Daten nach dem Zufallsprinzip. Dabei werden verschiedene Techniken verwendet, die nachfolgend vorgestellt werden.<\/p>\n<p>Die Funktionen zur Generierung der Daten teilen sich in folgende Typen auf:<\/p>\n<li>Generieren aus bestehenden Tabellen<\/li>\n<li>Generieren von Telefonnummern <\/li>\n<li>Generieren von E-Mail und Internetadressen aus Namen<\/li>\n<li>Erzeugen von Datumsangaben<\/li>\n<li>Erzeugen von Zahlenwerten in bestimmten Bereichen<\/li>\n<li>Ermitteln von Werten f&uuml;r Verkn&uuml;pfungsfelder aus fremden Tabellen<\/li>\n<h2>Zufallszahlen mit der Rnd-Funktion<\/h2>\n<p>In fast allen nachfolgend vorgestellten Funktionen spielt die Rnd-Funktion eine Rolle. Diese Funktion ermittelt einen Zufallswert gr&ouml;&szlig;er oder gleich 0 und kleiner 1. Um Werte aus einem bestimmten Bereich zu erhalten &#8211; beispielsweise zwischen 1 und 10 &#8211; muss man die Funktion entsprechend &#8222;einh&uuml;llen&#8220;. Der folgende Ausdruck liefert die passenden Werte:<\/p>\n<pre>Int(10 * Rnd() + 1)<\/pre>\n<p>F&uuml;r andere Intervalle legen Sie die Werte f&uuml;r die zwei Variablen Obergrenze und Untergrenze fest und verwenden den folgenden Ausdruck:<\/p>\n<pre>Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)<\/pre>\n<p>Die nachfolgend verwendeten Ausdr&uuml;cke verwenden dabei jeweils die berechneten Werte f&uuml;r den Ausdruck Obergrenze &#8211; Untergrenze + 1.<\/p>\n<h2>Daten aus bestehenden Tabellen generieren<\/h2>\n<p>Die Beispieldatenbank enth&auml;lt folgende Tabellen mit Daten, die als Grundlage f&uuml;r Testdaten dienen k&ouml;nnen:<\/p>\n<li>tblVornamen (Vornamen und Geschlecht)<\/li>\n<li>tblNachnamen (Nachnamen)<\/li>\n<li>tblStrassen (Stra&szlig;ennamen)<\/li>\n<li>tblOrte (Ort, PLZ, Vorwahl, Bundesland)<\/li>\n<h3>Nachnamen ermitteln<\/h3>\n<p>Daten aus Tabellen mit nur einem Feld wie tblNachnamen und tblStrassen werden mit einer Methode wie aus Quellcode 2 ermittelt.<\/p>\n<p>Dazu soll zuf&auml;llig einer der Datens&auml;tze der Tabelle ermittelt werden. Dies geht am einfachsten, wenn Sie diese Aufgabe an eine Abfrage weitergeben. Diese Abfrage ist wie in Bild 2 aufgebaut.<\/p>\n<p>Wichtig ist hier, dass die Abfrage aufsteigend nach dem Feld Zufall sortiert ist. Dieses Feld enth&auml;lt eine in Abh&auml;ngigkeit vom Autowert des Datensatzes gebildete Zufallszahl. Da diese immer einen anderen Wert hat, &auml;ndert sich auch die Reihenfolge. Damit die Abfrage nur einen Datensatz zur&uuml;ckgibt, stellen Sie noch die Eigenschaft Spitzenwerte der Abfrage auf 1 ein.<\/p>\n<p><IMG height=\"352\" src=\"..\/fileadmin\/_temp_\/{290E42C7-4B31-4C0D-B682-E523BB2C369F}\/pic002.png\" width=\"485\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2:  Abfrage zur zuf&auml;lligen Ermittlung eines Datensatzes<\/span><\/b><\/p>\n<p>Die Methode GetNachname aus Quellcode 2 hat nur den zu ermittelnden Nachnamen als Parameter. Dieser muss in der aufrufenden Routine zuvor deklariert werden und kann nach dem Aufruf der Methode ausgewertet werden.<\/p>\n<p>Diese Variante der &uuml;bergabe von R&uuml;ckgabewerten ist in diesem Zusammenhang eher ungew&ouml;hnlich &#8211; normalerweise k&ouml;nnte man diesen auch als Funktionswert zur&uuml;ckgeben. Warum das Ergebnis dennoch als Parameter zur&uuml;ckgegeben wird, erfahren Sie weiter unten.<\/p>\n<p>Genau wie den Nachnamen ermitteln Sie auch eine Stra&szlig;e &#8211; nur dass hier die Methode GetStrasse zum Einsatz kommt.<\/p>\n<h3>Ort, PLZ, Vorwahl und Bundesland ermitteln<\/h3>\n<p>Etwas aufw&auml;ndiger ist das Ermitteln zusammenh&auml;ngender Daten wie Postleitzahl, Ort, Bundesland und Vorwahl oder Vorname, Anrede und Geschlecht.<\/p>\n<p>Zwar k&ouml;nnte man auch alle Informationen einzeln ermitteln, da es sich ja immerhin nur um Beispieldaten handelt. Ein wenig Freude am Detail soll jedoch auch dabei sein.<\/p>\n<p>Daher sind zusammenpassende Daten bereits in den beiden Tabellen tblOrte und tblVornamen enthalten (siehe Bild 3).<\/p>\n<p>Um diese Daten mit einer Methode &auml;hnlich der zum Finden von Nachnamen per Zufall zu ermitteln, verwenden Sie wiederum eine Abfrage, die zuf&auml;llig einen Datensatz der Tabelle tblOrte ausw&auml;hlt (siehe Bild 4).<\/p>\n<p><IMG height=\"370\" src=\"..\/fileadmin\/_temp_\/{290E42C7-4B31-4C0D-B682-E523BB2C369F}\/pic003.png\" width=\"471\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Weitere Tabellen mit Beispieldaten<\/span><\/b><\/p>\n<p><b>Quellcode 2: Code zum Ermitteln eines Nachnamens nach dem Zufallsprinzip<\/b><\/p>\n<pre>Public Sub GetNachname(strNachname As String)\r\n    Set rst = db.OpenRecordset(\"qryNachnameZufall\", _        dbOpenDynaset)\r\n    strNachname = rst!Nachname\r\n    rst.Close\r\n    Set rst = Nothing\r\nEnd Sub<\/pre>\n<p><IMG height=\"293\" src=\"..\/fileadmin\/_temp_\/{290E42C7-4B31-4C0D-B682-E523BB2C369F}\/pic004.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4:  Abfrage zum Ermitteln von PLZ, Ort, Vorwahl und Bundesland<\/span><\/b><\/p>\n<p>Wenn Sie nicht gerade zuerst die ID eines Datensatzes ermitteln, diese zwischenspeichern und dann nacheinander die gew&uuml;nschten Informationen auf Basis der gespeicherten ID ermitteln m&ouml;chten, k&ouml;nnen Sie dies auch in einem Rutsch beziehungsweise innerhalb einer Methode erledigen. Um mehrere R&uuml;ckgabewerte gleichzeitig von einer Routine zu erhalten, verwendet man entweder ein Array oder einen benutzerdefinierten Typ &#8211; oder man setzt einfach mehrere Parameter als R&uuml;ckgabeparameter der Methode ein.<\/p>\n<p>Im vorliegenden Fall kommt letztere Technik zum Einsatz und der Grund, warum auch weiter oben f&uuml;r Nachnamen und Stra&szlig;en diese Technik verwendet wurde, liegt allein darin, dass alle Methoden die ermittelten Werte auf dem gleichen Wege zur&uuml;ckliefern sollen.<\/p>\n<p>Die Methode GetOrt sieht dementsprechend wie in Quellcode 3 aus. Um die Methode m&ouml;glichst flexibel zu halten, sind alle Parameter optional &#8211; man k&ouml;nnte also gegebenenfalls auch alle Werte getrennt ermitteln.<\/p>\n<p><b>Quellcode 3: <\/b><\/p>\n<pre>Public Sub GetOrt(Optional strPLZ As String, Optional strOrt _    As String, Optional strBundesland As String, _    Optional strVorwahl As String)\r\n    Set rst = db.OpenRecordset(\"qryOrteZufall\", dbOpenDynaset)\r\n    strOrt = rst!Ort\r\n    strPLZ = rst!PLZ\r\n    strBundesland = rst!Bundesland\r\n    strVorwahl = rst!Vorwahl\r\n    rst.Close\r\n    Set rst = Nothing\r\nEnd Sub<\/pre>\n<p><b>Quellcode 4: Telefonnummern per Zufall<\/b><\/p>\n<pre>Public Sub GetTelefon(intMinLaenge As Integer, _    intMaxLaenge As Integer, strTelefon As String)\r\n    Dim intDiffLaenge As Integer\r\n    Dim i As Integer\r\n    Dim strTelefonTemp As String\r\n    intDiffLaenge = Int(Rnd() * (intMaxLaenge - intMinLaenge))\r\n    For i = 1 To intMinLaenge + intDiffLaenge\r\n        strTelefonTemp = strTelefonTemp & Int(Rnd() * 10)\r\n    Next i\r\n    strTelefon = strTelefonTemp\r\nEnd Sub<\/pre>\n<p><b>Quellcode 5: Generieren von E-Mail-Adressen aus Vor- und Nachname<\/b><\/p>\n<pre>Public Sub GetEMail(strVorname As String, _    strNachname As String, strEMail As String)\r\n    strEMail = StrConv(strVorname, vbLowerCase) & \"@\" _        & StrConv(strNachname, vbLowerCase) & \".de\"\r\nEnd Sub<\/pre>\n<h3>Vorname, Anrede und Geschlecht ermitteln<\/h3>\n<p>Das Ermitteln von Vorname, Geschlecht und Anrede erfolgt genau wie bei PLZ und Co.<\/p>\n<h3>Ermitteln von Telefonnummern<\/h3>\n<p>Telefonnummern sind zu anspruchslos, um extra in einer Tabelle gespeichert und daraus per Zufall ausgelesen zu werden. Statt dessen werden Telefonnummern komplett per Zufallsfunktion generiert (s. Quellcode 4).<\/p>\n<p>Mit zwei Parametern l&auml;sst sich das Aussehen der Telefonnummern festlegen: intMinLaenge und intMaxLaenge legen fest, welche L&auml;nge die zu ermittelnden Telefonnummern haben d&uuml;rfen. Wenn eine feste L&auml;nge gew&uuml;nscht ist, stellen Sie einfach beide Werte auf den gleichen Wert ein.<\/p>\n<p>F&uuml;r Telefonnummern mit verschiedenen L&auml;ngen ermittelt die Methode ebenfalls per Zufall, welche L&auml;nge aus dem angegebenen Bereich verwendet werden soll.<\/p>\n<p>Anschlie&szlig;end ermittelt sie die gew&uuml;nschte Anzahl Zahlen f&uuml;r die Telefonnummern.<\/p>\n<p>Diese Routine kann nat&uuml;rlich f&uuml;r alle Telefonnummerntypen verwendet werden &#8211; also f&uuml;r Telefon, Telefax, Mobil und privat oder gesch&auml;ftlich.<\/p>\n<h3>E-Mail-Adressen zusammensetzen<\/h3>\n<p>Sehr unspektakul&auml;r ist die Methode zum Erzeugen einer E-Mail: Diese verwendet einfach die mit den Parametern strVorname und strNachname &uuml;bergebenen Informationen und setzt daraus eine E-Mail-Adresse zusammen &#8211; aus Torsten und M&uuml;ller wird dabei torsten@m&uuml;ller.de.<\/p>\n<p>Die Liebe zum Detail wird hier insofern aufgegeben, als dass Umlaute und sonstige Sonderzeichen wie scharfes s (&szlig;) oder &auml;hnliche nicht gesondert konvertiert werden. Die StrConv-Funktion sorgt daf&uuml;r, dass alle Buchstaben innerhalb der E-Mail-Adresse klein geschrieben werden (s. Quellcode 5).<\/p>\n<h2>Ermitteln weiterer Daten<\/h2>\n<p>Die &uuml;brigen f&uuml;r das angegebene Beispiel ben&ouml;tigten Daten wie der Firmenname oder die Hausnummer werden auf &auml;hnliche, einfache Weise ermittelt.<\/p>\n<p><b>Quellcode 6: Generieren von Datumsangaben<\/b><\/p>\n<pre>Public Sub GetDatum(datStart As Date, datEnde As Date, _    datDatum As Date)\r\n    Dim intDatumsintervall As Integer\r\n    intDatumsintervall = DateDiff(\"d\", datStart, datEnde) + 1\r\n    datDatum = DateAdd(\"d\", Int(Rnd() * intDatumsintervall), _        datStart)\r\nEnd Sub<\/pre>\n<p>Es gibt allerdings noch einige Datentypen, die f&uuml;r andere als die hier als Beispiel verwendete Personentabelle n&uuml;tzlich sein k&ouml;nnen &#8211; etwa Datumsangaben, Zahlen oder Werte f&uuml;r Verkn&uuml;pfungsfelder.<\/p>\n<h3>Datumsangaben<\/h3>\n<p>Die Methode zum zufallsgesteuerten Erzeugen von Datumsangaben erwartet ein Intervall in Form von Start- und Enddatum als Grundlage f&uuml;r die Ermittlung von Datumsangaben.<\/p>\n<p>Aus diesen beiden Werten wird zun&auml;chst das Intervall in Tagen berechnet. Auf Basis dieses Intervalls ermittelt die nachfolgende Kombination aus Int- und Rnd-Funktion einen Zufallswert, der irgendwo zwischen 0 und der Intervallgr&ouml;&szlig;e liegt, und addiert die entsprechende Anzahl Tage zur unteren Intervallgrenze (s. Quellcode 6).<\/p>\n<h3>Datumsintervalle berechnen<\/h3>\n<p>Manchmal sollen Tabellen mehrere, voneinander abh&auml;ngige Daten enthalten &#8211; zum Beispiel enth&auml;lt eine Bestellungen-Tabelle ein Bestelldatum und ein Lieferdatum. Um diese beiden Felder zu f&uuml;llen, ermitteln Sie ein erstes Datum mit der oben beschriebenen Methode und verwenden dann einen mit der Rnd-Funktion ermittelten Zahlenwert, um ein f&uuml;r diesen Zeitraum &uuml;bliches Intervall zu berechnen. Diesen Zahlenwert schlagen Sie einfach mit der DateAdd-Funktion auf das erste Datum &#8211; das Bestelldatum &#8211; auf und erhalten somit das Lieferdatum.<\/p>\n<h3>Werte f&uuml;r Verkn&uuml;pfungsfelder<\/h3>\n<p>Wenn Sie Beispieldaten f&uuml;r verkn&uuml;pfte Tabellen erzeugen m&uuml;ssen, ist das auch kein Problem. Erstellen Sie einfach zun&auml;chst die Daten in der Mastertabelle der Beziehung. Bei Projekten und Kunden ist das beispielsweise die Kundentabelle.<\/p>\n<p>Wenn die Kundendaten vorliegen, k&ouml;nnen Sie auch die mit den Kunden verkn&uuml;pften Projekte anlegen. Dazu m&uuml;ssen Sie das Fremdschl&uuml;sselfeld, das beispielsweise KundeID hei&szlig;en k&ouml;nnte, mit passenden Daten f&uuml;llen. Die zur Ermittlung dieser Daten verwendete Technik ist die gleiche wie die zum Ermitteln der zuf&auml;lligen Datens&auml;tze aus den Tabellen mit Vornamen, Nachnamen oder Orten.<\/p>\n<p>Falls Sie keine eigene gespeicherte Abfrage dazu anlegen m&ouml;chten, k&ouml;nnen Sie diese auch direkt im VBA-Code angeben.<\/p>\n<p>Das automatisierte Erstellen von Beispieldaten ist sehr hilfreich. Es spart Zeit und wenn man sich ein wenig M&uuml;he gibt, erh&auml;lt man realit&auml;tsnahe Daten, die zum Testen der Anwendung auf die zuk&uuml;nftigen Anforderungen ausreichen. Durch die automatisierte Erstellung der Daten lassen sich per Mausklick tausende von Datens&auml;tzen erstellen und die Anwendung unter realistischen Bedingungen testen. Damit k&ouml;nnen Sie leicht pr&uuml;fen, ob ein Bericht auch noch auf der vierten Seite wie gew&uuml;nscht aussieht.<\/p>\n<p>Ein wenig Fantasie ist allerdings gefragt: Zwar finden Sie in der Klasse clsBeispieldaten Methoden f&uuml;r die Ermittlung vieler verschiedener Daten, aber nat&uuml;rlich noch l&auml;ngst nicht f&uuml;r alle. Wenn Sie beispielsweise eine Projekttabelle erzeugen und mit Beispieldaten f&uuml;llen m&ouml;chten, denken Sie sich halt ein paar verschiedene Projekttypen aus und greifen dann per Zufall auf diese zu.<\/p>\n<p>Und wenn Sie auch dieses letzte bisschen manuelle Beispieldatenerstellung vermeiden m&ouml;chten &#8211; Ihre vorhandenen Datenbanken liefern sicher ausreichend Stoff als Grundlage f&uuml;r Beispieldaten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine der leidigsten Aufgaben bei der Datenbankentwicklung ist das Eintippen von Testdaten. Es ist ja ganz sch&ouml;n, zwischendurch mal eine etwas weniger anspruchsvolle T&auml;tigkeit auszu&uuml;ben, aber diese Zeit k&ouml;nnte man sicher sinnvoller nutzen, indem man einen Kaffee trinkt oder ein wenig im Internet surft. Ein wenig Vorarbeit ist nat&uuml;rlich notwendig, aber dann sind die Beispieldaten im Nu generiert.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662005,66052005,44000028,44000027],"tags":[],"class_list":["post-55000303","post","type-post","status-publish","format-standard","hentry","category-662005","category-66052005","category-Ergonomie_und_Benutzeroberflaeche","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Beispieldaten generieren - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Beispieldaten generieren\" \/>\n<meta property=\"og:description\" content=\"Eine der leidigsten Aufgaben bei der Datenbankentwicklung ist das Eintippen von Testdaten. Es ist ja ganz sch&ouml;n, zwischendurch mal eine etwas weniger anspruchsvolle T&auml;tigkeit auszu&uuml;ben, aber diese Zeit k&ouml;nnte man sicher sinnvoller nutzen, indem man einen Kaffee trinkt oder ein wenig im Internet surft. Ein wenig Vorarbeit ist nat&uuml;rlich notwendig, aber dann sind die Beispieldaten im Nu generiert.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:18:07+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Beispieldaten generieren\",\"datePublished\":\"2020-05-06T15:18:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/\"},\"wordCount\":2397,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/13bcd442cb514a08941f46fd3b41bfe5\",\"articleSection\":[\"2005\",\"5\\\/2005\",\"Ergonomie und Benutzeroberfl\u00e4che\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/\",\"name\":\"Beispieldaten generieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/13bcd442cb514a08941f46fd3b41bfe5\",\"datePublished\":\"2020-05-06T15:18:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/13bcd442cb514a08941f46fd3b41bfe5\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/13bcd442cb514a08941f46fd3b41bfe5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Beispieldaten generieren\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Beispieldaten generieren - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/","og_locale":"de_DE","og_type":"article","og_title":"Beispieldaten generieren","og_description":"Eine der leidigsten Aufgaben bei der Datenbankentwicklung ist das Eintippen von Testdaten. Es ist ja ganz sch&ouml;n, zwischendurch mal eine etwas weniger anspruchsvolle T&auml;tigkeit auszu&uuml;ben, aber diese Zeit k&ouml;nnte man sicher sinnvoller nutzen, indem man einen Kaffee trinkt oder ein wenig im Internet surft. Ein wenig Vorarbeit ist nat&uuml;rlich notwendig, aber dann sind die Beispieldaten im Nu generiert.","og_url":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:18:07+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Beispieldaten generieren","datePublished":"2020-05-06T15:18:07+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/"},"wordCount":2397,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5","articleSection":["2005","5\/2005","Ergonomie und Benutzeroberfl\u00e4che","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/","url":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/","name":"Beispieldaten generieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5","datePublished":"2020-05-06T15:18:07+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/13bcd442cb514a08941f46fd3b41bfe5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Beispieldaten generieren"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000303"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000303\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}