{"id":55001359,"date":"2022-04-01T00:00:00","date_gmt":"2022-05-10T18:43:37","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1359"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Beispieldaten_generieren_mit_NET_und_Bogus","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/","title":{"rendered":"Beispieldaten generieren mit .NET und Bogus"},"content":{"rendered":"<p><b>Das Produzieren von Beispieldaten ist immer wieder eine m&uuml;hselige Aufgabe. Beispieldaten ben&ouml;tigen Sie, um beim Entwickeln neuer Anwendungen die Funktionen zu testen, die mit der Anzeige, dem Bearbeiten oder L&ouml;schen von Daten zusammenh&auml;ngen. Und auch zum Testen des Hinzuf&uuml;gens von Daten ben&ouml;tigen Sie gegebenenfalls schon Daten in verkn&uuml;pften Tabellen zur Auswahl. Unter .NET gibt es verschiedene Bibliotheken, die das Generieren von Beispieldaten erleichtern. Leider sind diese nicht so ohne Weiteres unter Access verf&uuml;gbar. Zum Gl&uuml;ck gibt es Tools, mit denen Sie diese Bibliotheken dennoch f&uuml;r Ihre Zwecke einsetzen k&ouml;nnen. In diesem Beitrag nutzen wir den Editor LINQPad, um Beispieldaten mit der Bogus-Bibliothek zu erzeugen und diese dann mit der Bibliothek LINQ to DB den Tabellen einer Beispieldatenbank hinzuzuf&uuml;gen.<\/b><\/p>\n<h2>Vorbereitungen<\/h2>\n<p>F&uuml;r die beschriebenen Techniken ben&ouml;tigen Sie die Entwicklungsumgebung LINQPad sowie die Datenzugriffsbibliothek LINQ to DB. Wie Sie diese beiden herunterladen, installieren und verwenden, beschreiben wir im Beitrag <b>Datenzugriff mit .NET, LINQPad und LINQ to DB <\/b>(<b>www.access-im-unternehmen.de\/1358<\/b>).<\/p>\n<p>Wie Sie diese beiden nutzen, um mit einer weiteren Bibliothek namens Bogus zuf&auml;llige Beispieldaten f&uuml;r eine Datenbank zu erzeugen, zeigen wir im vorliegenden Beitrag.<\/p>\n<h2>Bogus zum Projekt hinzuf&uuml;gen<\/h2>\n<p>Zum Ermitteln der Beispieldaten, die wir zu den Tabellen der Anwendung hinzuf&uuml;gen wollen, nutzen wir die bereits eingangs erw&auml;hnte Bibliothek <b>Bogus<\/b>.<\/p>\n<p>Diese m&uuml;ssen wir genau wie <b>LINQ to DB <\/b>zun&auml;chst verf&uuml;gbar machen. Dazu klicken Sie unter <b>LINQPad <\/b>mit der rechten Maustaste auf den Registerreiter des <b>Query<\/b>-Bereichs und w&auml;hlen den Eintrag  <b>Query Properties&#8230; <\/b>aus (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_002.png\" alt=\"Aufrufen des Dialogs Query Properties per Kontextmen&uuml;\" width=\"674,559\" height=\"348,0022\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Aufrufen des Dialogs Query Properties per Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Im nun erscheinenden Dialog <b>Query Properties <\/b>klicken Sie auf die Schaltfl&auml;che <b>Add NuGet&#8230; <\/b>und geben im folgenden Dialog unter <b>Search online <\/b>den Suchbegriff <b>Bogus <\/b>ein. Den nun angezeigten Eintrag aus Bild 2 f&uuml;gen Sie dann mit einem Klick auf die Schaltfl&auml;che <b>Add to Query <\/b>hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_009.png\" alt=\"Hinzuf&uuml;gen des Bogus-Pakets\" width=\"700\" height=\"285,3846\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen des Bogus-Pakets<\/span><\/b><\/p>\n<p>Es erscheint nun ein neuer Eintrag im linken Bereich des Dialogs <b>LINQPad NuGet Manager<\/b>. Hier klicken Sie noch auf <b>Add namespaces<\/b> (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_010.png\" alt=\"Hinzuf&uuml;gen des Bogus-Namespaces\" width=\"499,5589\" height=\"191,6116\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen des Bogus-Namespaces<\/span><\/b><\/p>\n<p>Dies &ouml;ffnet einen weiteren Dialog namens <b>Add Namespaces From NuGet Assemblies<\/b>. Hier w&auml;hlen Sie den Eintrag <b>Bogus <\/b>aus und klicken auf <b>OK<\/b> (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_011.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf den Bogus-Namespace\" width=\"624,559\" height=\"297,3033\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Hinzuf&uuml;gen eines Verweises auf den Bogus-Namespace<\/span><\/b><\/p>\n<p>Nachdem Sie diesen Dialog und auch den Dialog <b>LINQPad NuGet Manager <\/b>geschlossen haben, finden Sie im Dialog <b>Query Properties <\/b>unter <b>Additional References <\/b>den Eintrag <b>Bogus <\/b>vor (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_012.png\" alt=\"Der Verweis auf den Bogus-Namespace\" width=\"700\" height=\"234,5794\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Der Verweis auf den Bogus-Namespace<\/span><\/b><\/p>\n<p>Damit sind die Vorbereitungen abgeschlossen und wir k&ouml;nnen uns dem Einsatz von Bogus zum Generieren von Beispieldaten zuwenden.<\/p>\n<h2>Vorweg: Anreden anlegen<\/h2>\n<p>Einen Schritt erledigen wir allerdings noch vorneweg &#8211; das Anlegen der Datens&auml;tze in der Tabelle <b>tblAnreden<\/b>. F&uuml;r diese ben&ouml;tigen wir keinen Zufallsgenerator und somit auch nicht die Bibliothek <b>Bogus<\/b>. Wir f&uuml;gen die Anreden einfach mit der folgenden Prozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AnredenAnlegen\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     <span style=\"color:blue;\">Dim <\/span>objAnrede<span style=\"color:blue;\"> As <\/span>tblAnreden\r\n     objUserQuery = tblAnreden.DataContext\r\n     objAnrede = <span style=\"color:blue;\">New<\/span> tblAnreden \r\n     <span style=\"color:blue;\">With<\/span> objAnrede \r\n         .ID = 1\r\n         .Anredebezeichnung = \"Herr\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     objUserQuery.Insert(objAnrede)\r\n     objAnrede = <span style=\"color:blue;\">New<\/span> tblAnreden()\r\n     <span style=\"color:blue;\">With<\/span> objAnrede\r\n         .ID = 2\r\n         .Anredebezeichnung = \"Frau\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     objUserQuery.Insert(objAnrede)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Code k&ouml;nnen wir mit Visual Basic &uuml;brigens auch wie folgt schreiben und sparen dabei nicht nur eine Variable, sondern auch einige Zeilen Code:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AnredenAnlegen\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     objUserQuery = tblAnreden.DataContext\r\n     objUserQuery.Insert(<span style=\"color:blue;\">New<\/span> tblAnreden <span style=\"color:blue;\">With<\/span> {.ID = 1,  .Anredebezeichnung = \"Herr\"})\r\n     objUserQuery.Insert(<span style=\"color:blue;\">New<\/span> tblAnreden <span style=\"color:blue;\">With<\/span> {.ID = 2,  .Anredebezeichnung = \"Frau\"})\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit wir immer mit einer frisch aufgesetzten Tabelle <b>tblAnreden<\/b> starten, k&ouml;nnen wir zuvor die vorhandenen Anreden l&ouml;schen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AnredenLoeschen\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     objUserQuery = tblAnreden.DataContext\r\n     objUserQuery.Execute(\"DELETE FROM tblAnreden\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Und schlie&szlig;lich geben wir die frisch erzeugten Anreden nachher einmal im Direktbereich von LINQPad aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AnredenAusgeben\r\n     <span style=\"color:blue;\">Dim <\/span>objAnrede<span style=\"color:blue;\"> As <\/span>tblAnreden\r\n     For Each objAnrede In tblAnreden\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objAnrede.ID & \" \"  & objAnrede.Anredebezeichnung)\r\n     <span style=\"color:blue;\">Next<\/span> objAnrede\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zufallsdaten mit Bogus ermitteln<\/h2>\n<p>Bogus bietet verschiedene Klassen, die Funktionen zum Erstellen von Zufallsdaten thematisch zusammenfassen. Diese werden unter folgendem Link ausf&uuml;hrlicher beschrieben:<\/p>\n<pre>https:\/\/github.com\/bchavez\/Bogus#bogus-api-support<\/pre>\n<p>Es gibt die folgenden Klassen:<\/p>\n<ul>\n<li><b>Address<\/b>: Liefert verschiedene Eigenschaften von Adressen wie Stra&szlig;e, PLZ, Ort und Land, aber auch beispielsweise H&ouml;hen- und Breitengrade oder Angaben wie Himmelsrichtungen.<\/li>\n<li><b>Commerce<\/b>: Interessant f&uuml;r alles, was mit dem Handel zu tun hat. Bietet Daten wie Produktnamen, Farben, Adjektive oder Materialien, Preise, Werte f&uuml;r Barcodes oder Kategorien und Abteilungen.<\/li>\n<li><b>Company<\/b>: Liefert Firmennamen, Gesellschaftsformen und Phrasen zu Unternehmen<\/li>\n<li><b>Database<\/b>: Liefert Feldnamen, Datentypen und weitere Datenbank-relevante Informationen<\/li>\n<li><b>Date<\/b>: Liefert Datumsangaben in verschiedenen Bereichen sowie Monate oder Wochentage<\/li>\n<li><b>Finance<\/b>: Gibt beispielsweise IBANs aus, wobei Sie festlegen k&ouml;nnen, aus welchem Land diese stammen und ob diese formatiert sein sollen. Au&szlig;erdem liefert diese Klasse Geldbetr&auml;ge, Transaktionstypen, W&auml;hrungen, Kreditkartennummern, Pr&uuml;fziffern und vieles mehr.<\/li>\n<li><b>Hacker<\/b>: Liefert zuf&auml;llige Abk&uuml;rzungen, Adjektive, Nomen, Verben oder komplette Phrasen, allerdings alles nur auf Englisch.<\/li>\n<li><b>Images<\/b>: Hiermit k&ouml;nnen Sie beispielsweise URLs zum Download von Bildern abfragen, welche Bilder in den angegebenen Dimensionen liefern.<\/li>\n<li><b>Internet<\/b>: Erstellt E-Mail-Adressen, Benutzernamen, Domainnamen, Domainendungen, Portnummern, IP-Adressen, Kennw&ouml;rter und vieles mehr.<\/li>\n<li><b>Lorem<\/b>: Bietet einige Zufallsdaten rund um die Erstellung von Texten. Hierbei k&ouml;nnen Sie einzelne W&ouml;rter, Abs&auml;tze, Buchstaben, S&auml;tze et cetera generieren lassen &#8211; allerdings nur auf Lateinisch!<\/li>\n<li><b>Name<\/b>: Liefert Vornamen, Nachnamen, komplette Namen, aber auch Berufsbezeichnungen<\/li>\n<li><b>Phone<\/b>: Liefert Telefonnummern<\/li>\n<li><b>Rant<\/b>: Liefert Reviews, allerdings nur auf Englisch<\/li>\n<li><b>System<\/b>: Liefert Dateinamen, Verzeichnisse (nur im Unix-Format), Dateiendungen, Versionsnummern, Texte von Ausnahmen, Fahrzeugnummern<\/li>\n<li><b>Vehicle<\/b>: Liefert Fahrzeughersteller, -modelle und -typen, VINs (Fahrzeugnummern) und Kraftstoffarten<\/li>\n<li><b>Random<\/b>: Liefert Zufallswerte f&uuml;r die verschiedenen Datentypen und in den angegebenen Bereichen<\/li>\n<\/ul>\n<h2>Zufallsdaten mit der Faker-Klasse<\/h2>\n<p>Mit den in den Klassen enthaltenen Funktionen k&ouml;nnen Sie die verschiedensten Daten ermitteln. Um dies auszuprobieren, erstellen Sie einfach eine neues Objekt auf Basis der Klasse <b>Bogus.Faker <\/b>und greifen dann direkt auf die Klassen aus der obigen Auflistung und die darin enthaltenen Funktionen zu.<\/p>\n<p>Im folgenden Beispiel schreiben wir den Code direkt in die <b>Main<\/b>-Klasse der LINQPad-Datei:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(objFaker.Name.FirstName)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies gibt einfach einen zuf&auml;llig gew&auml;hlten Nachnamen im Direktbereich aus. Auf die gleiche Weise probieren Sie auch die anderen Funktionen dieser und anderer Klassen aus.<\/p>\n<h2>Adressdaten f&uuml;r Deutschland<\/h2>\n<p>Beim Ausprobieren von Funktionen wie <b>Address.Street-Address<\/b>, <b>Address.ZipCode <\/b>oder <b>Address.City <\/b>werden Sie feststellen, dass die Daten sich auf englische Adressen beziehen.<\/p>\n<p>Sie k&ouml;nnen allerdings leicht auf deutsche Anschriften umschwenken, indem Sie beim Erstellen der <b>Faker<\/b>-Klasse den Wert <b>&#8222;de&#8220; <\/b>als Parameter &uuml;bergeben. Die folgenden Zeilen liefern beispielsweise direkt deutsche Namen und Adressdaten:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker(\"de\")\r\n<span style=\"color:blue;\">Debug.Print<\/span>(objFaker.Name.FirstName)\r\n<span style=\"color:blue;\">Debug.Print<\/span>(objFaker.Address.StreetAddress)\r\n<span style=\"color:blue;\">Debug.Print<\/span>(objFaker.Address.ZipCode)\r\n<span style=\"color:blue;\">Debug.Print<\/span>(objFaker.Address.City)<\/pre>\n<h2>Kunden anlegen<\/h2>\n<p>Nachdem Sie aus dem Beitrag <b>Datenzugriff mit .NET, LINQPad und LINQ to DB <\/b>(<b>www.access-im-unternehmen.de\/1358<\/b>) wissen, wie Sie neue Datens&auml;tze mit den gew&uuml;nschten Feldwerten zu einer Tabelle wie <b>tblKunden <\/b>hinzuf&uuml;gen, haben Sie nun prinzipiell alle Techniken zum Erstellen von auf Zufallsdaten basierenden Datenbankinhalten zur Hand.<\/p>\n<p>Sie brauchen die Anweisungen zum F&uuml;llen der Felder nur noch mit den oben vorgestellten Funktionen der verschiedenen Klassen des <b>Bogus.Faker<\/b>-Objekts zu f&uuml;llen.<\/p>\n<p>Dann m&uuml;ssten wir allerdings f&uuml;r jeden Kunden ein neues <b>Bogus.Faker<\/b>-Objekt erstellen. Das brauchen wir jedoch nur ein einziges Mal zu tun, denn die <b>Bogus.Faker<\/b>-Klasse bietet eine Methode namens <b>Generate <\/b>an. Mit der k&ouml;nnen Sie, wenn Sie f&uuml;r den Parameter einen Zahlenwert angeben, eigentlich sogar gleich mehrere Objekte gleichzeitig erzeugen, aber diese k&ouml;nnen wir im aktuellen Kontext nicht verarbeiten. Also nutzen wir die <b>Generate<\/b>-Methode nur zum Erstellen eines Kunden gleichzeitig.<\/p>\n<p>Bevor wir mit dem eigentlichen Code zum Erstellen einsteigen, deklarieren wir noch eine <b>Enum<\/b>-Auflistung f&uuml;r das Geschlecht &#8211; wozu wir diese ben&ouml;tigen, erl&auml;utern wir anschlie&szlig;end:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum Gender\r\n     Male = 0\r\n     Female = 1\r\nEnd Enum<\/pre>\n<p>Die Prozedur <b>KundenAnlegen <\/b>erwartet die Anzahl der anzulegenden Kunden als Parameter. Dann deklariert sie die ben&ouml;tigten Variablen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KundenAnlegen(intMenge<span style=\"color:blue;\"> As <\/span>Int32)\r\n     <span style=\"color:blue;\">Dim <\/span>Beispielkunde<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> tblKunden\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As <\/span>Int32\r\n     <span style=\"color:blue;\">Dim <\/span>intGender<span style=\"color:blue;\"> As <\/span>int32<\/pre>\n<p><!--30percent--><\/p>\n<p>Sie erstellt dann ein <b>UserQuery<\/b>-Objekt auf Basis der Tabelle <b>tblKunden <\/b>und ein neues <b>Bogus.Faker<\/b>-Objekt, dem Sie die Klasse <b>tblKunden <\/b>als Typ zuweisen.<\/p>\n<p>Au&szlig;erdem f&uuml;gen wir noch den Wert <b>&#8222;de&#8220; <\/b>als Parameter an, damit Bogus deutsche Daten liefert:<\/p>\n<pre>     objUserQuery = tblKunden.DataContext\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker(Of tblKunden)(\"de\")<\/pre>\n<p>Dann folgt ein Teil, von dem nur die inneren Zeilen interessant sind &#8211; und mit dem wir die Regeln festlegen, nach denen wir neue Objekte des Typs <b>tblKunden <\/b>f&uuml;llen.<\/p>\n<p>Wichtig ist nur, dass Sie wissen, dass der Buchstabe <b>k <\/b>f&uuml;r das <b>tblKunden<\/b>-Objekt steht und <b>f <\/b>f&uuml;r das <b>Bogus.Faker<\/b>-Objekt. In der ersten Anweisung nutzen wir die Funktion <b>PickRandom<\/b>, um zuf&auml;llig einen der beiden Werte der Enumeration <b>Gender <\/b>zu ermitteln (also <b>0 <\/b>f&uuml;r m&auml;nnlich und <b>1 <\/b>f&uuml;r weiblich) und schreiben das Ergebnis in die Variable <b>intGender<\/b>:<\/p>\n<pre>     objFaker.Rules(Function(f, k)\r\n         intGender = f.PickRandom(Of Gender)<\/pre>\n<p>Diesen Wert ben&ouml;tigen wir anschlie&szlig;end gleich zwei Mal. Als Erstes addieren wir den Wert <b>1 <\/b>hinzu und tragen das Ergebnis f&uuml;r die Eigenschaft <b>AnredeID <\/b>ein, von der wir wissen, dass der Wert <b>1 <\/b>der Anrede <b>Herr <\/b>und der Wert <b>2 <\/b>der Anrede <b>Frau <\/b>entspricht:<\/p>\n<pre>             k.AnredeID = intGender + 1<\/pre>\n<p>Dann &uuml;bergeben wir <b>intGender <\/b>als Parameter der Funktion <b>FirstName <\/b>zum Ermitteln eines zuf&auml;lligen Vornamens. Durch diesen Parameter legen wir fest, ob <b>FirstName <\/b>einen m&auml;nnlichen oder einen weiblichen Nachnamen liefert:<\/p>\n<pre>             k.Vorname = f.Name.FirstName(intGender)<\/pre>\n<p>Die &uuml;brigen Zeilen legen fest, aus welchen Funktionen und Klassen von <b>Bogus.Faker <\/b>die Daten f&uuml;r die &uuml;brigen Felder bezogen werden sollen:<\/p>\n<pre>             k.Nachname = f.Name.LastName()\r\n             k.Strasse = f.Address.StreetAddress\r\n             k.PLZ = f.Address.ZipCode\r\n             k.Ort = f.Address.City\r\n             k.Land = f.Address.Country\r\n             k.EMail = f.Internet.Email\r\n             k.Telefon = f.Phone.PhoneNumber\r\n             k.Telefax = f.Phone.PhoneNumber\r\n         End Function)<\/pre>\n<p>Damit haben wir die Vorlage f&uuml;r das Erstellen von Elementen des Typs <b>tblKunden <\/b>definiert.<\/p>\n<p>Damit k&ouml;nnen wir nun in eine <b>For&#8230;Next<\/b>-Schleife einsteigen, welche die Werte von <b>1 <\/b>bis zur Anzahl der zu erstellenden Elemente aus dem Parameter <b>intMerge <\/b>durchl&auml;uft. Innerhalb der Schleife erstellen wir mit der <b>Generate<\/b>-Methode auf Basis des <b>objFaker<\/b>-Objekts ein neues Element des Typs <b>tblKunden <\/b>und referenzieren es mit der Variablen  <b>Beispielkunde<\/b>.<\/p>\n<p>Diesem weisen wir dann noch den Wert aus der Laufvariablen <b>i <\/b>f&uuml;r das Feld <b>ID <\/b>hinzu und speichern es mit der <b>Insert<\/b>-Methode in dem mit <b>objUserQuery <\/b>referenzierten <b>UserQuery<\/b>-Objekt auf Basis der Tabelle <b>tblKunden<\/b>:<\/p>\n<pre>     For i = 1 To intMenge\r\n         Beispielkunde = objFaker.Generate\r\n         Beispielkunde.ID = i\r\n         objUserQuery.Insert(Beispielkunde)\r\n     <span style=\"color:blue;\">Next<\/span> \r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die so erzeugten Kunden k&ouml;nnen Sie sich in der Beispieldatenbank ansehen oder Sie lassen sich diese mit einer einfachen Prozedur in LINQPad ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KundenAusgeben\r\n     <span style=\"color:blue;\">Dim <\/span>objKunde<span style=\"color:blue;\"> As <\/span>tblKunden\r\n     For Each objKunde In tblKunden\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objKunde.ID & \" \" & objKunde.AnredeID  & \" \" & objKunde.Vorname & \" \"  & objKunde.Nachname & \" \"  & objKunde.Strasse & \" \"  & objKunde.PLZ & \" \" & objKunde.Ort)\r\n     <span style=\"color:blue;\">Next<\/span> objKunde\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit wir immer frisch loslegen k&ouml;nnen, erstellen wir noch eine Prozedur zum L&ouml;schen der bereits vorhandenen Kunden:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KundenLoeschen\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     objUserQuery = tblKunden.DataContext\r\n     objUserQuery.Execute(\"DELETE FROM tblKunden\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Sie nun noch die folgenden Prozeduraufrufe in der Hauptmethode <b>Main<\/b> platzieren, erstellt diese die Daten in den Tabellen <b>tblAnreden <\/b>und <b>tblKunden <\/b>nach dem L&ouml;schen jeweils neu und gibt diese im Direktbereich von LINQPad aus:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     KundenLoeschen\r\n     AnredenLoeschen\r\n     AnredenAnlegen\r\n     AnredenAusgeben\r\n     KundenAnlegen(10)\r\n     KundenAusgeben\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Beispieldaten f&uuml;r umfangreicheres Datenmodell<\/h2>\n<p>Nachdem wir uns die Grundlagen angesehen haben, wollen wir nun noch ein etwas umfangreicheres Datenmodell mit Beispieldaten f&uuml;llen.<\/p>\n<p>Dabei wollen wir die g&auml;ngigsten Beziehungstypen abdecken &#8211; also 1:n- und m:n-Beziehungen. Dazu schauen wir uns das Datenmodell aus Bild 6 an. Die Reihenfolge beim Bef&uuml;llen der Tabellen sieht wie folgt aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_001.png\" alt=\"Datenmodell zum F&uuml;llen mit Beispieldaten\" width=\"700\" height=\"265,9551\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datenmodell zum F&uuml;llen mit Beispieldaten<\/span><\/b><\/p>\n<ul>\n<li><b>tblAnreden <\/b>(enth&auml;lt keine Fremdschl&uuml;sselfelder)<\/li>\n<li><b>tblProdukte <\/b>(enth&auml;lt keine Fremdschl&uuml;sselfelder)<\/li>\n<li><b>tblKunden <\/b>(verweist nur auf Tabelle <b>tblAnreden<\/b>)<\/li>\n<li><b>tblBestellungen <\/b>(verweist nur auf Tabelle <b>tblKunden<\/b>)<\/li>\n<li><b>tblBestellpositionen <\/b>(verweist auf die Tabellen <b>tblBestellungen <\/b>und <b>tblProdukte<\/b>)<\/li>\n<\/ul>\n<p>Dies ist die Reihenfolge zum F&uuml;llen mit Daten. Wenn wir die Tabellen vor dem F&uuml;llen mit Beispieldaten leeren wollen, m&uuml;ssen wir das in umgekehrter Reihenfolge erledigen &#8211; zumindest, wenn referenzielle Integrit&auml;t ohne L&ouml;schweitergabe aktiviert ist und beispielsweise das L&ouml;schen von Daten aus der Tabelle <b>tblAnreden <\/b>nicht m&ouml;glich ist, wenn es noch Datens&auml;tze in der Tabelle <b>tblKunden <\/b>gibt, die noch mit den zu l&ouml;schenden Daten verkn&uuml;pft sind.<\/p>\n<h2>Hinzuf&uuml;gen von Produkten<\/h2>\n<p>Die Produkte-Tabelle haben wir mit einem speziellen Feature ausgestattet. Es enth&auml;lt ein Anlage-Feld zum Speichern von Bildern. Wir wollen sehen, ob und wie sich das f&uuml;llen l&auml;sst. <\/p>\n<p>Dazu testen wir es zun&auml;chst einmal mit der folgenden Version:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ProdukteAnlegen(intMenge<span style=\"color:blue;\"> As <\/span>Int32)\r\n     <span style=\"color:blue;\">Dim <\/span>Beispielprodukt<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> tblProdukte\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As <\/span>Int32\r\n     objUserQuery = tblProdukte.DataContext\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker(Of tblProdukte)(\"de\")\r\n     objFaker.Rules(Function(f, p)\r\n         p.Produktbezeichnung = f.Commerce.ProductName\r\n         p.Einzelpreis = f.Commerce.Price(10, 100, 2)\r\n                    End Function)\r\n     For i = 1 To intMenge\r\n         Beispielprodukt = objFaker.Generate\r\n         Beispielprodukt.ID = i\r\n         objUserQuery.Insert(Beispielprodukt)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Hier referenzieren wir nun die Tabelle <b>tblProdukte <\/b>und legen im <b>Rules<\/b>-Abschnitt Folgendes fest:<\/p>\n<ul>\n<li>Die Produktbezeichnung soll mit dem Ergebnis der Funktion <b>ProductName <\/b>der Klasse <b>Commerce <\/b>gef&uuml;llt werden.<\/li>\n<li>Der Einzelpreis erh&auml;lt das Ergebnis der Funktion <b>Price <\/b>der <b>Commerce<\/b>-Klasse. Dieser &uuml;bergeben wir einige Parameter, und zwar den Mindestpreis, den H&ouml;chstpreis und die Anzahl der Nachkommastellen.<\/li>\n<li>Das Feld <b>Bild <\/b>lassen wir au&szlig;en vor.<\/li>\n<\/ul>\n<p>Den Aufruf dieser Prozedur f&uuml;gen wir der Methode <b>Main <\/b>hinzu und rufen diese dann auf:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     ...\r\n     ProdukteAnlegen(10)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Problem mit Anlagefeldern<\/h2>\n<p>Das Ergebnis ist allerdings ern&uuml;chternd: Wir erhalten die Fehlermeldung aus Bild 7. <b>LINQ to DB <\/b>stellt also offensichtlich eine <b>INSERT INTO<\/b>-Anweisung zusammen, die alle Felder der zugrunde liegenden Tabelle enth&auml;lt &#8211; und ber&uuml;cksichtigt somit auch das Anlagefeld <b>Bild<\/b>. Dies f&uuml;hrt zu einem Fehler, weil <b>INSERT INTO<\/b>-Abfragen nicht mit Anlagefeldern harmonieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_013.png\" alt=\"Problem mit mehrwertigen Feldern\" width=\"624,559\" height=\"417,7377\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Problem mit mehrwertigen Feldern<\/span><\/b><\/p>\n<p>Welche M&ouml;glichkeit haben wir nun Wenn wir in den Bereich mit den Verbindungen schauen, sehen wir dort neben <b>Tables <\/b>auch noch einen Untereintrag namens <b>Views<\/b>. K&ouml;nnen wir also gegebenenfalls eine Abfrage nutzen, um Daten zur Tabelle <b>tblProdukte <\/b>hinzuzuf&uuml;gen und dabei das Anlagefeld <b>Bild <\/b>auslassen Wir erstellen zun&auml;chst in der Access-Datenbank eine passende Abfrage namens <b>qryProdukteOhneBild<\/b>.<\/p>\n<p>Dazu m&uuml;ssen Sie LINQPad vermutlich schlie&szlig;en, da wahrscheinlich noch eine offene Verbindung zur <b>.accdb<\/b>-Datei besteht (das erkennen sie auch an der noch vorhandenen <b>.laccdb<\/b>-Datei).<\/p>\n<p>Anschlie&szlig;end &ouml;ffnen Sie die Access-Datenbank und erstellen eine Abfrage wie in Bild 8. Hier f&uuml;gen Sie alle Felder mit Ausnahme des Feldes <b>Bild <\/b>zum Entwurfsraster der Abfrage hinzu.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_014.png\" alt=\"Abfrage zum Ermitteln der Produkte ohne Bilder\" width=\"524,559\" height=\"430,6238\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Abfrage zum Ermitteln der Produkte ohne Bilder<\/span><\/b><\/p>\n<p>Danach schlie&szlig;en Sie die Datenbank und &ouml;ffnen die <b>LINQPad<\/b>-Datei erneut (wenn die Datenbank noch ge&ouml;ffnet ist, erhalten Sie in LINQPad einen Hinweis, dass die Datenbank erst geschlossen werden muss).<\/p>\n<p>Unter den Connections finden Sie im Bereich <b>Views<\/b> nun die Abfrage <b>qryProdukteOhneBilder<\/b> (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_015.png\" alt=\"Die Abfrage im Bereich Views\" width=\"524,559\" height=\"507,4655\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Die Abfrage im Bereich Views<\/span><\/b><\/p>\n<p>Damit wir diese Abfrage nun auch in der Prozedur <b>ProdukteAnlegen <\/b>nutzen k&ouml;nnen, passen Sie diese an, indem Sie alle Vorkommen von <b>tblProdukte <\/b>durch <b>qryProdukteOhneBilder <\/b>ersetzen, was an drei Stellen der Fall ist:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ProdukteAnlegen(intMenge<span style=\"color:blue;\"> As <\/span>Int32)\r\n     <span style=\"color:blue;\">Dim <\/span>Beispielprodukt<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> qryProdukteOhneBilder\r\n     ...\r\n     objUserQuery = qryProdukteOhneBilder.DataContext\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker( Of qryProdukteOhneBilder)(\"de\")\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Vor dem n&auml;chsten Test erstellen wir noch eine Prozedur, mit der wir die angelegten Produktdatens&auml;tze ausgeben k&ouml;nnen und f&uuml;gen der Methode Main einen entsprechenden Aufruf hinzu. Hier folgen die Details der Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ProdukteAusgeben\r\n     <span style=\"color:blue;\">Dim <\/span>objProdukt<span style=\"color:blue;\"> As <\/span>tblProdukte\r\n     For Each objProdukt In tblProdukte\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objProdukt.ID & \" \"  & objProdukt.Produktbezeichnung & \" \"  & objProdukt.Einzelpreis)\r\n     <span style=\"color:blue;\">Next<\/span> objProdukt\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Ausgabe sieht danach wie folgt aus:<\/p>\n<pre>1 Handcrafted Fresh Ball 65,92\r\n2 Handcrafted Concrete Ball 44,78\r\n3 Ergonomic Rubber Mouse 62,9\r\n4 Practical Cotton Tuna 87,45\r\n5 Gorgeous Cotton Hat 34,45\r\n6 Refined Granite Chicken 93,35\r\n7 Unbranded Wooden Salad 79,16\r\n8 Small Concrete Tuna 35,39\r\n9 Handcrafted Plastic Fish 28,13\r\n10 Generic Concrete Chair 76,74<\/pre>\n<h2>Bestellungen hinzuf&uuml;gen<\/h2>\n<p>Nun ben&ouml;tigen wir einige Bestellungen. Dies ist eine weitere Tabelle, die ein Fremdschl&uuml;sselfeld enth&auml;lt, das wir mit Daten f&uuml;llen m&uuml;ssen. In diesem Fall handelt es sich um das Fremdschl&uuml;sselfeld <b>KundeID<\/b>. Die daf&uuml;r ausw&auml;hlbaren Daten haben wir bereits in der Tabelle <b>tblKunden <\/b>angelegt.<\/p>\n<p>Die Werte des Prim&auml;rschl&uuml;sselfeldes <b>ID <\/b>dieser Tabelle beginnen mit 1 und wurden fortlaufend durchnummeriert, sodass wir annehmen k&ouml;nnen, dass das Prim&auml;rschl&uuml;sselfeld beim Anlegen von zehn Kundendatens&auml;tzen die Werte <b>1 <\/b>bis <b>10 <\/b>aufweist.<\/p>\n<p>Daher m&uuml;ssen wir der Prozedur <b>BestellungenAnlegen<\/b> aus Listing 1 neben dem Parameter <b>intMenge <\/b>zur Angabe der Anzahl der anzulegenden Datens&auml;tze noch die Menge der zuzuordnenden Kundendatens&auml;tze &uuml;bergeben. Dazu nutzen wir den zweiten Parameter <b>intKunden<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BestellungenAnlegen(intMenge<span style=\"color:blue;\"> As <\/span>Int32, intKunden<span style=\"color:blue;\"> As <\/span>int32)\r\n     <span style=\"color:blue;\">Dim <\/span>Beispielbestellung<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> tblBestellungen\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As <\/span>Int32\r\n     objUserQuery = tblBestellungen.DataContext\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker(Of tblBestellungen)(\"de\")\r\n     objFaker.Rules(Function(f, b)\r\n                        b.Bestelldatum = f.Date.Past(1, DateTime.Now)\r\n                        b.KundeID = f.Random.Int(1, intKunden)\r\n                    End Function)\r\n     For i = 1 To intMenge\r\n         Beispielbestellung = objFaker.Generate\r\n         Beispielbestellung.ID = i\r\n         objUserQuery.Insert(Beispielbestellung)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Anlegen von Beispielbestellungen<\/span><\/b><\/p>\n<p>Die Prozedur erstellt diesmal ein neues Objekt namens <b>Beispielbestellung <\/b>auf Basis von <b>tblBestellungen <\/b>und eine entsprechende <b>UserQuery<\/b>. Mit der <b>Rules<\/b>-Eigenschaft legt es fest, dass das Bestelldatum &uuml;ber die Funktion <b>Past <\/b>der Klasse <b>Date <\/b>generiert wird.<\/p>\n<p>Dieser &uuml;bergeben wir mit dem ersten Parameter die Anzahl der Jahre, &uuml;ber den sich die Daten in der Vergangenheit erstrecken sollen, und mit dem zweiten Parameter das sp&auml;teste Datum in diesem Zeitraum &#8211; hier mit <b>DateTime.Now <\/b>das aktuelle Datum.<\/p>\n<p>Wir erhalten also Datumsangaben, die sich vom aktuellen Datum ein Jahr in die Vergangenheit erstrecken.<\/p>\n<p>F&uuml;r das Fremdschl&uuml;sselfeld <b>KundeID <\/b>ermitteln wir mit der <b>Int<\/b>-Funktion der <b>Random<\/b>-Klasse Werte, die sich von dem mit dem ersten Parameter angegebenen Wert bis zu dem mit dem zweiten Parameter angegebenen Wert erstrecken.<\/p>\n<p>Diese umfassen also die Werte von <b>1 <\/b>bis zu der mit <b>intKunden <\/b>&uuml;bergebenen Anzahl Kunden.<\/p>\n<p>In der <b>For&#8230;Next<\/b>-Schleife, welche die Zahlen von 1 bis zum Wert aus <b>intMenge <\/b>durchl&auml;uft, legen wir mit der <b>Generate<\/b>-Methode jeweils ein neues Element an, weisen seiner Eigenschaft <b>ID <\/b>durchnummerierte Werte beginnend mit <b>1 <\/b>zu und speichern diese mit der Insert-Methode in der Datenbank.<\/p>\n<p>Die erzeugten Datens&auml;tze geben wir mit der folgenden Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BestellungenAusgeben\r\n     <span style=\"color:blue;\">Dim <\/span>objBestellung<span style=\"color:blue;\"> As <\/span>tblBestellungen\r\n     For Each objBestellung In tblBestellungen\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objBestellung.ID & \" \"  & objBestellung.Bestelldatum & \" \"  & objBestellung.KundeID)\r\n     <span style=\"color:blue;\">Next<\/span> objBestellung\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Aufruf lautet:<\/p>\n<pre>BestellungenAnlegen(100, 10)<\/pre>\n<p>Das Ergebnis sieht wie folgt aus:<\/p>\n<pre>1 17.07.2021 17:13:38 10\r\n2 13.09.2021 21:44:17 4\r\n3 13.05.2021 18:48:18 6\r\n4 10.08.2021 22:42:17 10\r\n5 22.07.2021 18:11:42 7\r\n6 28.11.2021 20:10:36 2\r\n7 30.12.2021 10:17:06 2\r\n8 30.01.2022 08:09:15 8\r\n...\r\n100 21.12.2021 15:08: 10<\/pre>\n<h2>Bestellpositionen hinzuf&uuml;gen<\/h2>\n<p>Nun fehlen nur noch die Bestellpositionen. Diese weisen gleich zwei Fremdschl&uuml;sselfelder auf, also m&uuml;ssen wir noch einen weiteren Parameter vorsehen.<\/p>\n<p>Wir &uuml;bergeben der Prozedur <b>BestellpositionenAnlegen <\/b>aus Listing 2 also neben der anzulegenden Menge von Bestellpositionen mit <b>intMenge <\/b>noch die verf&uuml;gbaren Bestellungen mit <b>intBestellungen <\/b>und die Produkte mit <b>intProdukte<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BestellpositionenAnlegen(intMenge<span style=\"color:blue;\"> As <\/span>Int32, intBestellungen<span style=\"color:blue;\"> As <\/span>Int32, intProdukte<span style=\"color:blue;\"> As <\/span>Int32)    \r\n     <span style=\"color:blue;\">Dim <\/span>Beispielbestellposition<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> tblBestellpositionen\r\n     <span style=\"color:blue;\">Dim <\/span>objUserQuery<span style=\"color:blue;\"> As <\/span>UserQuery\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As <\/span>Int32\r\n     objUserQuery = tblBestellpositionen.DataContext\r\n     <span style=\"color:blue;\">Dim <\/span>objFaker<span style=\"color:blue;\"> As <\/span><span style=\"color:blue;\">New<\/span> Bogus.Faker(Of tblBestellpositionen)(\"de\")\r\n     objFaker.Rules(Function(f, b)\r\n                        b.BestellungID = f.Random.Int(1, intBestellungen)\r\n                        b.ProduktID = f.Random.Int(1, intProdukte)\r\n                        b.Menge = f.Random.Int(1, 10)\r\n                        b.Einzelpreis = f.Commerce.Price(10,100,2)\r\n                    End Function)\r\n     For i = 1 To intMenge\r\n         Beispielbestellposition = objFaker.Generate\r\n         Beispielbestellposition.ID = i\r\n         objUserQuery.Insert(Beispielbestellposition)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anlegen von Beispielbestellpositionen<\/span><\/b><\/p>\n<p>Der Ablauf dieser Prozedur entspricht prinzipiell dem der zuvor beschriebenen Prozedur <b>BestellungenAnlegen<\/b>. Den Einzelpreis des jeweiligen Produkts ermitteln wir wie schon bei den Produkten mit der Funktion <b>Price <\/b>der <b>Commerce<\/b>-Klasse. Die Menge der Produkte je Bestellpositionen liefert die <b>Int<\/b>-Funktion der <b>Random<\/b>-Klasse, die Werte zwischen <b>1 <\/b>und <b>10 <\/b>zur&uuml;ckgeben soll.<\/p>\n<p>Die Ermittlung der Fremdschl&uuml;sselwerte f&uuml;r die Felder <b>BestellungID <\/b>und <b>ProduktID <\/b>erledigen wir ebenfalls mit dieser Funktion, wobei wir als minimalen Wert jeweils <b>1 <\/b>angeben und als maximalen Wert f&uuml;r die Bestellungen den Parameter <b>intBestellungen <\/b>und f&uuml;r die Produkte <b>intProdukte<\/b>.<\/p>\n<p>Die Ausgabe umfasst diesmal einige weitere Felder:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BestellpositionenAusgeben\r\n     <span style=\"color:blue;\">Dim <\/span>objBestellposition<span style=\"color:blue;\"> As <\/span>tblBestellpositionen\r\n     For Each objBestellposition In tblBestellpositionen\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objBestellposition.ID & \" \"  & objBestellposition.Menge & \" \"  & objBestellposition.BestellungID & \" \"  & objBestellposition.ProduktID & \" \"  & objBestellposition.Einzelpreis)\r\n     <span style=\"color:blue;\">Next<\/span> objBestellposition\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Als Aufruf verwenden wir:<\/p>\n<pre>BestellpositionenAnlegen(500, 100, 10)<\/pre>\n<p>Das Ergebnis lautet wie folgt:<\/p>\n<pre>1 10 90 2 56,34\r\n2 6 96 7 66,43\r\n3 8 65 7 66,55\r\n4 2 64 4 28,38\r\n5 2 97 1 89,98\r\n6 1 18 4 67,23\r\n7 8 61 5 43,02\r\n8 3 38 9 10,97\r\n9 2 50 9 31,46\r\n10 6 29 8 96,12\r\n...\r\n500 9 64 2 66,09<\/pre>\n<h2>Datenbank nach dem Anlegen der Daten<\/h2>\n<p>Die Hauptmethode <b>Main<\/b> der LINQ-Pad-Anwendung ruft nun die folgenden Prozeduren in der angegebenen Reihenfolge auf:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>Main\r\n     DatenLoeschen\r\n     AnredenAnlegen\r\n     AnredenAusgeben\r\n     KundenAnlegen(10)\r\n     KundenAusgeben\r\n     ProdukteAnlegen(10)\r\n     ProdukteAusgeben\r\n     BestellungenAnlegen(100, 10)\r\n     BestellungenAusgeben\r\n     BestellpositionenAnlegen(500, 100, 10)\r\n     BestellpositionenAusgeben\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Datenbank sieht nach dem Aufruf der Prozedur wie in Bild 10 aus. Hier fehlen eigentlich nur noch die Bilder &#8211; und darum k&uuml;mmern wir uns gleich noch.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_016.png\" alt=\"Tabellen mit den erzeugten Daten unter Access\" width=\"700\" height=\"492,212\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Tabellen mit den erzeugten Daten unter Access<\/span><\/b><\/p>\n<h2>Bilder zu den Produkten hinzuf&uuml;gen<\/h2>\n<p>Um die Bilder noch zu den Produkten hinzuzuf&uuml;gen, gehen wir einen kleinen Umweg. Wir f&uuml;gen zun&auml;chst der Tabelle <b>tblProdukte <\/b>noch ein Feld namens <b>Bildlink <\/b>mit dem Felddatentyp <b>Kurzer Text <\/b>hinzu.<\/p>\n<p>Au&szlig;erdem f&uuml;gen Sie dieses Feld auch zu der auf der Tabelle <b>tblProdukte <\/b>basierenden Abfrage <b>qryProdukteOhneBilder <\/b>hinzu (siehe Bild 11). Dazu m&uuml;ssen Sie, wie schon erw&auml;hnt, LINQPad zuerst schlie&szlig;en, dann die &Auml;nderung in der Datenbank vornehmen, die Datenbank schlie&szlig;en und dann wieder LINQPad &ouml;ffnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_017.png\" alt=\"Abfrage mit dem Feld Bildlink\" width=\"599,559\" height=\"417,4403\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Abfrage mit dem Feld Bildlink<\/span><\/b><\/p>\n<p>Das neue Feld erscheint dann automatisch in dem <b>View<\/b>-Objekt <b>qryProdukteOhneBilder<\/b>, da die Datenquelle beim erneuten &Ouml;ffnen von LINQPad immer aktualisiert wird.<\/p>\n<p>In der Prozedur <b>ProdukteAnlegen<\/b> legen wir nun eine Zeile an, mit der wir dem Feld <b>Bildlink <\/b>&uuml;ber die Funktion <b>PicsumUrl <\/b>der Klasse <b>Image <\/b>einen Link zu einem Beispielbild zuweisen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ProdukteAnlegen(intMenge<span style=\"color:blue;\"> As <\/span>Int32)\r\n     ...\r\n     objFaker.Rules(Function(f, p)\r\n         ...\r\n         p.Bildlink = f.Image.PicsumUrl\r\n     End Function)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Standardm&auml;&szlig;ig erzeugt das URLs auf Bilder mit 640&#215;480 Pixeln. &Uuml;ber die ersten beiden Parameter der Funktion <b>PicsumUrl <\/b>k&ouml;nnen Sie eine eigene Aufl&ouml;sung angeben.<\/p>\n<p>Nach dem erneuten Erstellen der Beispieldaten sieht die Tabelle <b>tblProdukte <\/b>in der Datenbank wie in Bild 12 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_1359_018.png\" alt=\"Die Tabelle mit dem Feld Bildlink\" width=\"649,559\" height=\"272,364\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Die Tabelle mit dem Feld Bildlink<\/span><\/b><\/p>\n<p>Nun fehlt noch ein Schritt: N&auml;mlich das Herunterladen der unter den URLs angegebenen Dateien und das Speichern dieser Dateien im Anlagefeld <b>Bild<\/b>. Wie dies gelingt, beschreiben wir im Beitrag <b>Bilder aus dem Web im Anlagefeld speichern <\/b>(<b>www.access-im-unternehmen.de\/1362<\/b>).<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit der Bibliothek <b>Bogus<\/b> und der Entwicklungsumgebung <b>LINQPad <\/b>k&ouml;nnen Sie sich praktische Funktionen zum F&uuml;llen von Tabellen mit zuf&auml;lligen Beispieldaten programmieren. Mit diesen k&ouml;nnen Sie sogar beliebig verkn&uuml;pfte und verschachtelte Tabellen mit Daten f&uuml;llen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>LINQPad.accdb<\/p>\n<p>LINQPadBogus.linq<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/DE01DE1D-5696-4B25-BE16-F0EB2F5014B7\/aiu_1359.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Produzieren von Beispieldaten ist immer wieder eine m&uuml;hselige Aufgabe. Beispieldaten ben&ouml;tigen Sie, um beim Entwickeln neuer Anwendungen die Funktionen zu testen, die mit der Anzeige, dem Bearbeiten oder L&ouml;schen von Daten zusammenh&auml;ngen. Und auch zum Testen des Hinzuf&uuml;gens von Daten ben&ouml;tigen Sie gegebenenfalls schon Daten in verkn&uuml;pften Tabellen zur Auswahl. Unter .NET gibt es verschiedene Bibliotheken, die das Generieren von Beispieldaten erleichtern. Leider sind diese nicht so ohne Weiteres unter Access verf&uuml;gbar. Zum Gl&uuml;ck gibt es Tools, mit denen Sie diese Bibliotheken dennoch f&uuml;r Ihre Zwecke einsetzen k&ouml;nnen. In diesem Beitrag nutzen wir den Editor LINQPad, um Beispieldaten mit der Bogus-Bibliothek zu erzeugen und diese dann mit der Bibliothek LINQ to DB den Tabellen einer Beispieldatenbank hinzuzuf&uuml;gen.<\/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":[66022022,662022,44000025],"tags":[],"class_list":["post-55001359","post","type-post","status-publish","format-standard","hentry","category-66022022","category-662022","category-VBA_und_Programmiertechniken"],"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 mit .NET und Bogus - 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_mit_NET_und_Bogus\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Beispieldaten generieren mit .NET und Bogus\" \/>\n<meta property=\"og:description\" content=\"Das Produzieren von Beispieldaten ist immer wieder eine m&uuml;hselige Aufgabe. Beispieldaten ben&ouml;tigen Sie, um beim Entwickeln neuer Anwendungen die Funktionen zu testen, die mit der Anzeige, dem Bearbeiten oder L&ouml;schen von Daten zusammenh&auml;ngen. Und auch zum Testen des Hinzuf&uuml;gens von Daten ben&ouml;tigen Sie gegebenenfalls schon Daten in verkn&uuml;pften Tabellen zur Auswahl. Unter .NET gibt es verschiedene Bibliotheken, die das Generieren von Beispieldaten erleichtern. Leider sind diese nicht so ohne Weiteres unter Access verf&uuml;gbar. Zum Gl&uuml;ck gibt es Tools, mit denen Sie diese Bibliotheken dennoch f&uuml;r Ihre Zwecke einsetzen k&ouml;nnen. In diesem Beitrag nutzen wir den Editor LINQPad, um Beispieldaten mit der Bogus-Bibliothek zu erzeugen und diese dann mit der Bibliothek LINQ to DB den Tabellen einer Beispieldatenbank hinzuzuf&uuml;gen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-10T18:43:37+00:00\" \/>\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=\"20\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_mit_NET_und_Bogus\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Beispieldaten generieren mit .NET und Bogus\",\"datePublished\":\"2022-05-10T18:43:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/\"},\"wordCount\":3253,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2\\\/2022\",\"2022\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/\",\"name\":\"Beispieldaten generieren mit .NET und Bogus - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-05-10T18:43:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Beispieldaten_generieren_mit_NET_und_Bogus\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Beispieldaten generieren mit .NET und Bogus\"}]},{\"@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 mit .NET und Bogus - 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_mit_NET_und_Bogus\/","og_locale":"de_DE","og_type":"article","og_title":"Beispieldaten generieren mit .NET und Bogus","og_description":"Das Produzieren von Beispieldaten ist immer wieder eine m&uuml;hselige Aufgabe. Beispieldaten ben&ouml;tigen Sie, um beim Entwickeln neuer Anwendungen die Funktionen zu testen, die mit der Anzeige, dem Bearbeiten oder L&ouml;schen von Daten zusammenh&auml;ngen. Und auch zum Testen des Hinzuf&uuml;gens von Daten ben&ouml;tigen Sie gegebenenfalls schon Daten in verkn&uuml;pften Tabellen zur Auswahl. Unter .NET gibt es verschiedene Bibliotheken, die das Generieren von Beispieldaten erleichtern. Leider sind diese nicht so ohne Weiteres unter Access verf&uuml;gbar. Zum Gl&uuml;ck gibt es Tools, mit denen Sie diese Bibliotheken dennoch f&uuml;r Ihre Zwecke einsetzen k&ouml;nnen. In diesem Beitrag nutzen wir den Editor LINQPad, um Beispieldaten mit der Bogus-Bibliothek zu erzeugen und diese dann mit der Bibliothek LINQ to DB den Tabellen einer Beispieldatenbank hinzuzuf&uuml;gen.","og_url":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-05-10T18:43:37+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Beispieldaten generieren mit .NET und Bogus","datePublished":"2022-05-10T18:43:37+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/"},"wordCount":3253,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2\/2022","2022","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/","url":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/","name":"Beispieldaten generieren mit .NET und Bogus - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-05-10T18:43:37+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Beispieldaten_generieren_mit_NET_und_Bogus\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Beispieldaten generieren mit .NET und Bogus"}]},{"@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\/55001359","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=55001359"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001359\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}