Rechnungsverwaltung: Datenmodell

In einer Beitragsreihe namens “Rechnungsverwaltung” wollen wir eine kleine Rechnungs-ver-waltung programmieren. Im ersten Teil kü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önnen. Das resultierende Datenmodell mit seinen Daten ist die Grundlage fü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 Überweisen per Smartphone enthält. Außerdem schauen wir uns noch an, wie Sie mithilfe von Kontoumsätzen schnell abgleichen können, welche Rechnungen bezahlt sind.

Tabellen der Rechnungsverwaltung

In diesem ersten Teil der Beitragsreihe schauen wir uns die Tabellen an, die zum Speichern von Kunden, Produkten, Bestellungen, Bestelldetails und weiteren Informationen benötigt werden. Außerdem werfen wir einen Blick auf die Beziehungen zwischen diesen Tabellen.

Schließlich nutzen wir ein Tool, um die Tabellen mit Beispieldaten zu füllen, damit die anschließende Programmierung von Formularen und Berichten mit realistischen Daten erfolgen kann und Sie diese nicht von Hand eingeben müssen.

Tabellen zum Speichern der Kundendaten

Die Kundendaten an sich speichern wir in einer Tabelle namens tblKunden. Es gibt eine weitere Tabelle namens tblAnreden, die wir als Nachschlagetabelle für die Anrede des Kunden nutzen wollen.

Der Entwurf der Kundentabelle sieht wie in Bild 1 aus. Das Primärschlüsselfeld zum Speichern eines eindeutigen Index heißt ID und wird mit der Autowert-Funktion befüllt. Für die Kundennummer haben wir ein eigenes Feld vorgesehen, da es sein kann, dass Sie Kundennummern aus einem Onlineshop oder anderen Quellen übernehmen müssen. Für das Feld Kundennummer legen wir einen eindeutigen Index fest, damit auch dieses eindeutig ist. Außerdem stellen wir den Felddatentyp auf Kurzer Text ein. Das Feld AnredeID ist ein Fremdschlüsselfeld mit Nachschlagefunktion für das Auswählen eines der Datensätze der Tabelle tblAnreden.

Die Tabelle tblKunden

Bild 1: Die Tabelle tblKunden

Für das Feld PLZ haben wir eine Feldgröße von 5 eingestellt. Damit kann der Benutzer nur fünf Zeichen für die PLZ eingeben.

Tabelle zum Speichern der Anreden

Die Tabelle tblAnreden enthält, wie es meistens der Fall ist, nur zwei Felder – eines namens ID mit dem Primärschlüssel und eines für die Bezeichnung der Anrede (siehe Bild 2).

Die Tabelle tblAnreden

Bild 2: Die Tabelle tblAnreden

Die Beziehung zwischen den beiden Tabellen sowie die für die Auswahl der jeweiligen Anrede notwendigen Nachschlage-feld-Eigenschaften haben wir komfortabel mit dem Nachschlage-Assistent festgelegt, den Sie über die Auswahl des Datentyps Nachschlage-Assistent starten. Dort haben wir im letzten Schritt eingestellt, dass wir für die Beziehung die Datenintegrität aktivieren – das ist die neue Bezeichnung im Nachschlagefeld-Assistenten für referenzielle Integrität.

Die beiden Werte für die Tabelle tblAnreden tragen wir gleich ein, sodass wir diese nicht mehr mit dem Beispieldatengenerator füllen müssen. Das Ergebnis sieht schließlich wie in Bild 3 aus.

Die Tabelle tblAnreden in der Datenblattansicht

Bild 3: Die Tabelle tblAnreden in der Datenblattansicht

Tabelle zum Speichern der Produkte

Die Tabelle tblProdukte sieht in der Entwurfsansicht wie in Bild 4 aus. Sie enthält ein Primärschlüsselfeld namens ID sowie ein Feld namens Produktbezeichnung, das wir mit einem eindeutigen Index versehen. Auf diese Weise kann nicht versehentlich ein Produkt gleichen Namens zwei Mal angelegt werden.

Die Tabelle tblProdukte

Bild 4: Die Tabelle tblProdukte

Außerdem enthält die Tabelle noch ein Feld namens Einzelpreis und zwei Fremdschlüsselfelder. Das erste heißt MehrwertsteuersatzID und dient als Nachschlagefeld für die Datensätze der Tabelle tblMehrwertsteuersaetze und das zweite namens EinheitID erlaubt die Auswahl eines der Datensätze der Tabelle tblEinheiten.

Die Tabelle tblMehrwertsteuersaetze enthält die Felder aus der Entwurfsansicht aus Bild 5. Sie enthält nicht nur ein Primärschlüsselfeld und ein Feld für den jeweiligen Mehrwertsteuersatz, sondern auch noch ein Feld mit der Bezeichnung des Mehrwertsteuersatzes. Für das Feld Mehrwertsteuersatzwert haben wir den Datentyp Währung festgelegt, weil dies die einzige Möglichkeit ist, die Genauigkeit des dahinter liegenden Datentyps Decimal abzubilden. Da das Feld Prozentsätze abbilden soll, haben wir allerdings die Eigenschaft Format auf Prozentzahl eingestellt. Da wir es in der Regel mit Prozentsätzen mit ganzen Prozentpunkten zu tun haben, also beispielsweise 7% oder 19%, stellen wir außerdem die Eigenschaft Dezimalstellenanzeige auf den Wert 0 ein.

