{"id":55001459,"date":"2023-12-01T00:00:00","date_gmt":"2024-01-26T18:09:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1459"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenmodelle_fuer_die_Rechnungsverwaltung","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/","title":{"rendered":"Datenmodelle f&uuml;r die Rechnungsverwaltung"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/b1e955d469274112a929bd939a7b7cc9\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Beim Schreiben von Anwendungen, mit denen Rechnungen erstellt werden sollen, stellt sich immer wieder die Frage nach dem korrekten Datenmodell. Davon ausgehend, dass es nicht das perfekte Datenmodell f&uuml;r alle Anwendungsf&auml;lle gibt, wollen wir in diesem Beitrag einmal unterschiedliche Ans&auml;tze betrachten und diskutieren. Diese haben eines gemein: Die Anwendung mit diesem Datenmodell soll die M&ouml;glichkeit bieten, sowohl Bestellungen zu erfassen als auch Rechnungen und Lieferscheine zu erstellen. Wie welche Daten gespeichert werden und welche M&ouml;glichkeiten es gibt, schauen wir uns nun an.<\/b><\/p>\n<h2>Bestellungen erfassen<\/h2>\n<p>&Uuml;ber bestimmte grundlegende Anforderungen herrscht vermutlich eine einstimmige Meinung: Wenn man Bestellungen erfassen m&ouml;chte und die Regeln der Normalisierung von Datenmodellen befolgen will, ben&ouml;tigt man mindestens drei Tabellen. Die erste Tabelle enth&auml;lt die Kundendaten mitsamt einer Kunden-ID und den Daten wie Firma, Anrede, Vorname, Nachname, Stra&szlig;e, PLZ, Ort, Land, Telefon, E-Mail und so weiter.<\/p>\n<p>In den meisten F&auml;llen liegen die f&uuml;r das Speichern der Anschrift vorgesehenen Felder in zweifacher Ausf&uuml;hrung vor, n&auml;mlich f&uuml;r die Lieferadresse und die Rechnungsadresse, denn diese k&ouml;nnen sich unterscheiden. Normalerweise finden wir hier f&uuml;r Liefer- und Rechnungsadresse meist auch noch ein Fremdschl&uuml;sselfeld zur Auswahl eines Eintrags einer Anrede-Tabelle &#8211; die z&auml;hlen wir hier aber nicht mit.<\/p>\n<p>Die zweite Tabelle enth&auml;lt die grundlegenden Daten einer Bestellung wie die Bestell-ID, das Bestelldatum und ein Fremdschl&uuml;sselfeld, mit dem der Kunde ausgew&auml;hlt werden kann, der diese Bestellung get&auml;tigt hat. Auf diese Weise k&ouml;nnen wir zu jedem Kunden keine, eine oder mehrere Bestellungen anlegen.<\/p>\n<p>Die dritte Tabelle enth&auml;lt die Positionen der Bestellung. Diese umfassen eine Bezeichnung der Position, den Einzelpreis, die Menge, die Mehrwertsteuer und gegebenenfalls noch einen Rabatt. Au&szlig;erdem ben&ouml;tigen wir hier ein Fremdschl&uuml;sselfeld, das mit der Bestellungen-Tabelle verkn&uuml;pft ist, damit wir die einzelnen Bestellpositionen der Bestellung zuordnen k&ouml;nnen.<\/p>\n<p>Normalerweise gibt es mindestens noch eine vierte Tabelle, aus der die grundlegenden Daten f&uuml;r die Bestellpositionen stammen. Diese nennen wir &uuml;blicherweise Produkt- oder Artikeltabelle. Sie enth&auml;lt die Produkt- oder Artikelbezeichnung, den Einzelpreis sowie den Mehrwertsteuersatz und weitere Detailinformationen, die f&uuml;r andere Vorg&auml;nge wie Warenwirtschaft erforderlich sind &#8211; wie die Verwaltung von Best&auml;nden et cetera. Wir wollen im Folgenden von Produkten statt von Artikeln sprechen.<\/p>\n<p>Um die Bestellposition mit dem jeweiligen Produkt zu verkn&uuml;pfen, enth&auml;lt die Tabelle der Bestellpositionen meist ein Fremdschl&uuml;sselfeld zu der Tabelle der Produkte. Auf diese Weise kann man &uuml;ber die Benutzeroberfl&auml;che leicht das zu einer Bestellposition hinzuzuf&uuml;gende Produkt ausw&auml;hlen.<\/p>\n<p>Der erste Entwurf sieht im Datenbankfenster von Access wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_001.png\" alt=\"Erster Entwurf mit vielen Schwachstellen (V1)\" width=\"649,559\" height=\"412,0009\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erster Entwurf mit vielen Schwachstellen (V1)<\/span><\/b><\/p>\n<h2>Produktdaten mit den Bestellpositionen speichern?<\/h2>\n<p>Hier gibt es direkt die erste spannende Frage: Wenn ich eine Tabelle mit Bestellpositionen verwende und eine mit den Produkten und in der Tabelle der Bestellpositionen ein Feld ist, mit dem ich das mit dieser Position bestellte Produkt selektieren kann, ben&ouml;tige ich dann &uuml;berhaupt die ganzen bereits erw&auml;hnten Felder? Wenn bereits in der Produkte-Tabelle die Bezeichnung, der Einzelpreis und der Mehrwertsteuersatz gespeichert sind, reicht es dann nicht aus, wenn ich mit einem Fremdschl&uuml;sselfeld aus der Bestellpositionen-Tabelle auf den Eintrag aus der Produkte-Tabelle verweise? Und in der Bestellpositionen-Tabelle nur die Felder Menge und Rabatt f&uuml;lle?<\/p>\n<p>Unter dem Gesichtspunkt, m&ouml;glichst wenige Daten zu speichern, scheint diese Idee verlockend. Es gibt jedoch ein entscheidendes Problem: Einzelpreise und Mehrwertsteuers&auml;tze &auml;ndern sich von Zeit zu Zeit. Und es kann sogar vorkommen, dass wir den Namen eines Produktes &auml;ndern wollen (auch wenn es sich dann anbieten w&uuml;rde, einen neuen Produktdatensatz zu diesem Zweck anzulegen). Wenn es Bestellungen f&uuml;r ein Produkt gibt, und der Einzelpreis und der Mehrwertsteuersatz nur in der Produkttabelle vorliegen, dann k&ouml;nnen wir sp&auml;ter nicht mehr nachvollziehen, zu welchem Preis und zu welchem Mehrwertsteuersatz der Kunde zuvor bestellt hat. Stattdessen werden wir alle Bestellpositionen immer mit den aktuellen Einzelpreisen und Mehrwertsteuers&auml;tzen vorfinden.<\/p>\n<p>Wir k&ouml;nnen so also nach der &Auml;nderung auch nur eines Einzelpreises oder Mehrwertsteuersatzes f&uuml;r ein Produkt in einer Bestellposition einer Bestellung nicht mehr die tats&auml;chlichen Ums&auml;tze nachvollziehen.<\/p>\n<p>Den aktuellen Stand des Datenmodells finden Sie in der Beispieldatenbank <b>GrundlagenDatenmodellRechnungsverwaltung_V1.accdb<\/b>.<\/p>\n<h2>&Auml;nderungen von Einzelpreis und Mehrwertsteuersatz behandeln<\/h2>\n<p>Was tun? Damit die &Auml;nderungen am Produktnamen und an den Einzelpreisen und Mehrwertsteuers&auml;tzen eines einzelnen Produkts in der Produkttabelle keine Auswirkungen mehr auf die zum Zeitpunkt der Bestellung g&uuml;ltigen Werte haben, m&uuml;ssen wir diese Daten direkt in der Tabelle mit den Bestellpositionen speichern.<\/p>\n<p>Dazu sehen wir einfach drei Felder mit den gleichen Namen wie in der Produkte-Tabelle vor, also beispielsweise <b>Produkt<\/b>, <b>Einzelpreis <\/b>und <b>Mehrwertsteuersatz<\/b> (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_002.png\" alt=\"Diese Felder sollen dauerhaft mit der Bestellposition gespeichert werden (V2).\" width=\"349,5589\" height=\"233,0392\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Diese Felder sollen dauerhaft mit der Bestellposition gespeichert werden (V2).<\/span><\/b><\/p>\n<p>F&uuml;gen wir in der Benutzeroberfl&auml;che einer Bestellposition ein Produkt beispielsweise durch Auswahl eines Nachschlagefeldes hinzu, kopieren wir direkt die Werte der Felder <b>Produkt<\/b>, <b>Einzelpreis <\/b>und <b>Mehrwertsteuersatz <\/b>in die Tabelle der Bestellpositionen.<\/p>\n<p>Diese und die folgende &Auml;nderung haben wir in der Beispieldatenbank <b>GrundlagenDatenmodellRechnungsverwaltung_V2.accdb <\/b>hinterlegt.<\/p>\n<p>Auf das Thema <b>Mehrwertsteuers&auml;tze <\/b>gehen wir gegen Ende des Beitrags im Detail ein.<\/p>\n<h2>&Auml;nderungen von Adressdaten behandeln<\/h2>\n<p>Das sind allerdings nicht die einzigen Daten, die &Auml;nderungen unterliegen. Auch die Adressen von Kunden &auml;ndern sich von Zeit zu Zeit. Das ist auch kein Problem: Wir &auml;ndern einfach die Adressdaten in der Kundentabelle und haben jederzeit den aktuellen Stand, um neue Bestellungen korrekt erfassen zu k&ouml;nnen.<\/p>\n<p>Die Sache hat allerdings einen Haken: Im aktuellen Stand unseres Datenmodells ist die Kundentabelle noch &uuml;ber ein Fremdschl&uuml;sselfeld in der Tabelle <b>tblBestellungen <\/b>mit der Bestellung verkn&uuml;pft. Wenn wir die Daten in der Kunden-Tabelle &auml;ndern, dann &auml;ndern wir automatisch auch die Adressdaten des Kunden einer Bestellung.<\/p>\n<p>Das bringt wieder Nachteile mit sich, wenn wir einmal von der Region abh&auml;ngige Auswertungen &uuml;ber unsere Bestelldaten durchf&uuml;hren m&ouml;chten. Zieht ein Kunde von Duisburg nach M&uuml;nchen, &auml;ndert sich auch die Auswertung, denn nun hat Bayern ein paar Bestellungen und Ums&auml;tze mehr auf der Habenseite.<\/p>\n<p>Auch das wollen wir tunlichst vermeiden. Wie k&ouml;nnen wir das tun? Wir w&auml;hlen einen &auml;hnlichen Ansatz wie bei den Bestellpositionen und Produkten: Wir legen in der Bestellungen-Tabelle weitere Felder an, in denen wir die Kundenadressen zum Zeitpunkt der Bestellung speichern. Das Fremdschl&uuml;sselfeld zum Kunden in der Tabelle <b>tblBestellungen <\/b>sollten wir jedoch beibehalten, denn wir wollen ja gegebenenfalls auch einmal einen &Uuml;berblick &uuml;ber die Bestellungen eines Kunden und die darin enthaltenen Positionen haben.<\/p>\n<p>Wie in Bild 3 zu sehen, haben wir eine Reihe von Feldern auch in der Tabelle der Bestellungen angelegt. In der Praxis gelingt das &uuml;brigens ganz einfach &#8211; Sie m&uuml;ssen einfach nur die zu kopierenden Felder im Entwurf der Quelltabelle kopieren und dann in der Zieltabelle einf&uuml;gen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_003.png\" alt=\"Diese Felder sollen dauerhaft mit der Bestellung gespeichert werden (V2).\" width=\"424,5589\" height=\"494,7526\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Diese Felder sollen dauerhaft mit der Bestellung gespeichert werden (V2).<\/span><\/b><\/p>\n<p>Auch hier m&uuml;ssen wir in der Benutzeroberfl&auml;che beim Ausw&auml;hlen des Kunden zu einer Bestellung Code ausl&ouml;sen, der daf&uuml;r sorgt, dass die Felder der Bestellungen-Tabelle mit den Daten aus der Kundentabelle gef&uuml;llt werden.<\/p>\n<p>Theoretisch k&ouml;nnten wir auch noch die beiden Felder <b>EMail <\/b>und <b>Telefon <\/b>zur Tabelle <b>tblBestellungen <\/b>hinzuf&uuml;gen. Dies h&auml;tte den Sinn, dass wir sp&auml;ter noch reproduzieren k&ouml;nnten, wohin wir E-Mails beispielsweise mit Bestellbest&auml;tigungen oder Rechnungen gesendet haben. Allerdings gehen wir davon aus, dass die E-Mails auch archiviert werden und im sp&auml;teren Verlauf gegebenenfalls eingesehen werden k&ouml;nnen.<\/p>\n<h2>Adressen separat speichern<\/h2>\n<p>In vielen Datenbanken sehen wir, dass Adressen separat in eigenen Tabellen gespeichert werden. Das k&ouml;nnte man angehen, indem man eine Tabelle f&uuml;r Adressen anlegt und dort Adressen speichert, die man dann &uuml;ber zwei Fremdschl&uuml;sselfelder namens <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>referenziert.<\/p>\n<p>Danach w&uuml;rde dieser Teil des Datenmodells wie in Bild 4 aussehen. Wir haben hier im gleichen Zuge noch eine Frage gel&ouml;st, n&auml;mlich die, ob wir E-Mail und Telefon nur einmal je Kunde ben&ouml;tigen oder ob wir f&uuml;r die Liefer- und die Rechnungsadresse jeweils eigene Felder namens <b>EMail <\/b>und <b>Telefon <\/b>vorsehen sollen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_004.png\" alt=\"Ausgliederung der Liefer- und Rechnungsadressen in eine weitere Tabelle (V3).\" width=\"424,5589\" height=\"573,257\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgliederung der Liefer- und Rechnungsadressen in eine weitere Tabelle (V3).<\/span><\/b><\/p>\n<p>Wir haben die beiden Felder einfach in die Tabelle <b>tblAdressen <\/b>verschoben, wo man diese Daten nun f&uuml;r alle Adressen hinterlegen kann.<\/p>\n<p>Wenn wir entschieden h&auml;tten, dass wir nur eine E-Mail-Adresse und eine Telefonnummer ben&ouml;tigen, h&auml;tten wir diese Felder in der Tabelle <b>tblKunden <\/b>belassen k&ouml;nnen.<\/p>\n<p>Es macht jedoch mehr Sinn, hier auf Flexibilit&auml;t zu setzen, denn es kann beispielsweise passieren, dass ein Kunde ein digitales Produkt ordert, zu dem Daten per E-Mail versendet werden sollen und der f&uuml;r die Rechnungen eine eigene Rechnungs-E-Mail-Adresse verwendet.<\/p>\n<h2>Beliebige Anzahl an Adressen<\/h2>\n<p>Mit dieser Version des Datenmodells sind wir allerdings auf je zwei Adressen pro Kunde beschr&auml;nkt. Wer zum Beispiel schon einmal bei Amazon bestellt hat, wei&szlig;, dass man dort beliebig viele Lieferadressen hinterlegen kann. Wir wollen uns einmal ansehen, wie wir unser Datenmodell ver&auml;ndern m&uuml;ssten, um dies zu implementieren.<\/p>\n<p>Voraussetzung soll jedoch sein, dass wir eine der Adressen als Standardlieferadresse festlegen k&ouml;nnen und eine als Standardrechnungsadresse. Dazu gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Wir belassen die Struktur weitgehend so, wie sie ist, und erlauben damit die Zuordnung der aktuellen Standardadresse f&uuml;r die Lieferung und die Rechnungen &uuml;ber die beiden Fremdschl&uuml;sselfelder <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>der Tabelle <b>tblKunden<\/b>. Damit wir mehr als diese beiden Adressen f&uuml;r einen Kunden anlegen und diese auch zuordnen k&ouml;nnen wollen, m&uuml;ssen wir der Tabelle <b>tblAdressen <\/b>ein Fremdschl&uuml;sselfeld hinzuf&uuml;gen, mit dem wir den Kunden festlegen k&ouml;nnen, zu dem diese Adresse geh&ouml;rt. Erst dann k&ouml;nnen wir in der Benutzeroberfl&auml;che f&uuml;r diesen Kunden die passenden Adressen zur Auswahl f&uuml;r die beiden Felder <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>anbieten (siehe Bild 5).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_005.png\" alt=\"Das Fremdschl&uuml;sselfeld KundeID erm&ouml;glicht die Zuordnung der Adressdatens&auml;tze zu einem Kundendatensatz (V4).\" width=\"599,559\" height=\"343,1818\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Fremdschl&uuml;sselfeld KundeID erm&ouml;glicht die Zuordnung der Adressdatens&auml;tze zu einem Kundendatensatz (V4).<\/span><\/b><\/p>\n<li>Die zweite M&ouml;glichkeit ist, die Zuweisung der Adressen gar nicht mehr &uuml;ber Fremdschl&uuml;sselfelder in der Kundentabelle zu erledigen. Stattdessen entfernen wir die Fremdschl&uuml;sselfelder wie in Bild 6 und stellen die Verkn&uuml;pfung nur noch &uuml;ber das Fremdsch&uuml;sselfeld <b>KundeID <\/b>der Adresstabelle her. Das hei&szlig;t, wir k&ouml;nnen keine, eine oder mehrere Tabellen zu jedem Kunden in der Adresstabelle speichern. Allerdings wissen wir bisher noch nicht, welche wir dann als Liefer- und Rechnungsadresse verwenden sollen. Dies regeln wir &uuml;ber zwei Ja\/Nein-Felder namens <b>IstStandardLieferadresse <\/b>und <b>IstStandardRechnungsadresse<\/b>. Damit k&ouml;nnen wir zum Beispiel festlegen, das eine einzige Adresse als Liefer- und Rechnungsadresse fungiert. Der Nachteil ist allerdings, dass wir in Access per Code die Integrit&auml;t der Daten sicherstellen m&uuml;ssen &#8211; also beispielsweise, dass f&uuml;r jeden Kunden immer mindestens eine Adresse gespeichert ist und das jeweils eine Adresse als Standardlieferadresse und eine als Standardrechnungsadresse markiert ist.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_006.png\" alt=\"Wir k&ouml;nnen die Beziehung auch komplett umdrehen. Dann m&uuml;ssen wir angeben, welche Adresse die Standardliefer- und Standardrechnungsadresse ist (V5).\" width=\"649,559\" height=\"338,94\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Wir k&ouml;nnen die Beziehung auch komplett umdrehen. Dann m&uuml;ssen wir angeben, welche Adresse die Standardliefer- und Standardrechnungsadresse ist (V5).<\/span><\/b><\/p>\n<\/ul>\n<p>Da scheint es zumindest aus Sicht der Datenintegrit&auml;t zuverl&auml;ssiger, Variante <b>V4 <\/b>zu w&auml;hlen.<\/p>\n<h2>Eigene Adresstabellen in Bezug auf Bestellungen<\/h2>\n<p>Wenn wir wie in <b>V3<\/b>, <b>V4 <\/b>oder <b>V5 <\/b>eine eigene Tabelle zum Speichern der Kundenadressen verwenden, k&ouml;nnen wir nach wie vor wie in <b>V2 <\/b>die bei Bestellung g&uuml;ltige Liefer- und Rechnungsadresse in die Felder der Tabelle <b>tblBestellungen <\/b>&uuml;bernehmen.<\/p>\n<p>[<\/p>\n<p>Wir k&ouml;nnten aber auch hier die Adressen in einer oder mehreren Tabellen speichern. Hier haben wir einen etwas einfacheren Fall, als dass wir zu jeder Bestellung nur maximal eine Liefer- und eine Rechnungsadresse speichern m&uuml;ssen. Wir k&ouml;nnten also die Felder der Tabelle <b>tblBestellungen <\/b>wie in Bild 7 in weiteren Tabellen organisieren (siehe <b>GrundlagenDatenmodellRechnungsverwaltung_V6.accdb<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_007.png\" alt=\"Auch beiden Bestellungen k&ouml;nnte man die Adressen wie hier in eigenen Tabellen speichern - hier einmal mit jeweils einer Tabelle f&uuml;r Liefer- und Rechnungsadressen (V6).\" width=\"424,5589\" height=\"574,347\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Auch beiden Bestellungen k&ouml;nnte man die Adressen wie hier in eigenen Tabellen speichern &#8211; hier einmal mit jeweils einer Tabelle f&uuml;r Liefer- und Rechnungsadressen (V6).<\/span><\/b><\/p>\n<p>Hier haben wir einmal einen anderen Ansatz gew&auml;hlt als in den vorherigen Beispielen, wo wir dem Kunden die Adressen auf verschiedene Arten zugeordnet haben.<\/p>\n<p>In diesem Fall verwenden wir nicht eine Tabelle f&uuml;r alle Adressen, sondern wir haben einmal zwei Tabellen genutzt &#8211; eine f&uuml;r die Liefer- und eine f&uuml;r die Rechnungsadressen.  Diese haben wir <b>tblBestellungenLieferadressen <\/b>und <b>tblBestellungenRechnungsadressen <\/b>genannt. Beide sind jeweils &uuml;ber das Fremdschl&uuml;sselfeld <b>BestellungID <\/b>mit der jeweiligen Bestellung aus der Tabelle <b>tblBestellungen <\/b>verkn&uuml;pft.<\/p>\n<p>Wir k&ouml;nnten auch hier mit nur einer Adresstabelle arbeiten. Dazu m&uuml;ssten wir dann wieder zwei Fremdschl&uuml;sselfelder zur Tabelle <b>tblBestellungen <\/b>hinzuf&uuml;gen, mit denen wir jeweils die Lieferadresse und die Rechnungsadresse f&uuml;r die jeweilige Bestellung hinterlegen k&ouml;nnen.<\/p>\n<p>Im Gegensatz zur Version <b>V6<\/b> k&ouml;nnen wir hier, wenn die Liefer- und die Rechnungsadresse gleich sind, einen Datensatz einsparen.<\/p>\n<p>In <b>V6 <\/b>ben&ouml;tigen wir immer zwei Datens&auml;tze, je einen in der Tabelle <b>tblBestellungenLieferadressen <\/b>und einen in der Tabelle <b>tblBestellungenRechnungsadressen<\/b>. Die Version mit nur einer Adresstabelle ist in Bild 8 dargestellt (siehe <b>GrundlagenDatenmodellRechnungsverwaltung_V7.accdb<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_008.png\" alt=\"Man k&ouml;nnte auch nur eine Tabelle mit Bestelladressen verwenden, die dann mit zwei Fremdschl&uuml;sselfeldern der Tabelle tblBestellungen verkn&uuml;pft wird (V7).\" width=\"424,5589\" height=\"490,3479\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Man k&ouml;nnte auch nur eine Tabelle mit Bestelladressen verwenden, die dann mit zwei Fremdschl&uuml;sselfeldern der Tabelle tblBestellungen verkn&uuml;pft wird (V7).<\/span><\/b><\/p>\n<h2>Kundennummern<\/h2>\n<p>Einen Punkt haben wir noch nicht ber&uuml;cksichtigt: die individuelle Kundennummer. Aktuell haben wir in der Tabelle <b>tblKunden <\/b>nur ein Prim&auml;rschl&uuml;sselfeld namens <b>KundeID<\/b>. Dieses wird von der Autowertfunktion mit aufsteigenden Zahlen gef&uuml;llt. Gegebenenfalls kommen die Bestellungen aber aus einem Shopsystem, das einen eigenen Kundennummernkreis pflegt, oder man m&ouml;chte generell ein anderes Kundennummern-Format nutzen als einfach durchlaufende Zahlen zu verwenden.<\/p>\n<p>In diesem Fall f&uuml;gt man einfach ein weiteres Feld beispielsweise namens <b>Kundennummer <\/b>hinzu und legt den entsprechenden Datentyp fest &#8211; bei Zahlen den Datentyp <b>Zahl <\/b>und wenn man Kombinationen aus Buchstaben und Zahlen verwenden m&ouml;chte den Datentyp <b>Text<\/b>. Wichtig ist, dass wir dieses Feld mit einem eindeutigen Index versehen, damit keine Kundennummer doppelt vergeben wird. Das Feld Kundennummer haben wir ab <b>V8 <\/b>hinzuf&uuml;gt.<\/p>\n<h2>Bestellnummern<\/h2>\n<p>Gleiches gilt f&uuml;r die Nummern von Bestellungen. Auch hier kann es sein, dass Bestellungen von einem oder mehreren Onlineshops importiert werden und\/oder manuell angelegt werden. Dann m&ouml;chte man gegebenenfalls auch diese Bestellnummern pflegen, wozu sich ein Feld namens <b>Bestellnummer <\/b>zus&auml;tzlich zum Prim&auml;rschl&uuml;sselfeld <b>BestellungID <\/b>anbietet.<\/p>\n<p>Auch hier sollten wir einen eindeutigen Index festlegen, um zu verhindern, dass Bestellnummern doppelt angelegt werden.<\/p>\n<p>Schlie&szlig;lich k&ouml;nnen wir ein solches Feld auch noch f&uuml;r die Produktnummern in der Tabelle <b>tblProdukte <\/b>anlegen.<\/p>\n<h2>Rechnungen<\/h2>\n<p>Als ob das nicht schon genug Varianten w&auml;ren (und es gibt sicher noch einige weitere), kommen nun noch die Rechnungen ins Spiel.<\/p>\n<p>Eigentlich k&ouml;nnten wir auf Basis der bisher angelegten Daten bereits Rechnungen erstellen. Die Daten liegen in allen Versionen in den enthaltenen Tabellen vor. Der einzige Unterschied besteht in der Art der Verteilung auf die jeweiligen Tabellen und darin, dass &#8211; zumindest in den ersten Versionen &#8211; &Auml;nderungen an den Basisdaten, wie zum Beispiel den Adressen oder Produkten, zu Unterschieden bei der gedruckten oder als PDF erstellten Rechnung f&uuml;hren k&ouml;nnen.<\/p>\n<p>F&uuml;r die Erstellung von Rechnungen ben&ouml;tigen wir zus&auml;tzlich eigentlich nur noch ein Rechnungsdatum und eine Rechnungsnummer. K&ouml;nnen wir diese nicht einfach noch in die Bestellungen-Tabelle einbauen und dann daraus unsere Rechnung generieren?<\/p>\n<p>Technisch ist das m&ouml;glich. Aber es gibt einige Gr&uuml;nde, warum man Bestellungen und Rechnungen in eigenen Tabellen speichern sollte.<\/p>\n<ul>\n<li>Es sind zwei v&ouml;llig unterschiedliche Vorg&auml;nge, die zwar miteinander zu tun haben, aber die doch nacheinander ablaufen. Das hei&szlig;t also, dass wir unter Umst&auml;nden zwar eine Bestellung erhalten, diese aber bereits vor Rechnungsstellung storniert wird &#8211; sei es, dass ein Produkt nicht lieferbar ist oder der Kunde die Bestellung storniert.<\/li>\n<li>Es kann sein, dass nicht alle Positionen einer Bestellung in der gleichen Rechnung abgerechnet werden k&ouml;nnen &#8211; beispielsweise, weil ein Produkt aktuell nicht lieferbar ist.<\/li>\n<li>Andererseits kann es auch sein, dass ein Unternehmen nicht f&uuml;r jede Bestellung eine Rechnung ausstellt, sondern beispielsweise immer am Ende eines Monats abrechnet.<\/li>\n<\/ul>\n<p>Also schauen wir uns an, wie wir das Datenmodell auch noch um die Tabellen zum Verwalten der Rechnungsdaten erg&auml;nzen.<\/p>\n<h2>Rechnungstabellen<\/h2>\n<p>Grunds&auml;tzlich k&ouml;nnen wir die Entw&uuml;rfe der Tabellen f&uuml;r die Bestellungen und Bestellpositionen genau auf die Tabellen f&uuml;r die Rechnungen &uuml;bertragen. Dazu f&uuml;gen wir dem Datenmodell zun&auml;chst eine Tabelle namens <b>tblRechnungen <\/b>hinzu. Diese enth&auml;lt im Wesentlichen die Felder, die wir bereits von der Tabelle <b>tblBestellungen <\/b>her kennen &#8211; nur dass wir das Prim&auml;rschl&uuml;sselfeld <b>RechnungID <\/b>nennen und ein Feld namens <b>Rechnungsdatum <\/b>hinzugef&uuml;gt haben. Statt des Feldes Bestellnummer verwenden wir <b>Rechnungsnummer<\/b>.<\/p>\n<p>Dieses Feld versehen wir mit einen eindeutigen Index. Die Anwendung muss sicherstellen, dass die Rechnungsnummern durchlaufend sind. Das Feld <b>Bestelldatum <\/b>&uuml;bernehmen wir ebenfalls wie die Felder <b>KundeID<\/b>, <b>LieferadresseID <\/b>und <b>RechnungsadresseID<\/b>. Allerdings verweisen die beiden Fremdschl&uuml;sselfelder <b>LieferadresseID <\/b>und <b>RechnungsadresseID <\/b>auf eine weitere neue Tabelle namens <b>tblRechnungsadressen<\/b>. Warum schleifen wir die Lieferadresse mit? Weil wir gegebenenfalls die Lieferadresse in der Rechnung vermerken wollen.<\/p>\n<p>Schlie&szlig;lich enth&auml;lt die Tabelle <b>tblRechnungen <\/b>noch ein neues Fremdschl&uuml;sselfeld namens <b>BestellungID<\/b>, mit dem  wir auf den Datensatz aus der Tabelle <b>tblBestellungen <\/b>verweisen, zu dem die Rechnung geh&ouml;rt. Auf diese Weise k&ouml;nnen wir zu jeder Bestellung mehrere Rechnungen schreiben, was beispielsweise n&ouml;tig ist, wenn ein oder mehrere Produkte sp&auml;ter geliefert werden, weil sie nicht vorr&auml;tig sind, und deshalb auch erst sp&auml;ter in Rechnung gestellt werden sollen.<\/p>\n<p>Die Tabelle <b>tblRechnungspositionen <\/b>zum Speichern der einzelnen Positionen der Rechnungen ist wiederum fast eine Kopie der Tabelle <b>tblBestellpositionen<\/b>. Sie wird allerdings &uuml;ber das Fremdschl&uuml;sselfeld <b>RechnungID <\/b>mit dem entsprechenden Datensatz der Tabelle <b>tblRechnungen <\/b>verkn&uuml;pft. Au&szlig;erdem finden wir in dieser Tabelle ein weiteres Fremdschl&uuml;sselfeld namens <b>BestellpositionID<\/b>. Damit legen wir eine Verbindung zu der Bestellposition an, zu der diese Rechnungsposition geh&ouml;rt. Auf diese Weise k&ouml;nnen wir beispielsweise per Abfrage pr&uuml;fen, welche Bestellpositionen noch nicht in Rechnung gestellt wurden und dementsprechend noch in einer weiteren Rechnung abgerechnet werden m&uuml;ssen.<\/p>\n<p>Die &Auml;nderungen finden wir in Bild 9 (siehe auch <b>GrundlagenDatenmodellRechnungsverwaltung_V8.accdb<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_009.png\" alt=\"Erweiterung des Datenmodells um die Tabellen zum Speichern der Rechnungsdaten - inklusive Verkn&uuml;pfungen zu den Tabellen mit den Bestellungen und Bestellpositionen (V8)\" width=\"700\" height=\"395,6521\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Erweiterung des Datenmodells um die Tabellen zum Speichern der Rechnungsdaten &#8211; inklusive Verkn&uuml;pfungen zu den Tabellen mit den Bestellungen und Bestellpositionen (V8)<\/span><\/b><\/p>\n<p>Mit diesem Fremdschl&uuml;sselfeld erm&ouml;glichen wir auch noch, dass wir zu einer Bestellposition nicht nur eine, sondern mehrere Rechnungspositionen anlegen k&ouml;nnen. Wozu das? Es kann nicht nur passieren, dass ein Produkt gar nicht mehr lieferbar ist, sondern auch, dass ein Produkt nicht mehr in der bestellten Menge vorr&auml;tig ist. Dann k&ouml;nnen wir zun&auml;chst die vorr&auml;tige Menge an den Kunden versenden und diese in Rechnung stellen. Wir k&ouml;nnen dann wiederum per Abfrage ermitteln, welche Menge der jeweiligen Bestellposition bereits versendet wurde.<\/p>\n<h2>Bestellpositionen aus mehreren Bestellungen in einer Rechnung<\/h2>\n<p>Weiter oben haben wir als einen der Gr&uuml;nde, warum wir neben den Bestelltabellen auch noch Rechnungstabellen anlegen wollen, die M&ouml;glichkeit genannt, dass wir auch Positionen aus mehreren Bestellungen in einer Rechnung abrechnen k&ouml;nnen. Das hei&szlig;t, wir wollen nicht nur mehrere Rechnungen zu einer Bestellung stellen, sondern auch noch mehrere Bestellungen in einer Rechnung erfassen k&ouml;nnen. Das schreit nach einer m:n-Beziehung, aber wie genau soll diese aussehen?<\/p>\n<p>Wenn wir jede Rechnung mit jeder Bestellung kombinieren k&ouml;nnen wollen, ben&ouml;tigen wir eine m:n-Verkn&uuml;pfungstabelle, welche die Prim&auml;rsch&uuml;sselfelder der beiden Tabellen <b>tblBestellungen <\/b>und <b>tblRechnungen <\/b>miteinander verkn&uuml;pft.<\/p>\n<p>Aber was geschieht mit den beiden Tabellen <b>tblRechnungspositionen <\/b>und <b>tblBestellpositionen <\/b>sowie deren Verkn&uuml;pfung? K&ouml;nnen wir diese so beibehalten? Ja, das k&ouml;nnen wir &#8211; es ist ja nach wie vor so, dass wir jede Rechnungsposition genau einer Bestellposition zuweisen k&ouml;nnen wollen, auch wenn die Menge der in der Rechnungsposition genannten Produkte nicht der Menge der Produkte in der Bestellposition entsprechen muss.<\/p>\n<p>Die &Auml;nderungen am Datenmodell sind in Bild 10 dargestellt und markiert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_010.png\" alt=\"Umstellen der Verkn&uuml;pfung zwischen den Rechnungen und Bestellungen von 1:n auf m:n (V8a)\" width=\"700\" height=\"395,6521\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Umstellen der Verkn&uuml;pfung zwischen den Rechnungen und Bestellungen von 1:n auf m:n (V8a)<\/span><\/b><\/p>\n<p>F&uuml;r die Tabelle zum Herstellen der m:n-Beziehung zwischen den Tabellen <b>tblBestellungen <\/b>und <b>tblRechnungen <\/b>legen wir einen eindeutigen, zusammengesetzten Schl&uuml;ssel an. Dieser sorgt daf&uuml;r, dass jede Rechnung nur einmal jeder Bestellung zugeordnet werden kann (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_011.png\" alt=\"Zusammengesetzter, eindeutiger Index f&uuml;r die beiden Fremdschl&uuml;sselfelder der Tabelle\" width=\"649,559\" height=\"378,0072\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Zusammengesetzter, eindeutiger Index f&uuml;r die beiden Fremdschl&uuml;sselfelder der Tabelle<\/span><\/b><\/p>\n<h2>Auslieferung der Bestellung<\/h2>\n<p>Der n&auml;chste Bereich einer Bestellung, den wir im Datenmodell abbilden m&uuml;ssen, ist die Auslieferung. Im Optimalfall beispielsweise eines Onlineshops, der nur digitale Produkte verkauft, die logischerweise immer vorr&auml;tig sind, k&ouml;nnte man naiverweise in der Version V1 weiter oben einfach ein Feld namens <b>Lieferdatum <\/b>zur Tabelle <b>tblBestellungen <\/b>hinzuf&uuml;gen und dort das gleiche Datum wie f&uuml;r das Feld <b>Bestelldatum <\/b>eintragen.<\/p>\n<p>Sobald wir aber auch nur ein Produkt im Shop haben, das nicht immer sofort ausgeliefert werden kann, ist es sinnvoll, auch f&uuml;r die Auslieferung noch einen weiteren Satz an Tabellen anzulegen.<\/p>\n<p>Das Ergebnis sehen wir in Bild 12.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_012.png\" alt=\"Erweiterung des Datenmodells um die Tabellen zum Speichern der Lieferdaten - inklusive einer Tabelle mit den Versanddienstleistern (V9)\" width=\"700\" height=\"437,296\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Erweiterung des Datenmodells um die Tabellen zum Speichern der Lieferdaten &#8211; inklusive einer Tabelle mit den Versanddienstleistern (V9)<\/span><\/b><\/p>\n<p>Nachfolgend haben wir die folgenden neuen Tabellen aufgelistet, die weitgehend wie die Tabellen f&uuml;r die Rechnungen aufgebaut sind:<\/p>\n<ul>\n<li><b>tblLieferungen<\/b>: Diese Tabelle verwaltet analog zur Tabelle <b>tblRechnungen <\/b>die Lieferungen. Wir haben hier gar nicht erst ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblBestellungen<\/b> angelegt, da wir uns damit wieder einschr&auml;nken w&uuml;rden, nur die Bestellpositionen einer Bestellung in einer Lieferung erfassen zu k&ouml;nnen. Stattdessen verkn&uuml;pfen wir die Lieferungen und die Bestellungen &uuml;ber die nachfolgend vorgestellte Tabelle <b>tblLieferungenBestellungen<\/b>. Die Tabelle <b>tblLieferungen <\/b>enth&auml;lt au&szlig;erdem das Lieferdatum, die ID des Kunden sowie ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblLieferadressen<\/b>. Neu ist ein Fremdschl&uuml;sselfeld zu einer weiteren Tabelle namens <b>tblVersanddienstleister<\/b>. Damit legen wir fest, &uuml;ber welches Unternehmen der Versand erfolgt. Ein Fremdschl&uuml;sselfeld f&uuml;r eine Rechnungsadresse ben&ouml;tigen wir hier nicht &#8211; diese Information wird auf Lieferscheinen in der Regel nicht angezeigt.<\/li>\n<li><b>tblLieferungenBestellungen<\/b>: Mit der Tabelle <b>tblLieferungenBestellungen <\/b>legen wir fest, welche Lieferung zu welcher Bestellung geh&ouml;rt. Durch diese m:n-Verkn&uuml;pfungstabelle k&ouml;nnen wir jede Bestellung auf mehrere Lieferungen aufteilen, aber auch die Positionen mehrerer Bestellungen in einer Lieferung erfassen.<\/li>\n<li><b>tblLieferpositionen<\/b>: Die Tabelle der Lieferpositionen erfasst, welche der bestellten Produkte in der mit <b>LieferungID <\/b>referenzierten Lieferung geliefert werden. Diese Tabelle enth&auml;lt au&szlig;erdem ein Fremdschl&uuml;sselfeld zur Tabelle <b>tblBestellpositionen<\/b>, damit wir abgleichen k&ouml;nnen, welche Bestellpositionen bereits geliefert wurden.<\/li>\n<li><b>tblLieferadressen<\/b>: Die Tabelle <b>tblLieferadressen <\/b>erfasst die Adresse des Kunden, an den die Lieferung geschickt wird.<\/li>\n<li><b>tblVersanddienstleister<\/b>: Diese Tabelle nimmt die Bezeichnungen der Versanddienstleister auf, damit wir diese den Lieferungen aus der Tabelle <b>tblLieferungen<\/b> zuordnen k&ouml;nnen. Diese Tabelle k&ouml;nnen wir noch erweitern, beispielsweise um Adresse und Ansprechpartner beim Versanddienstleister.<\/li>\n<\/ul>\n<h2>Stornierungen oder &Auml;nderungen von Bestellungen<\/h2>\n<p>Je nach Gesch&auml;ftsmodell und Verkaufsbedingungen kann es sein, dass Stornierungen auftreten.<\/p>\n<p>Daf&uuml;r kann es verschiedene Gr&uuml;nde geben:<\/p>\n<ul>\n<li>Der Kunde hat versehentlich das falsche Produkt bestellt.<\/li>\n<li>Der Kunde hat die falsche Anzahl bestellt.<\/li>\n<li>Das Produkt ist nicht mehr lieferbar (sollte eigentlich nicht vorkommen, wenn die Best&auml;nde ordentlich gepflegt und abgebildet sind, passiert aber sicher dennoch mal).<\/li>\n<\/ul>\n<p>Daneben gibt es unterschiedliche Auswirkungen:<\/p>\n<ul>\n<li>Die komplette Bestellung soll storniert werden.<\/li>\n<li>Es sollen nur ein oder mehrere Bestellpositionen storniert werden.<\/li>\n<li>Es soll nur die Menge der bestellten Produkte einer Bestellposition ge&auml;ndert werden.<\/li>\n<li>Gegebenenfalls soll ein Produkt auch nur in einer anderen Ausf&uuml;hrung geliefert werden &#8211; beispielsweise in einer anderen Farbe.<\/li>\n<\/ul>\n<p>Und es gibt auch noch verschiedene Zeitpunkte, zu denen Stornierungen oder &Auml;nderungen einer Bestellung auftreten. Hier kommt es noch darauf an, in welcher Reihenfolge nach der Bestellung die Auslieferung und die Rechnungsstellung erfolgen.<\/p>\n<p>Um hier ausreichend flexibel zu sein, sollten wir allen betroffenen Tabellen ein Feld namens <b>Stornierungsdatum <\/b>hinzuf&uuml;gen. Je nachdem, ob nach der Bestellung bereits Rechnungen gestellt oder Lieferungen eingetragen wurden, kann man diese dann als storniert in den Tabellen vermerken:<\/p>\n<ul>\n<li><b>tblBestellungen<\/b><\/li>\n<li><b>tblBestellpositionen<\/b><\/li>\n<li><b>tblRechnungen<\/b><\/li>\n<li><b>tblRechnungspositionen<\/b><\/li>\n<li><b>tblLieferungen<\/b><\/li>\n<li><b>tblLieferpositionen<\/b><\/li>\n<\/ul>\n<p>Der Ausgangspunkt ist immer die Bestellung beziehungsweise die Bestellposition. Wird eine komplette Bestellung storniert, k&ouml;nnen wir das Feld <b>Stornierungsdatum <\/b>in der Tabelle <b>tblBestellungen <\/b>mit dem Stornierungsdatum f&uuml;llen.<\/p>\n<p>Dies w&uuml;rden wir dann auf bereits bestehende Datens&auml;tze zu dieser Bestellung in den Tabellen <b>tblRechnungen <\/b>und <b>tblLieferungen <\/b>&uuml;bertragen. Au&szlig;erdem sollte sich dies auch auf die verkn&uuml;pften Datens&auml;tze der Tabellen <b>tblBestellpositionen<\/b>, <b>tblRechnungspositionen <\/b>und <b>tblLieferpositionen <\/b>auswirken.<\/p>\n<p>Wenn nur eine oder mehrere Bestellpositionen storniert werden sollen, f&uuml;llen wir nur das Feld <b>Stornierungsdatum <\/b>f&uuml;r die entsprechenden Datens&auml;tze in der Tabelle <b>tblBestellpositionen <\/b>und nachfolgend in den Tabellen <b>tblRechnungspositionen <\/b>und <b>tblLieferpositionen<\/b>.<\/p>\n<p>Hier m&uuml;sste man jedoch Mechanismen in der Gesch&auml;ftslogik einbauen, die pr&uuml;fen, ob &uuml;berhaupt storniert werden kann &#8211; wenn Rechnungen bereits versendet und bezahlt wurden, m&uuml;sste man gegebenenfalls erst die R&uuml;ckzahlung veranlassen und dann eine Korrekturrechnung schicken.<\/p>\n<p>Die Einbeziehung dieser Abl&auml;ufe w&uuml;rde jedoch den Rahmen des vorliegenden Beitrags sprengen.<\/p>\n<h2>Die Mehrwertsteuer<\/h2>\n<p>Ein wichtiges Thema haben wir uns bis zum Schluss aufbewahrt. Dabei handelt es sich um die Mehrwertsteuer. Bisher taucht diese in den folgenden Tabellen auf:<\/p>\n<ul>\n<li><b>tblProdukte<\/b><\/li>\n<li><b>tblBestellpositionen<\/b><\/li>\n<li><b>tblRechnungspositionen<\/b><\/li>\n<\/ul>\n<p>In den Produkten haben wir dazu bisher ein einfaches <b>W&auml;hrungsfeld <\/b>mit dem Format <b>Prozentzahl <\/b>vorgesehen (dadurch wird der Wert mit dem Datentyp <b>Decimal <\/b>gespeichert, der keine Probleme beim Runden erzeugt wie Gleitkommazahlen).<\/p>\n<p>In einer perfekten Welt, in der sich die Mehrwertsteuers&auml;tze nicht &auml;ndern, w&auml;re dies ausreichend. Selbst eine zus&auml;tzliche Tabelle, welche die Mehrwertsteuers&auml;tze speichert, w&auml;re nicht n&ouml;tig, weil sich diese ja nicht &auml;ndern. Okay, in einer wirklich perfekten Welt g&auml;be es vielleicht nur einen Mehrwertsteuersatz (oder gar keinen), aber wir m&uuml;ssen mit dem arbeiten, was uns die Gesetze vorgeben.<\/p>\n<p>Schauen wir uns also an, was bezogen auf dem Mehrwertsteuersatz an zus&auml;tzlichen Anforderungen entsteht, die wir bisher noch nicht ber&uuml;cksichtigt haben.<\/p>\n<p>Die erste Feststellung dazu ist: In Deutschland gibt es zwei Mehrwertsteuers&auml;tze:<\/p>\n<ul>\n<li><b>Regul&auml;rer Mehrwertsteuersatz<\/b>: Liegt aktuell bei 19%.<\/li>\n<li><b>Reduzierter Mehrwertsteuersatz<\/b>: Liegt aktuell bei 7%.<\/li>\n<\/ul>\n<p>Die Bezeichnungen sind derzeit das Einzige, was wir als konstant bezeichnen k&ouml;nnen, und auch hier kann man nat&uuml;rlich nie ausschlie&szlig;en, dass es nicht auch einmal einen weiteren Mehrwertsteuersatz gibt &#8211; immerhin gibt es L&auml;nder, die nur einen einzigen Mehrwertsteuersatz verwenden und auch solche, die noch einen dritten Nutzen haben. Und diese Auflistung ist vermutlich auch nicht vollst&auml;ndig.<\/p>\n<p>Nicht konstant ist der tats&auml;chlich verwendete Mehrwertsteuersatz. Dieser wurde im Laufe der Jahre gelegentlich erh&ouml;ht, und in 2020 wegen der Corona-Krise f&uuml;r ein Jahr vermindert. All dies m&uuml;ssen wir in einer Anwendung zur Verwaltung von Bestellungen nat&uuml;rlich ber&uuml;cksichtigen, und zwar so, dass der Benutzer damit m&ouml;glichst wenig Arbeit hat.<\/p>\n<p>Das hei&szlig;t, dass wir optimalerweise nur einmal beim Anlegen eines Produkts festlegen m&uuml;ssen, ob f&uuml;r ein Produkt der regul&auml;re oder der reduzierte Mehrwertsteuersatz gilt. Den Rest sollte die Datenbankanwendung erledigen &#8211; also zum Beispiel beim Hinzuf&uuml;gen eines Produkts als Position einer Bestellung den tats&auml;chlichen derzeit g&uuml;ltigen Mehrwertsteuersatz in die Tabelle <b>tblBestellpositionen <\/b>zu &uuml;bertragen.<\/p>\n<p>Im einfachsten Fall verwenden wir dazu eine Tabelle namens <b>tblMehrwertsteuersaetze<\/b>, die zwei Felder enth&auml;lt:<\/p>\n<ul>\n<li><b>MehrwertsteuersatzID<\/b>: Prim&auml;rschl&uuml;sselfeld der Tabelle<\/li>\n<li><b>Mehrwertsteuersatz<\/b>: W&auml;hrungsfeld mit dem Format <b>Prozentzahl <\/b>und den aktuellen Werten, also <b>19% <\/b>und <b>7%<\/b>.<\/li>\n<li><b>Bezeichnung<\/b>: Enth&auml;lt die Werte <b>Regul&auml;rer Mehrwertsteuersatz <\/b>und <b>Reduzierter Mehrwertsteuersatz<\/b>.<\/li>\n<\/ul>\n<p>Aus der Tabelle <b>tblProdukte <\/b>entfernen wir nun das Feld <b>Mehrwertsteuersatz <\/b>und f&uuml;gen eines namens <b>MehrwertsteuersatzID <\/b>hinzu, das als Nachschlagefeld zur Auswahl eines der Eintr&auml;ge der Tabelle <b>tblMehrwertsteuersaetze <\/b>verwendet werden kann (oder f&uuml;r Puristen auch als einfaches Fremdschl&uuml;sselfeld).<\/p>\n<p>Das Ergebnis sieht wie in Bild 13 aus (siehe <b>GrundlagenDatenmodellRechnungsverwaltung_V11.accdb<\/b>). Der Mehrwertsteuersatz muss beim Anlegen einer Bestellposition von der Anwendung aus dem richtigen Datensatz der Tabelle <b>tblMehrwertsteuersaetze <\/b>ausgelesen und in das Feld <b>Mehrwertsteuersatz <\/b>der Tabelle <b>tblBestellpositionen <\/b>eingetragen werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_013.png\" alt=\"Erweiterung der Verarbeitung des Mehrwertsteuersatzes (V11)\" width=\"700\" height=\"293,5217\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Erweiterung der Verarbeitung des Mehrwertsteuersatzes (V11)<\/span><\/b><\/p>\n<p>Dies funktioniert nur, wenn die Tabelle <b>tblMehrwertsteuersaetze <\/b>an dem Tag, an dem wir eine Bestellung anlegen, den korrekten Mehrwertsteuersatz f&uuml;r diesen Datumsbereich aufweist.<\/p>\n<p>Sicherer w&auml;re es, wenn wir in der Tabelle <b>tblMehrwertsteuersaetze <\/b>noch zwei zus&auml;tzliche Felder namens <b>GueltigVon <\/b>und <b>GueltigBis <\/b>aufnehmen, die den Zeitraum enthalten, in dem dieser Mehrwertsteuersatz g&uuml;ltig ist. Dann m&uuml;sste der Mechanismus, der beim Anlegen einer Bestellposition nach der Auswahl des Produkts ausgel&ouml;st wird, den f&uuml;r das aktuelle Datum g&uuml;ltigen Mehrwertsteuersatz ermitteln und diesen in das Feld <b>tblBestellpositionen <\/b>eintragen.<\/p>\n<p>Wichtig ist allein, dass wir in der Tabelle <b>tblBestellpositionen <\/b>sowie dann sp&auml;ter auch in der Tabelle <b>tblRechnungspositionen <\/b>den tats&auml;chlichen, zum Bestellzeitpunkt g&uuml;ltigen Mehrwertsteuersatz vermerken und nicht etwa ein Fremdschl&uuml;sselfeld mit einem Verweis auf die Tabelle <b>tblMehrwertsteuersaetze<\/b>. Auch wenn es attraktiv erscheint, dies zu tun, da man durch die Angabe von G&uuml;ltigkeitsbereichen eigentlich immer den g&uuml;ltigen Mehrwertsteuersatz erhalten sollte, ist das Eintragen des konkreten Wertes sicherer.<\/p>\n<h2>Ausblick Rechnungsverwaltung<\/h2>\n<p>Wir haben in diesem Beitrag nur die Erstellung von Rechnungen ber&uuml;cksichtigt, jedoch nicht die daraus resultierenden nachfolgenden Aufgaben. Schlie&szlig;lich sollte auch der Rechnungseingang noch verfolgt und dokumentiert werden &#8211; und daran schlie&szlig;t sich auch noch ein Erinnerungs- beziehungsweise Mahnwesen an, das nochmals einige weitere Tabellen erfordert.<\/p>\n<h2>Referenzielle Integrit&auml;t und L&ouml;schweitergabe<\/h2>\n<p>Wenn wir schon ein Datenmodell zusammenstellen, darf ein Blick auf die referenzielle Integrit&auml;t f&uuml;r die Definition der Beziehungen zwischen den Tabellen und die Funktion der L&ouml;schweitergabe nicht fehlen.<\/p>\n<p>Referenzielle Integrit&auml;t haben wir stillschweigend f&uuml;r alle Beziehungen innerhalb der Datenbank aktiviert. Erfahrene Access-Entwickler haben das direkt an der Art der Beziehungspfeile im Datenmodell erkannt. Die gro&szlig;e Frage ist jedoch: F&uuml;r welche Beziehungen aktivieren wir die L&ouml;schweitergabe und f&uuml;r welche nicht? L&ouml;schweitergabe bedeutet, dass wenn wir einen Datensatz aus der Tabelle, die mit dem Prim&auml;rschl&uuml;sselfeld an der Beziehung beteiligt ist, l&ouml;schen, alle Datens&auml;tze der Tabelle gel&ouml;scht werden, die &uuml;ber das Fremdschl&uuml;sselfeld mit dieser Tabelle verkn&uuml;pft sind.<\/p>\n<p>Das macht an einigen Stellen Sinn, an anderen wiederum nicht. Im Falle der Bestellverwaltung sollte man jedoch &uuml;berall ohne L&ouml;schweitergabe arbeiten. In manchen F&auml;llen k&ouml;nnte man dies nach R&uuml;ckfrage an den Benutzer erlauben beziehungsweise einen Hinweis darauf geben, dass dieser zun&auml;chst alle verkn&uuml;pften Datens&auml;tze l&ouml;schen muss, bevor der Hauptdatensatz gel&ouml;scht werden kann. Also haben wir in dieser Beispieldatenbank alle L&ouml;schweitergaben deaktiviert (diesen Schritt haben wir erst in <b>V12 <\/b>durchgef&uuml;hrt &#8211; in den vorherigen Versionen sind noch aktivierte L&ouml;schweitergaben enthalten).<\/p>\n<h2>Datenmodell in der &Uuml;bersicht<\/h2>\n<p>Bild 14 zeigt alle Tabellen und Beziehungen, die wir im Rahmen dieses Beitrags angelegt haben, in einer &Uuml;bersicht an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_06\/pic_1459_014.png\" alt=\"Das vollst&auml;ndige Datenmodell (V12)\" width=\"700\" height=\"504,5831\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Das vollst&auml;ndige Datenmodell (V12)<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt einige M&ouml;glichkeiten auf, wie man ein Datenmodell f&uuml;r eine Datenbank zur Verwaltung von Bestellungen, Rechnungen und Lieferungen erstellen kann und welche Fehler man dabei vermeiden sollte.<\/p>\n<p>Im Gegensatz zu den sonst vorgestellten Modellen f&uuml;r Bestellverwaltungen haben wir hier einmal die tats&auml;chlichen Anforderungen beleuchtet &#8211; und dabei sicher noch nicht alle Aspekte erfasst.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V1.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V2.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V3.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V4.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V5.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V6.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V7.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V8.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V8a.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V9.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V10.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V11.accdb<\/p>\n<p>GrundlagenDatenmodellRechnungsverwaltung_V12.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F8D296BB-A0EF-4C6D-A899-002B148D96DE\/aiu_1459.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beim Schreiben von Anwendungen, mit denen Rechnungen erstellt werden sollen, stellt sich immer wieder die Frage nach dem korrekten Datenmodell. Davon ausgehend, dass es nicht das perfekte Datenmodell f&uuml;r alle Anwendungsf&auml;lle gibt, wollen wir in diesem Beitrag einmal unterschiedliche Ans&auml;tze betrachten und diskutieren. Diese haben eines gemein: Die Anwendung mit diesem Datenmodell soll die M&ouml;glichkeit bieten, sowohl Bestellungen zu erfassen als auch Rechnungen und Lieferscheinen zu erstellen. Wie welche Daten gespeichert werden und welche M&ouml;glichkeiten es gibt, schauen wir uns nun an.<\/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":[662023,66052023,66062023,44000021],"tags":[],"class_list":["post-55001459","post","type-post","status-publish","format-standard","hentry","category-662023","category-66052023","category-66062023","category-Tabellen_und_Datenmodellierung"],"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>Datenmodelle f&uuml;r die Rechnungsverwaltung - 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\/Datenmodelle_fuer_die_Rechnungsverwaltung\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenmodelle f&uuml;r die Rechnungsverwaltung\" \/>\n<meta property=\"og:description\" content=\"Beim Schreiben von Anwendungen, mit denen Rechnungen erstellt werden sollen, stellt sich immer wieder die Frage nach dem korrekten Datenmodell. Davon ausgehend, dass es nicht das perfekte Datenmodell f&uuml;r alle Anwendungsf&auml;lle gibt, wollen wir in diesem Beitrag einmal unterschiedliche Ans&auml;tze betrachten und diskutieren. Diese haben eines gemein: Die Anwendung mit diesem Datenmodell soll die M&ouml;glichkeit bieten, sowohl Bestellungen zu erfassen als auch Rechnungen und Lieferscheinen zu erstellen. Wie welche Daten gespeichert werden und welche M&ouml;glichkeiten es gibt, schauen wir uns nun an.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-26T18:09:27+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=\"28\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenmodelle f&uuml;r die Rechnungsverwaltung\",\"datePublished\":\"2024-01-26T18:09:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/\"},\"wordCount\":5589,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/b1e955d469274112a929bd939a7b7cc9\",\"articleSection\":[\"2023\",\"5\\\/2023\",\"6\\\/2023\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/\",\"name\":\"Datenmodelle f&uuml;r die Rechnungsverwaltung - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/b1e955d469274112a929bd939a7b7cc9\",\"datePublished\":\"2024-01-26T18:09:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/b1e955d469274112a929bd939a7b7cc9\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/b1e955d469274112a929bd939a7b7cc9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenmodelle_fuer_die_Rechnungsverwaltung\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenmodelle f&uuml;r die Rechnungsverwaltung\"}]},{\"@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":"Datenmodelle f&uuml;r die Rechnungsverwaltung - 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\/Datenmodelle_fuer_die_Rechnungsverwaltung\/","og_locale":"de_DE","og_type":"article","og_title":"Datenmodelle f&uuml;r die Rechnungsverwaltung","og_description":"Beim Schreiben von Anwendungen, mit denen Rechnungen erstellt werden sollen, stellt sich immer wieder die Frage nach dem korrekten Datenmodell. Davon ausgehend, dass es nicht das perfekte Datenmodell f&uuml;r alle Anwendungsf&auml;lle gibt, wollen wir in diesem Beitrag einmal unterschiedliche Ans&auml;tze betrachten und diskutieren. Diese haben eines gemein: Die Anwendung mit diesem Datenmodell soll die M&ouml;glichkeit bieten, sowohl Bestellungen zu erfassen als auch Rechnungen und Lieferscheinen zu erstellen. Wie welche Daten gespeichert werden und welche M&ouml;glichkeiten es gibt, schauen wir uns nun an.","og_url":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-01-26T18:09:27+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"28\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenmodelle f&uuml;r die Rechnungsverwaltung","datePublished":"2024-01-26T18:09:27+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/"},"wordCount":5589,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/b1e955d469274112a929bd939a7b7cc9","articleSection":["2023","5\/2023","6\/2023","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/","url":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/","name":"Datenmodelle f&uuml;r die Rechnungsverwaltung - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/b1e955d469274112a929bd939a7b7cc9","datePublished":"2024-01-26T18:09:27+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/b1e955d469274112a929bd939a7b7cc9","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/b1e955d469274112a929bd939a7b7cc9"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenmodelle_fuer_die_Rechnungsverwaltung\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenmodelle f&uuml;r die Rechnungsverwaltung"}]},{"@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\/55001459","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=55001459"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001459\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}