{"id":55001385,"date":"2022-08-01T00:00:00","date_gmt":"2022-08-04T18:16:21","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1385"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungsverwaltung_Datenmodell","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/","title":{"rendered":"Rechnungsverwaltung: Datenmodell"},"content":{"rendered":"<p><b>In einer Beitragsreihe namens &#8222;Rechnungsverwaltung&#8220; wollen wir eine kleine Rechnungs-ver-waltung programmieren. Im ersten Teil k&uuml;mmern wir uns um das Datenmodell der Rech-nungsverwaltung und zeigen an einem Praxisbeispiel in einem weiteren Teil, wie Sie die im Beitrag &#8222;Beispieldaten generieren mit .NET und Bogus&#8220; (www.access-im-unternehmen.de\/1359) vorgestellte Technik zum Erstellen von Beispieldaten einsetzen k&ouml;nnen. Das resultierende Datenmodell mit seinen Daten ist die Grundlage f&uuml;r weitere Beitragsteile, in denen wir Formulare zur Verwaltung der Rechnungen vorstellen sowie einen Rechnungsbericht erstellen, der gleich noch einen EPC-QR-Code zum schnellen &Uuml;berweisen per Smartphone enth&auml;lt. Au&szlig;erdem schauen wir uns noch an, wie Sie mithilfe von Kontoums&auml;tzen schnell abgleichen k&ouml;nnen, welche Rechnungen bezahlt sind.<\/b><\/p>\n<h2>Tabellen der Rechnungsverwaltung<\/h2>\n<p>In diesem ersten Teil der Beitragsreihe schauen wir uns die Tabellen an, die zum Speichern von Kunden, Produkten, Bestellungen, Bestelldetails und weiteren Informationen ben&ouml;tigt werden. Au&szlig;erdem werfen wir einen Blick auf die Beziehungen zwischen diesen Tabellen.<\/p>\n<p>Schlie&szlig;lich nutzen wir ein Tool, um die Tabellen mit Beispieldaten zu f&uuml;llen, damit die anschlie&szlig;ende Programmierung von Formularen und Berichten mit realistischen Daten erfolgen kann und Sie diese nicht von Hand eingeben m&uuml;ssen.<\/p>\n<h2>Tabellen zum Speichern der Kundendaten<\/h2>\n<p>Die Kundendaten an sich speichern wir in einer Tabelle namens <b>tblKunden<\/b>. Es gibt eine weitere Tabelle namens <b>tblAnreden<\/b>,  die wir als Nachschlagetabelle f&uuml;r die Anrede des Kunden nutzen wollen.<\/p>\n<p>Der Entwurf der Kundentabelle sieht wie in Bild 1 aus. Das Prim&auml;rschl&uuml;sselfeld zum Speichern eines eindeutigen Index hei&szlig;t <b>ID<\/b> und wird mit der Autowert-Funktion bef&uuml;llt. F&uuml;r die Kundennummer haben wir ein eigenes Feld vorgesehen, da es sein kann, dass Sie Kundennummern aus einem Onlineshop oder anderen Quellen &uuml;bernehmen m&uuml;ssen. F&uuml;r das Feld <b>Kundennummer <\/b>legen wir einen eindeutigen Index fest, damit auch dieses eindeutig ist. Au&szlig;erdem stellen wir den Felddatentyp auf <b>Kurzer Text <\/b>ein. Das Feld <b>AnredeID <\/b>ist ein Fremdschl&uuml;sselfeld mit Nachschlagefunktion f&uuml;r das Ausw&auml;hlen eines der Datens&auml;tze der Tabelle <b>tblAnreden<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_001.png\" alt=\"Die Tabelle tblKunden\" width=\"549,559\" height=\"519,3425\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Tabelle tblKunden<\/span><\/b><\/p>\n<p>F&uuml;r das Feld <b>PLZ <\/b>haben wir eine Feldgr&ouml;&szlig;e von <b>5 <\/b>eingestellt. Damit kann der Benutzer nur f&uuml;nf Zeichen f&uuml;r die PLZ eingeben.<\/p>\n<h2>Tabelle zum Speichern der Anreden<\/h2>\n<p>Die Tabelle <b>tblAnreden <\/b>enth&auml;lt, wie es meistens der Fall ist, nur zwei Felder &#8211; eines namens <b>ID <\/b>mit dem Prim&auml;rschl&uuml;ssel und eines f&uuml;r die Bezeichnung der Anrede (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_002.png\" alt=\"Die Tabelle tblAnreden\" width=\"499,5589\" height=\"360,5838\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Tabelle tblAnreden<\/span><\/b><\/p>\n<p>Die Beziehung zwischen den beiden Tabellen sowie die f&uuml;r die Auswahl der jeweiligen Anrede notwendigen Nachschlage-feld-Eigenschaften haben wir komfortabel mit dem Nachschlage-Assistent festgelegt, den Sie &uuml;ber die Auswahl des Datentyps <b>Nachschlage-Assistent <\/b>starten. Dort haben wir im letzten Schritt eingestellt, dass wir f&uuml;r die Beziehung die Datenintegrit&auml;t aktivieren &#8211; das ist die neue Bezeichnung im Nachschlagefeld-Assistenten f&uuml;r referenzielle Integrit&auml;t.<\/p>\n<p>Die beiden Werte f&uuml;r die Tabelle <b>tblAnreden <\/b>tragen wir gleich ein, sodass wir diese nicht mehr mit dem Beispieldatengenerator f&uuml;llen m&uuml;ssen. Das Ergebnis sieht schlie&szlig;lich wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_003.png\" alt=\"Die Tabelle tblAnreden in der Datenblattansicht\" width=\"374,5589\" height=\"165,09\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die Tabelle tblAnreden in der Datenblattansicht<\/span><\/b><\/p>\n<h2>Tabelle zum Speichern der Produkte<\/h2>\n<p>Die Tabelle <b>tblProdukte<\/b> sieht in der Entwurfsansicht wie in Bild 4 aus. Sie enth&auml;lt ein Prim&auml;rschl&uuml;sselfeld namens <b>ID <\/b>sowie ein Feld namens <b>Produktbezeichnung<\/b>, das wir mit einem eindeutigen Index versehen. Auf diese Weise kann nicht versehentlich ein Produkt gleichen Namens zwei Mal angelegt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_00$.png\" alt=\"Die Tabelle tblProdukte\" width=\"674,559\" height=\"396,0547\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabelle tblProdukte<\/span><\/b><\/p>\n<p>Au&szlig;erdem enth&auml;lt die Tabelle noch ein Feld namens <b>Einzelpreis <\/b>und zwei Fremdschl&uuml;sselfelder. Das erste hei&szlig;t <b>MehrwertsteuersatzID <\/b>und dient als Nachschlagefeld f&uuml;r die Datens&auml;tze der Tabelle <b>tblMehrwertsteuersaetze <\/b>und das zweite namens <b>EinheitID <\/b>erlaubt die Auswahl eines der Datens&auml;tze der Tabelle <b>tblEinheiten<\/b>.<\/p>\n<p>Die Tabelle <b>tblMehrwertsteuersaetze <\/b>enth&auml;lt die Felder aus der Entwurfsansicht aus Bild 5. Sie enth&auml;lt nicht nur ein Prim&auml;rschl&uuml;sselfeld und ein Feld f&uuml;r den jeweiligen Mehrwertsteuersatz, sondern auch noch ein Feld mit der Bezeichnung des Mehrwertsteuersatzes. F&uuml;r das Feld <b>Mehrwertsteuersatzwert <\/b>haben wir den Datentyp <b>W&auml;hrung <\/b>festgelegt, weil dies die einzige M&ouml;glichkeit ist, die Genauigkeit des dahinter liegenden Datentyps <b>Decimal <\/b>abzubilden. Da das Feld Prozents&auml;tze abbilden soll, haben wir allerdings die Eigenschaft <b>Format <\/b>auf <b>Prozentzahl <\/b>eingestellt.  Da wir es in der Regel mit Prozents&auml;tzen mit ganzen Prozentpunkten zu tun haben, also beispielsweise <b>7% <\/b>oder <b>19%<\/b>, stellen wir au&szlig;erdem die Eigenschaft <b>Dezimalstellenanzeige <\/b>auf den Wert <b>0 <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_004.png\" alt=\"Die Tabelle tblMehrwertsteuersaetze in der Entwurfsansicht\" width=\"574,559\" height=\"370,7426\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die Tabelle tblMehrwertsteuersaetze in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Daten sehen nach der Eingabe wie in Bild 6 aus. Im Nachschlagefeld f&uuml;r das Feld <b>MehrwertsteuersatzID <\/b>in der Tabelle <b>tblProdukte <\/b>haben wir die beiden Felder <b>ID <\/b>und <b>Mehrwertsteuersatzwert <\/b>der Tabelle <b>tblMehrwertsteuersaetze<\/b> als Datensatzherkunft ausgew&auml;hlt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_005.png\" alt=\"Die Tabelle tblMehrwertsteuersaetze in der Datenblattansicht\" width=\"474,5589\" height=\"177,9596\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Tabelle tblMehrwertsteuersaetze in der Datenblattansicht<\/span><\/b><\/p>\n<h2>Tabelle zum Speichern der Einheiten<\/h2>\n<p>Die Tabelle <b>tblEinheiten <\/b>enth&auml;lt nur die beiden Felder <b>ID <\/b>und <b>Einheitbezeichnung<\/b> (siehe Bild 7). Warum verwenden wir hier und in den vorhergehenden Tabellen gelegentlich den scheinbar unn&ouml;tigen Zusatz <b>Bezeichnung <\/b>wie in <b>Einheitbezeichnung<\/b>? Vielleicht verwenden Sie die Tabellen einmal als Datenquelle f&uuml;r eine .NET-Anwendung unter Anbindung &uuml;ber das Entity Framework.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_006.png\" alt=\"Die Tabelle tblEinheiten in der Entwurfsansicht\" width=\"599,559\" height=\"350,8939\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Die Tabelle tblEinheiten in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Dort w&uuml;rden Sie f&uuml;r die Tabelle <b>tblEinheiten <\/b>eine Klasse namens <b>Einheit <\/b>erstellen sowie eine Auflistung namens <b>Einheiten<\/b>. Wenn das Feld <b>Einheitbezeichnung <\/b>nun <b>Einheit <\/b>hie&szlig;e, h&auml;tte es die gleiche Bezeichnung wie die Klasse, was jedoch nicht zul&auml;ssig ist.<\/p>\n<p>Wenn Sie sicher nicht vorhaben, jemals eine solche Anwendung auf dem Datenmodell aufzusetzen, dann k&ouml;nnen Sie auch mit Bezeichnungen wie <b>Einheit <\/b>oder <b>Mehrwertsteuersatz <\/b>arbeiten. Und falls es dann doch geschieht, k&ouml;nnen Sie das Problem immer noch durch ein geeignetes Mapping umgehen. Die Tabelle <b>tblEinheiten <\/b>f&uuml;llen wir auch gleich mit ein paar Eintr&auml;gen &#8211; siehe -Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_008.png\" alt=\"Die Tabelle tblEinheiten mit einigen Beispieldatens&auml;tzen\" width=\"424,5589\" height=\"243,3203\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Die Tabelle tblEinheiten mit einigen Beispieldatens&auml;tzen<\/span><\/b><\/p>\n<h2>Tabelle zum Speichern der Bestellungen<\/h2>\n<p>Wir wollen jede Bestellung einem Kunden zuordnen, und au&szlig;erdem soll jede Bestellung alle bestellten Produkte definieren. Das gelingt nicht in einer einzigen Tabelle. Wir erstellen also erst einmal eine Tabelle namens <b>tblBestellungen <\/b>und legen in dieser Informationen fest wie die Bestellnummer, die Datumsangaben wie Bestelldatum, Rechnungsdatum et cetera und den Kunden, f&uuml;r den diese Bestellung erfasst wurde (siehe Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_009.png\" alt=\"Die Tabelle tblBestellungen in der Entwurfsansicht\" width=\"599,559\" height=\"441,7802\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Die Tabelle tblBestellungen in der Entwurfsansicht<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>F&uuml;r das Feld <b>Bestellnummer<\/b>, das wir zus&auml;tzlich zum Prim&auml;rschl&uuml;sselfeld <b>ID <\/b>nutzen, um individuelle Bestellnummern vergeben zu k&ouml;nnen, legen wir einen eindeutigen Index fest. Auf diese Weise stellen wir sicher, dass der Benutzer jede Bestellnummer nur einmal verwenden kann.<\/p>\n<h2>Nachschlagefeld f&uuml;r den Kunden zu einer Bestellung anpassen<\/h2>\n<p>Den Kunden ordnen wir dabei wieder &uuml;ber ein Nachschlagefeld zu, mit dem wir den Kunden ausw&auml;hlen. Mit dem Nachschlage-Assistenten konnten wir dabei neben dem Prim&auml;rschl&uuml;sselfeld der Tabelle tblKunden nur ein oder mehrere Felder der Tabelle ausw&auml;hlen, die beim Ausklappen des Nachschlagefeldes erscheinen.<\/p>\n<p>Angezeigt wird aber immer nur das erste dort angegebene Feld (neben der gebundenen Spalte). Also passen wir die Abfrage, die wir mit dem Nachschlageassistenten erstellt haben, noch an, sodass diese in einem Feld gleich mehrere Informationen liefert &#8211; in diesem Fall die <b>Firma<\/b>, <b>Vorname <\/b>und <b>Nachname <\/b>sowie die Kundennummer.<\/p>\n<p>Im ersten Anlauf haben wir damit f&uuml;r die Eigenschaft <b>Datensatzherkunft <\/b>im Bereich <b>Nachschlagen <\/b>der Feldeigenschaften die folgende Abfrage erstellt:<\/p>\n<pre>SELECT [tblKunden].[ID], [tblKunden].[Firma] FROM tblKunden;<\/pre>\n<p>Dieses &auml;ndern wir nun, indem wir auf die Schaltfl&auml;che mit den drei Punkten rechts von der Eigenschaft klicken. Im nun erscheinenden Abfrageentwurf bearbeiten wir das Feld der zweiten Spalte wie in Bild 10.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_010.png\" alt=\"Datensatzherkunft f&uuml;r das Nachschlagefeld zur Auswahl des Kunden\" width=\"700\" height=\"295,1612\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Datensatzherkunft f&uuml;r das Nachschlagefeld zur Auswahl des Kunden<\/span><\/b><\/p>\n<p>Was macht dieser Ausdruck genau und warum verwenden wir den <b>&#038;<\/b>-Operator und den <b>+<\/b>-Operator gemischt? Wir wollen einen Ausdruck erzeugen, der f&uuml;r einen Kunden mit Firma wie folgt aussieht:<\/p>\n<pre>Andr&eacute; Minhorst Verlag - Minhorst, Andr&eacute; (123)<\/pre>\n<p>F&uuml;r einen Kunden ohne Angabe einer Firma soll die zweite Spalte der Abfrage den folgenden Ausdruck liefern:<\/p>\n<pre>M&uuml;ller, Klaus (234)<\/pre>\n<p>Wir wollen also daf&uuml;r sorgen, dass wenn das Feld <b>Firma <\/b>den Wert <b>Null <\/b>enth&auml;lt, auch das Minus-Zeichen zwischen <b>Firma <\/b>und <b>Nachname <\/b>wegf&auml;llt.<\/p>\n<p>Wenn wir nun wissen, dass das Kaufmanns-Und (<b>&#038;<\/b>) immer alle Teile einer Zeichenkverkettung zur&uuml;ckliefert, auch wenn einer der Teile <b>Null <\/b>ist, und das Plus-Zeichen (<b>+<\/b>) immer den Wert Null zur&uuml;ckgibt, wenn nur eines der beiden verkn&uuml;pften Elements <b>Null <\/b>ist, k&ouml;nnen wir den Ausdruck wie folgt gestalten:<\/p>\n<pre>Kundenbezeichnung: [Firma]+\" - \" & [Nachname] & \", \" & [Vorname] & \" (\" & [Kundennummer] & \")\"<\/pre>\n<p>Das Plus-Zeichen sorgt also daf&uuml;r, dass wenn das Feld <b>Firma <\/b>leer ist, also den Wert <b>Null <\/b>hat, auch die Verkn&uuml;pfung mit der Zeichenkette &#8222;<b> &#8211; <\/b>&#8220; zu <b>Null <\/b>wird.<\/p>\n<p>Das Ergebnis sieht beispielsweise wie in Bild 11 aus. Hier haben wir jeweils einen Kundendatensatz mit Angabe einer Firma und einmal ohne.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_011.png\" alt=\"Auswahl der Kunden per Nachschlagefeld\" width=\"649,559\" height=\"251,8114\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Auswahl der Kunden per Nachschlagefeld<\/span><\/b><\/p>\n<h2>Bestellungen und Produkte zu Bestelldetails zusammenf&uuml;hren<\/h2>\n<p>Damit kommen wir schon zur vorerst letzten Tabelle, die es allerdings in sich hat. Es handelt sich um die Tabelle <b>tblBestellpositionen<\/b>, mit der wir die Datens&auml;tze der Tabelle <b>tblBestellungen <\/b>und die der Tabelle <b>tblProdukte <\/b>zusammenf&uuml;hren wollen. Das hei&szlig;t, dass diese Tabelle grunds&auml;tzlich eine Tabelle zur Herstellung einer m:n-Beziehung ist, mit der wir beliebige Datens&auml;tze der Tabelle <b>tblBestellungen<\/b> mit beliebigen Datens&auml;tzen der Tabelle <b>tblProdukte <\/b>zusammenf&uuml;hren wollen. Normalerweise w&uuml;rde es dazu reichen, der Tabelle <b>tblBestellpositionen <\/b>jeweils ein Nachschlagefeld hinzuzuf&uuml;gen, mit der man je einen Datensatz der Tabelle <b>tblBestellungen <\/b>und einen der Tabelle <b>tblProdukte <\/b>ausw&auml;hlen kann. Allerdings enth&auml;lt eine Bestellposition normalerweise auch noch eine Menge, den Einzelpreis, die Einheit und den Mehrwertsteuersatz &#8211; und wir m&ouml;chten auch noch die M&ouml;glichkeit eines Rabatts hinzuf&uuml;gen.<\/p>\n<p>Nun k&ouml;nnte man sich ja darauf festlegen, dass der Einzelpreis und der Mehrwertsteuersatz sowie die Einheit bereits in der Tabelle <b>tblProdukte <\/b>gespeichert sind. Und da wir in der Tabelle <b>tblBestellpositionen <\/b>den jeweiligen Datensatz der Tabelle <b>tblProdukte <\/b>referenzieren, liegen diese Informationen f&uuml;r die Bestellposition eigentlich bereits vor.<\/p>\n<p>Aber: Es kann ja sein, dass sich im Laufe der Zeit Einheit, Einzelpreis oder Mehrwertsteuersatz in der Tabelle <b>tblProdukte <\/b>&auml;ndern. Das w&uuml;rde bedeuten, dass sich diese &Auml;nderungen auf alle Bestellpositionen auswirken, welche das ge&auml;nderte Produkt enthalten. Und wenn man auf dieser Basis beispielsweise den Umsatz f&uuml;r vergangene Zeitr&auml;ume ermittelt, w&uuml;rde sich auch dieser nachtr&auml;glich &auml;ndern.<\/p>\n<p>Also geht man so vor, dass man den Einzelpreis, den Mehrwertsteuersatz sowie die Einheit in Form weiterer Felder f&uuml;r die jeweilige Bestellposition speichert.<\/p>\n<p>F&uuml;r das Datenmodell bedeutet das zun&auml;chst einfach nur, dass wir der Tabelle <b>tblBestellpositionen <\/b>neben den Fremdschl&uuml;sselfeldern zu den beiden Tabellen <b>tblBestellungen <\/b>und <b>tblProdukte <\/b>noch weitere Felder zum &Uuml;bernehmen dieser Informationen aus der Tabelle <b>tblProdukte <\/b>hinzuf&uuml;gen.<\/p>\n<p>F&uuml;r das Arbeiten mit dieser Tabelle bedeutet es jedoch, dass wir beim Anlegen einer neuen Bestellposition die jeweils g&uuml;ltigen Werte aus der Tabelle <b>tblProdukte<\/b> in die Felder <b>Einzelpreis<\/b>, <b>Mehrwertsteuersatz <\/b>und <b>EinheitID <\/b>&uuml;bernehmen. Der Entwurf der Tabelle sieht also wie in Bild 12 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_012.png\" alt=\"Entwurf der Tabelle tblBestellpositionen\" width=\"624,559\" height=\"452,7605\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Entwurf der Tabelle tblBestellpositionen<\/span><\/b><\/p>\n<p>Bei der &Uuml;bernahme sind noch folgende Besonderheiten zu beachten:<\/p>\n<ul>\n<li>Der Einzelpreis wird einfach aus der Tabelle <b>tblProdukte <\/b>entnommen.<\/li>\n<li>Der Mehrwertsteuersatz ist der Tabelle <b>tblProdukte <\/b>&uuml;ber das Nachschlagefeld zur Tabelle <b>tblMehrwertsteuersaetze <\/b>zugewiesen. Diesen wollen wir diesmal direkt in ein W&auml;hrungsfeld mit dem Format <b>Prozentzahl <\/b>zuweisen.<\/li>\n<li>Die Einheit soll auch in der Tabelle <b>tblBestellpositionen <\/b>&uuml;ber ein Fremdschl&uuml;sselfeld namens <b>EinheitID <\/b>erfasst werden und wird daher direkt vom gleichnamigen Feld der Tabelle <b>tblProdukte <\/b>entnommen.<\/li>\n<\/ul>\n<p>Dies zu &uuml;bernehmen, ist normalerweise Bestandteil einiger Zeilen Code, die wir im Formular zum Verwalten von Bestellungen unterbringen. Es gibt jedoch eine Alternative, die wir im Beitrag <b>Bestellposition per Datenmakro erg&auml;nzen <\/b>(<b>www.access-im-unternehmen.de\/1375<\/b>) vorstellen.<\/p>\n<p>An dieser Stelle reicht es uns jedoch, dass wir wissen, dass wir uns sp&auml;ter um die Technik zum Eintragen der Produktdaten in die Bestellposition k&uuml;mmern.<\/p>\n<h2>Zusammengesetzter Prim&auml;rschl&uuml;ssel oder zusammengesetzter eindeutiger Schl&uuml;ssel?<\/h2>\n<p>In vermutlich allen Beispielen von Access im Unternehmen verwenden wir f&uuml;r die Verkn&uuml;pfungstabellen zum Herstellen von m:n-Beziehungen Tabellen, die &uuml;ber einen einfachen Prim&auml;rschl&uuml;ssel verf&uuml;gen sowie &uuml;ber zwei Nachschlagefelder zum Verkn&uuml;pfen der Datens&auml;tze. Das ist grunds&auml;tzlich nicht falsch, aber nicht unbedingt n&ouml;tig.<\/p>\n<p>Wir k&ouml;nnen genauso den einfachen Prim&auml;rschl&uuml;ssel weglassen und stattdessen einen zusammengesetzten Prim&auml;rschl&uuml;ssel festlegen, der aus den beiden Nachschlagefeldern besteht. Genau genommen sind es auch nicht immer zwingend Nachschlagefelder, denn die f&uuml;r die m:n-Beziehung notwendigen Beziehungen zwischen der Verkn&uuml;pfungstabelle und den zu verkn&uuml;pfenden Tabellen kann man auch &uuml;ber einfache Beziehungen ohne Nachschlagefeld im Beziehungen-Fenster herstellen.<\/p>\n<p>Wann sollte man aber nun einen einfachen Prim&auml;rschl&uuml;ssel nutzen und wann einen aus den Fremdschl&uuml;sselfeldern bestehenden? In den meisten F&auml;llen spielt es keine Rolle, es sei denn, man m&ouml;chte in die Tiefen der Performance-Messung einsteigen &#8211; denn die Wahl der Indizes beeinflusst auch immer die Geschwindigkeit beim Lesen und Schreiben von Daten in den betroffenen Feldern.<\/p>\n<p>Ein einzelnes Prim&auml;rschl&uuml;sselfeld ist eigentlich nur dann notwendig, wenn die Datens&auml;tze der m:n-Verkn&uuml;pfungstabelle selbst von einer anderen Tabelle aus referenziert werden sollen. Da wir aber nicht wissen, ob dies einmal der Fall sein wird, verwenden wir weiterhin einen aus einem Autowert-Feld bestehenden Prim&auml;rschl&uuml;ssel f&uuml;r unsere Tabellen, auch wenn es sich um m:n-Verkn&uuml;pfungstabellen handelt. Letztlich erhalten wir damit immer ein eindeutiges Feld, auf das wir im Fall der F&auml;lle von anderen Tabellen aus zugreifen k&ouml;nnen.<\/p>\n<h2>Eindeutigen, zusammengesetzten Index definieren<\/h2>\n<p>Wenn wir keinen aus den beiden Feldern <b>BestellungID <\/b>und <b>ProduktID <\/b>zusammengesetzten Prim&auml;rschl&uuml;ssel definieren, m&uuml;ssen wir aber auf jeden Fall einen aus diesen beiden Feldern bestehenden eindeutigen Index erstellen. Dieser sorgt daf&uuml;r, dass der Benutzer jeder Bestellung jedes Produkt nur einmal hinzuf&uuml;gen kann. F&uuml;r den Fall, dass er mehrere Exemplare des gleichen Produkts gibt, kann er ja die Menge entsprechend anpassen.<\/p>\n<p>Den Index k&ouml;nnen wir nicht direkt in der Entwurfsansicht erstellen, sondern wir ben&ouml;tigen den Dialog <b>Indizes: tblBestellpositionen <\/b>daf&uuml;r. Diesen &ouml;ffnen wir mit dem Ribbonbefehl <b>Tabellenentwurf|Einblenden\/Aus-blen-den|In-dizes<\/b>. Im nun erscheinenden Dialog f&uuml;gen wir neben dem bereits vorhandenen Prim&auml;rschl&uuml;ssel namens <b>PrimaryKey <\/b>noch einen weiteren Schl&uuml;ssel namens <b>UniqueKey <\/b>hinzu (gegebenenfalls hat Access automatisch weitere Indizes angelegt, die Sie mit Ausnahme des Prim&auml;rindexes entfernen k&ouml;nnen).<\/p>\n<p>In der gleichen Zeile w&auml;hlen wir das erste Feld f&uuml;r den Index aus, und zwar <b>BestellungID<\/b>. Direkt darunter lassen wir die Spalte <b>Indexname <\/b>frei und tragen unter <b>Feldname <\/b>den Wert <b>ProduktID <\/b>ein.<\/p>\n<p>Damit dieser Index nur eindeutige Werte zul&auml;sst, wechseln wir wieder zur Zeile mit dem Indexnamen <b>UniqueKey <\/b>und stellen f&uuml;r diesen unter <b>Indexeigenschaften <\/b>die Eigenschaft <b>Eindeutig <\/b>auf <b>Ja <\/b>ein (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_013.png\" alt=\"Definieren eines zusammengesetzten Indexes\" width=\"549,559\" height=\"333,6902\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Definieren eines zusammengesetzten Indexes<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir diesen Dialog schlie&szlig;en und den Tabellenentwurf beenden.<\/p>\n<h2>Tabelle zum Speichern von L&auml;ndern<\/h2>\n<p>Weiter oben haben wir in der Tabelle <b>tblKunden <\/b>ein Textfeld zur Eingabe des Landes des Kunden eingef&uuml;gt. Da es nur eine begrenzte Anzahl L&auml;nder gibt, wollen wir daf&uuml;r nachtr&auml;glich doch noch eine Lookup-Tabelle hinzuf&uuml;gen sowie aus dem Textfeld <b>Land<\/b> ein Nachschlagefeld machen, das zur Auswahl eines der L&auml;nder aus der noch zu erstellenden Tabelle <b>tblLaender <\/b>dient.<\/p>\n<p>Also erstellen wir als Erstes die Tabelle <b>tblLaender<\/b>. Diese soll neben dem Prim&auml;rschl&uuml;sselfeld <b>ID <\/b>noch das Feld <b>LandBezeichnung <\/b>enthalten. F&uuml;r dieses Feld legen wir au&szlig;erdem noch einen eindeutigen Index fest, damit jedes Land nur einmal in dieser Tabelle gespeichert werden kann. Der Entwurf der Tabelle sieht anschlie&szlig;end wie in Bild 14 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_017.png\" alt=\"Entwurf der Tabelle zum Speichern der L&auml;nder\" width=\"524,559\" height=\"359,6443\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Entwurf der Tabelle zum Speichern der L&auml;nder<\/span><\/b><\/p>\n<p>Wir haben die Tabelle bereits mit einer der im Internet verf&uuml;gbaren Liste aller L&auml;nder gef&uuml;llt. Diese erhebt keinen Anspruch auf Vollst&auml;ndigkeit oder Korrektheit (siehe Bild 15).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_018.png\" alt=\"Liste aller L&auml;nder\" width=\"424,5589\" height=\"459,0469\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Liste aller L&auml;nder<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir nur noch das Feld <b>Land <\/b>in ein Nachschlagefeld umwandeln und in <b>Land-ID <\/b>umbenennen. Solange Sie das erledigen, bevor das Feld Daten enth&auml;lt, ist es kein Problem. Sind bereits Daten enthalten, legen Sie das Feld <b>LandID <\/b>neu an und verwenden danach eine Aktualisierungsabfrage, um den jeweiligen Datensatz aus der Tabelle <b>tblLaender <\/b>f&uuml;r den Eintrag aus dem Feld <b>Land <\/b>zu ermitteln und den Wert des Feldes <b>ID <\/b>f&uuml;r diesen L&auml;nder-Datensatz in das Fremdschl&uuml;sselfeld <b>LandID <\/b>zu &uuml;bernehmen.<\/p>\n<h2>&Uuml;berblick &uuml;ber das Datenmodell<\/h2>\n<p>Das Datenmodell f&uuml;r die eigentliche Anwendung ist nun vollst&auml;ndig. Eine &Uuml;bersicht des Datenmodells finden Sie im <b>Beziehungen<\/b>-Fenster. Diese &ouml;ffnen Sie mit dem Ribbonbefehl <b>Datenbanktools|Beziehungen|Beziehungen<\/b>. Es zeigt die Tabellen vermutlich nicht so ordentlich platziert an wie in Bild 16. Gegebenenfalls ist Ihnen beim Anlegen der Verkn&uuml;pfungen &uuml;ber den Nachschlage-Assistenten noch die eine oder andere Beziehung durchgeschl&uuml;pft, wenn es um das Definieren referenzieller Integrit&auml;t geht. Das erkennen Sie schnell daran, dass die Beziehungspfeile nicht fett abgebildet sind und nicht die Beschriftungen <b>1 <\/b>und <b>8 <\/b>an den Enden enthalten. In diesem Fall reicht ein Doppelklick auf den Beziehungspfeil aus, um den Dialog <b>Beziehungen bearbeiten <\/b>f&uuml;r diese Beziehung zu aktivieren. Hier setzen Sie einen Haken f&uuml;r die Eigenschaft <b>Mit referentieller Integrit&auml;t<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_007.png\" alt=\"Das Datenmodell im &Uuml;berblick\" width=\"700\" height=\"280,9908\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Das Datenmodell im &Uuml;berblick<\/span><\/b><\/p>\n<p>Gegebenenfalls ist auch noch das Aktivieren einer der beiden Optionen <b>Aktualisierungsweitergabe an verwandte Felder <\/b>oder <b>L&ouml;schweitergabe an verwandte Datens&auml;tze <\/b>gew&uuml;nscht. Im Falle der Beziehung zwischen den Tabellen tblKunden und tblBestellungen ben&ouml;tigen wir keine davon &#8211; im Gegenteil: Eine L&ouml;schweitergabe w&auml;re kontraproduktiv, da nach dem Aktivieren dieser Option ein L&ouml;schen eines Kunden direkt das L&ouml;schen der mit diesem verkn&uuml;pften Datens&auml;tze der Tabelle <b>tblBestellungen <\/b>verbunden w&auml;re. Normalerweise m&ouml;chte man aber gerade die Bestellungsdaten, die auch wichtige Informationen &uuml;ber die Ums&auml;tze enthalten, behalten.<\/p>\n<p>Davon abgesehen m&uuml;sste man, um die Bestellungen mit einem Kunden zu l&ouml;schen, auch noch die L&ouml;schweitergabe f&uuml;r die Beziehung zwischen den Tabellen <b>tblBestellungen <\/b>und <b>tblBestellpositionen <\/b>aktivieren (siehe Bild 17). Anderenfalls w&uuml;rde sp&auml;testens hier eine Meldung erscheinen, dass die Daten aufgrund der vorliegenden Verkn&uuml;pfung nicht gel&ouml;scht werden k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1385_016.png\" alt=\"Nachtr&auml;gliches Bearbeiten der Beziehungseigenschaften\" width=\"574,559\" height=\"428,3246\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Nachtr&auml;gliches Bearbeiten der Beziehungseigenschaften<\/span><\/b><\/p>\n<h2>Weitere Tabellen<\/h2>\n<p>Wir werden der Datenbank noch weitere Tabellen hinzuf&uuml;gen, die f&uuml;r die Erstellung des Rechnungsberichts notwendig sind und &uuml;ber die der Benutzer seine eigenen Rechnungsdaten anpassen kann &#8211; beispielsweise das Layout des Kopfbereichs oder des Fu&szlig;bereichs der Rechnung. Wir wollen diese Layoutelemente nicht fest im Bericht verdrahten, damit der Benutzer nicht in den Berichtsentwurf eingreifen muss. Stattdessen kann er die gew&uuml;nschten &Auml;nderungen dann bequem &uuml;ber ein Formular erledigen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag beschreibt das Datenmodell f&uuml;r unsere Bestellverwaltung und liefert damit die Grundlage f&uuml;r die Erstellung des Rechnungsberichts. In weiteren Beitr&auml;gen f&uuml;llen wir die Tabellen mit Beispieldaten, erm&ouml;glichen das Bearbeiten der Bestellungen per Formular und erstellen schlie&szlig;lich einen Rechnungsbericht.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Rechnungsbericht_Datenmodell.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/947610DF-04F9-4EDA-B89F-AF79C52A0E21\/aiu_1385.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In einer Beitragsreihe namens &#8222;Rechnungsverwaltung&#8220; wollen wir eine kleine Rechnungs-ver-waltung programmieren. Im ersten Teil k&uuml;mmern wir uns um das Datenmodell der Rech-nungsverwaltung und zeigen an einem Praxisbeispiel in einem weiteren Teil, wie Sie die im Beitrag &#8222;Beispieldaten generieren mit .NET und Bogus&#8220; (www.access-im-unternehmen.de\/1359) vorgestellte Technik zum Erstellen von Beispieldaten einsetzen k&ouml;nnen. Das resultierende Datenmodell mit seinen Daten ist die Grundlage f&uuml;r weitere Beitragsteile, in denen wir Formulare zur Verwaltung der Rechnungen vorstellen sowie einen Rechnungsbericht erstellen, der gleich noch einen EPC-QR-Code zum schnellen &Uuml;berweisen per Smartphone enth&auml;lt. Au&szlig;erdem schauen wir uns noch an, wie Sie mithilfe von Kontoums&auml;tzen schnell abgleichen k&ouml;nnen, welche Rechnungen bezahlt sind.<\/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":[662022,66042022,44000021],"tags":[],"class_list":["post-55001385","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Rechnungsverwaltung: Datenmodell - 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\/Rechnungsverwaltung_Datenmodell\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rechnungsverwaltung: Datenmodell\" \/>\n<meta property=\"og:description\" content=\"In einer Beitragsreihe namens &quot;Rechnungsverwaltung&quot; wollen wir eine kleine Rechnungs-ver-waltung programmieren. Im ersten Teil k&uuml;mmern wir uns um das Datenmodell der Rech-nungsverwaltung und zeigen an einem Praxisbeispiel in einem weiteren Teil, wie Sie die im Beitrag &quot;Beispieldaten generieren mit .NET und Bogus&quot; (www.access-im-unternehmen.de\/1359) vorgestellte Technik zum Erstellen von Beispieldaten einsetzen k&ouml;nnen. Das resultierende Datenmodell mit seinen Daten ist die Grundlage f&uuml;r weitere Beitragsteile, in denen wir Formulare zur Verwaltung der Rechnungen vorstellen sowie einen Rechnungsbericht erstellen, der gleich noch einen EPC-QR-Code zum schnellen &Uuml;berweisen per Smartphone enth&auml;lt. Au&szlig;erdem schauen wir uns noch an, wie Sie mithilfe von Kontoums&auml;tzen schnell abgleichen k&ouml;nnen, welche Rechnungen bezahlt sind.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-04T18:16:21+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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Rechnungsverwaltung: Datenmodell\",\"datePublished\":\"2022-08-04T18:16:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/\"},\"wordCount\":3352,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"4\\\/2022\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/\",\"name\":\"Rechnungsverwaltung: Datenmodell - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-08-04T18:16:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungsverwaltung_Datenmodell\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rechnungsverwaltung: Datenmodell\"}]},{\"@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":"Rechnungsverwaltung: Datenmodell - 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\/Rechnungsverwaltung_Datenmodell\/","og_locale":"de_DE","og_type":"article","og_title":"Rechnungsverwaltung: Datenmodell","og_description":"In einer Beitragsreihe namens \"Rechnungsverwaltung\" wollen wir eine kleine Rechnungs-ver-waltung programmieren. Im ersten Teil k&uuml;mmern wir uns um das Datenmodell der Rech-nungsverwaltung und zeigen an einem Praxisbeispiel in einem weiteren Teil, wie Sie die im Beitrag \"Beispieldaten generieren mit .NET und Bogus\" (www.access-im-unternehmen.de\/1359) vorgestellte Technik zum Erstellen von Beispieldaten einsetzen k&ouml;nnen. Das resultierende Datenmodell mit seinen Daten ist die Grundlage f&uuml;r weitere Beitragsteile, in denen wir Formulare zur Verwaltung der Rechnungen vorstellen sowie einen Rechnungsbericht erstellen, der gleich noch einen EPC-QR-Code zum schnellen &Uuml;berweisen per Smartphone enth&auml;lt. Au&szlig;erdem schauen wir uns noch an, wie Sie mithilfe von Kontoums&auml;tzen schnell abgleichen k&ouml;nnen, welche Rechnungen bezahlt sind.","og_url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-08-04T18:16:21+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Rechnungsverwaltung: Datenmodell","datePublished":"2022-08-04T18:16:21+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/"},"wordCount":3352,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","4\/2022","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/","url":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/","name":"Rechnungsverwaltung: Datenmodell - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-08-04T18:16:21+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Rechnungsverwaltung_Datenmodell\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Rechnungsverwaltung: Datenmodell"}]},{"@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\/55001385","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=55001385"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001385\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}