Die Tabelle tblMehrwertsteuersaetze in der Entwurfsansicht

Bild 5: Die Tabelle tblMehrwertsteuersaetze in der Entwurfsansicht

Die Daten sehen nach der Eingabe wie in Bild 6 aus. Im Nachschlagefeld für das Feld MehrwertsteuersatzID in der Tabelle tblProdukte haben wir die beiden Felder ID und Mehrwertsteuersatzwert der Tabelle tblMehrwertsteuersaetze als Datensatzherkunft ausgewählt.

Die Tabelle tblMehrwertsteuersaetze in der Datenblattansicht

Bild 6: Die Tabelle tblMehrwertsteuersaetze in der Datenblattansicht

Tabelle zum Speichern der Einheiten

Die Tabelle tblEinheiten enthält nur die beiden Felder ID und Einheitbezeichnung (siehe Bild 7). Warum verwenden wir hier und in den vorhergehenden Tabellen gelegentlich den scheinbar unnötigen Zusatz Bezeichnung wie in Einheitbezeichnung? Vielleicht verwenden Sie die Tabellen einmal als Datenquelle für eine .NET-Anwendung unter Anbindung über das Entity Framework.

Die Tabelle tblEinheiten in der Entwurfsansicht

Bild 7: Die Tabelle tblEinheiten in der Entwurfsansicht

Dort würden Sie für die Tabelle tblEinheiten eine Klasse namens Einheit erstellen sowie eine Auflistung namens Einheiten. Wenn das Feld Einheitbezeichnung nun Einheit hieße, hätte es die gleiche Bezeichnung wie die Klasse, was jedoch nicht zulässig ist.

Wenn Sie sicher nicht vorhaben, jemals eine solche Anwendung auf dem Datenmodell aufzusetzen, dann können Sie auch mit Bezeichnungen wie Einheit oder Mehrwertsteuersatz arbeiten. Und falls es dann doch geschieht, können Sie das Problem immer noch durch ein geeignetes Mapping umgehen. Die Tabelle tblEinheiten füllen wir auch gleich mit ein paar Einträgen – siehe -Bild 8.

Die Tabelle tblEinheiten mit einigen Beispieldatensätzen

Bild 8: Die Tabelle tblEinheiten mit einigen Beispieldatensätzen

Tabelle zum Speichern der Bestellungen

Wir wollen jede Bestellung einem Kunden zuordnen, und außerdem soll jede Bestellung alle bestellten Produkte definieren. Das gelingt nicht in einer einzigen Tabelle. Wir erstellen also erst einmal eine Tabelle namens tblBestellungen und legen in dieser Informationen fest wie die Bestellnummer, die Datumsangaben wie Bestelldatum, Rechnungsdatum et cetera und den Kunden, für den diese Bestellung erfasst wurde (siehe Bild 9).

Die Tabelle tblBestellungen in der Entwurfsansicht

Bild 9: Die Tabelle tblBestellungen in der Entwurfsansicht

Für das Feld Bestellnummer, das wir zusätzlich zum Primärschlüsselfeld ID nutzen, um individuelle Bestellnummern vergeben zu können, legen wir einen eindeutigen Index fest. Auf diese Weise stellen wir sicher, dass der Benutzer jede Bestellnummer nur einmal verwenden kann.

Nachschlagefeld für den Kunden zu einer Bestellung anpassen

Den Kunden ordnen wir dabei wieder über ein Nachschlagefeld zu, mit dem wir den Kunden auswählen. Mit dem Nachschlage-Assistenten konnten wir dabei neben dem Primärschlüsselfeld der Tabelle tblKunden nur ein oder mehrere Felder der Tabelle auswählen, die beim Ausklappen des Nachschlagefeldes erscheinen.

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 – in diesem Fall die Firma, Vorname und Nachname sowie die Kundennummer.

Im ersten Anlauf haben wir damit für die Eigenschaft Datensatzherkunft im Bereich Nachschlagen der Feldeigenschaften die folgende Abfrage erstellt:

SELECT [tblKunden].[ID], [tblKunden].[Firma] FROM tblKunden;

Dieses ändern wir nun, indem wir auf die Schaltflä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.

Datensatzherkunft für das Nachschlagefeld zur Auswahl des Kunden

Bild 10: Datensatzherkunft für das Nachschlagefeld zur Auswahl des Kunden

Was macht dieser Ausdruck genau und warum verwenden wir den &-Operator und den +-Operator gemischt? Wir wollen einen Ausdruck erzeugen, der für einen Kunden mit Firma wie folgt aussieht:

André Minhorst Verlag - Minhorst, André (123)

Für einen Kunden ohne Angabe einer Firma soll die zweite Spalte der Abfrage den folgenden Ausdruck liefern:

Müller, Klaus (234)

Wir wollen also dafür sorgen, dass wenn das Feld Firma den Wert Null enthält, auch das Minus-Zeichen zwischen Firma und Nachname wegfällt.

Wenn wir nun wissen, dass das Kaufmanns-Und (&) immer alle Teile einer Zeichenkverkettung zurückliefert, auch wenn einer der Teile Null ist, und das Plus-Zeichen (+) immer den Wert Null zurückgibt, wenn nur eines der beiden verknüpften Elements Null ist, können wir den Ausdruck wie folgt gestalten:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar