Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
Rechnungsbericht
Die Ausgabe von Rechnungen dürfte einer der beliebtesten Anwendungszwecke für die Erstellung von Berichten sein. Gleichzeitig sind Rechnungsberichte aber auch eine der anspruchsvollsten Aufgaben – zumindest, wenn man sämtlichen Schnickschnack wie Zwischensumme und Übertrag, vernünftige Aufteilung der Positionen bei mehrseitigen Berichten, keine letzte Seite ohne wesentliche Informationen et cetera berücksichtigen will. Und wenn Sie dann noch mehrere Rechnungen in einem Bericht abbilden wollen, haben Sie das Ziel erreicht.
Datenherkunft für den Bericht
Als Grundlage verwenden wir die Bestelldaten aus der Suedsturm-Datenbank. Welche Tabellen Sie für die dem Bericht zugrunde liegende Abfrage benötigen, lässt sich mit einem Blick auf eine herkömmliche Rechnung herausfinden. Für die Anschrift des Kunden benötigen Sie die tblKunden-Tabelle, den Rest erledigen die in einer m:n-Beziehung stehenden Tabellen tblBestellungen, tblBestelldetails und tblArtikel. Damit der Kunde weiß, an wen er sich bei Fragen wenden kann, nehmen Sie noch die Tabelle tblPersonal hinzu, die ebenfalls mit der Tabelle tblBestellungen verknüpft ist. Die als Datensatzquelle verwendete Abfrage sieht schließlich wie in Bild 1 aus.
Bild 1: Datensatzquelle für den Rechnungsbericht (qryRechnungsbericht)Den aktuellen Steuergesetzen entsprechend wurde der Tabelle Bestellung noch ein Feld namens Rechnungsnummer hinzugefügt. Das Feld hat den Datentyp Text, um auch Zeichen wie Bindestriche oder Schrägstriche zu ermöglichen. Wie Sie die Rechnungsnummer ermitteln, bleibt Ihnen überlassen. Eine Rechnungsnummer muss aber auf jeden Fall eindeutig sein.
Manch einer verwendet eine bei 1 startende Nummerierung in Zusammenhang mit der Jahreszahl (zum Beispiel 2016-01); andere lassen die Kundennummer in die Rechnungsnummer einfließen. Wer wichtig wirken möchte, verwendet eine Rechnungsnummer wie 950 752 0642.
In der Beispieltabelle tblBestellungen ist die ?Rechnungsnummer schlicht eine Kombination aus dem Datum der Rechnungstellung und dem Primärschlüssel der Tabelle (etwa 20161009-11077). So können Sie auch einmal nur einfach in den Ordner mit Rechnungen schauen, wenn ein Kunde (oder der Steuerprüfer) dazu eine Frage hat – vorausgesetzt dort liegen die Rechnungen in chronologischer Reihenfolge vor ...
Mehrwertsteuersätze
Außerdem wurde die Tabelle Artikel um ein Feld namens ?Mehrwertsteuersatz erweitert (s. Bild 2), das zu Testzwecken nicht durchgängig den Wert 7% enthält, wie es für Lebensmittel üblich ist, sondern dem wir hier und da auch mal den Wert 19% hinzugefügt haben. Die Tabelle tblBestelldetails enthält das gleiche Feld, in das bei einer Bestellung der gültige Mehrwertsteuersatz übertragen werden soll – auf diese Weise kann man die Mehrwertsteuersätze für die Tabelle tblArtikel ändern, ohne dass sich dies auf bereits erstellte Datensätze in der Tabelle tblBestellpositionen auswirkt. Wir wollen ja gegebenenfalls auch einmal eine Rechnungskopie drucken können, ohne dass dort wegen geänderter Mehrwertsteuersätze plötzlich neue Rechnungsbeträge herauskommen.
Bild 2: Das neue Feld Mehrwertsteuersatz in der Tabelle tblArtikel
Das Feld Mehrwertsteuersatz haben wir mit dem Datentyp Währung versehen. Auf diese Weise erhalten wir die gewünschte Genauigkeit. Außerdem haben wir das Format auf Prozentzahl eingestellt und die Anzeige der Dezimalstellen auf 0 – sollten einmal Mehrwertsteuersätze wie 19,5% auftauchen, kann man dies nachträglich ändern.
Auf die gleiche Weise haben wir auch die Felder Mehrwertsteuersatz und Rabatt in der Tabelle tblBestelldetails angepasst.
Berechnete Felder
Die Abfrage selbst wurde um ein berechnetes Feld namens Bruttopreis ergänzt, das den Bruttopreis einer jeden Position enthält (siehe Auflistung). Außerdem gibt es noch zwei weitere berechnete Felder namens Netto und MwStBetrag. Sie verwenden in diesem Bericht folgende Felder:
- Tabelle tblArtikel: ArtikelID, Artikelname, Liefereinheit
- Tabelle tblBestelldetails: Einzelpreis, Menge, Rabatt, Mehrwertsteuer
- Tabelle tblBestellungen: BestellungID, KundeID, Bestelldatum, Versanddatum, VersandUeber, Frachtkosten, Empfaenger, Strasse, Ort, PLZ, Bestimmungsland, Rechnungsnummer
- Tabelle tblKunden: Firma, Kontaktperson, Strasse, Ort, PLZ, Land
- Tabelle tblPersonal: Nachname, Vorname, Anrede, DurchwahlBuero
- Berechnetes Feld ?Bruttopreis: [tblBestelldetails].[Einzelpreis]*[tblBestelldetails].[Menge]* ([tblBestelldetails].[Rabatt]+1)*([tblArtikel].[Mehrwertsteuer]+1)
- Berechnetes Feld ?Netto: [tblBestelldetails.Einzelpreis]*[Menge]*(1+[Rabatt])
- Berechnetes Feld MwStBetrag: [tblBestelldetails.Einzelpreis]*[Menge]*(1+[Rabatt])*[Mehrwertsteuer]
Die letzten beiden Felder werden nicht in der Auflistung der Positionen angezeigt, sondern dienen nur der Ermittlung der Summe der Nettopreise und der Mehrwertsteuer am Ende der Rechnung.
Wenn Sie mit früheren Versionen der Suedsturm-Datenbank experimentiert haben, ist Ihnen vielleicht auch aufgefallen, dass wir den Namen des Feldes Anzahl in der Tabelle tblBestelldetails durch Menge ersetzt haben. Der Grund ist einfach: In der deutschen Version von Access ist Anzahl ein reserviertes Wort, was hier und da zu Problemen führen könnte. Daher haben wir es durch die Bezeichnung Menge ersetzt.
Konzept für die Erstellung des Berichts
Bevor Sie sich an die Erstellung eines Berichts machen, sollten Sie die Daten in Gedanken (oder auch auf dem Papier) kurz auf die einzelnen Bereiche eines Berichts aufteilen und sich überlegen, welche Daten etwa nur auf der ersten Seite angezeigt werden, was passiert, wenn so viele Datensätze vorhanden sind, dass der Bericht über mehrere Seiten geht, und so weiter.
Im vorliegenden Fall haben Sie es mit einem ziemlich großen Berichtskopf zu tun: Dieser enthält den kompletten Briefkopf, die Anschrift des Kunden, Lieferdaten und so weiter. Moment: Ist das wirklich so? Wenn der Berichtskopf bereits kundenspezifische und damit rechnungsspezifische Daten enthält, dann können Sie nur eine Rechnung je Bericht ausgeben. Warum? Weil der Berichtskopf nur einmal je Bericht angezeigt wird. Wenn Sie aber mal einen ganzen Schwung Rechnungen ausdrucken möchten, haben Sie ein Problem: Sie müssen dann schon den gleichen Bericht mehrere Male aufrufen. Natürlich geht das auch, aber in diesem Fall sollen Sie einen Bericht erstellen, der mehrere Rechnungen auf einen Rutsch anfertigen kann.
Also benötigen Sie eine Gruppierung über die einzelnen Bestellungen – als Gruppierungsfeld bietet sich das Feld BestellungID an. Im Gruppenkopf bringen Sie nun alles unter, was Sie sonst in den Berichtskopf packen wollten – Briefkopf, Anschrift, Bestelldaten wie Bestellnummer und so weiter.
Die einzelnen Positionen gehören – ganz klar – in den Detailbereich. Darüber benötigen Sie Feldüberschriften: Diese können Sie auf der ersten Seite direkt im Gruppenkopf unterbringen, auf den folgenden Seiten im Seitenkopf. Dieser darf dann wiederum nicht auf der ersten Seite angezeigt werden – dazu später mehr. Nach der letzten Rechnungsposition folgt noch die Rechnungssumme. Dafür bietet sich der Berichtsfuß an. Auf der Seite mit dem Berichtsfuß soll wiederum kein Seitenfußbereich angezeigt werden.
Wenn Sie dem Kunden ein wenig mehr Komfort bieten möchten, sorgen Sie auch noch für eine Zwischensumme und einen Übertrag. Die Zwischensumme gehört mit in den Seitenfuß, der Übertrag in den Seitenkopf – dieser erscheint aber nur auf den Seiten, die keinen Gruppierungskopf anzeigen. Sie sehen – eine Rechnung ist nicht gerade der trivialste Bericht, der sich mit Access erstellen lässt, und er enthält noch nicht einmal Gruppierungen.
Briefkopf im Berichtskopf oder Gruppenkopf?
Normalerweise würden wir den Briefkopf im Bereich Berichtskopf eines Berichts anlegen. Eigentlich logisch – der erscheint schließlich maximal einmal, und zwar auf der ersten Seite.
Allerdings wollen wir dabei nicht vergessen, dass wir nicht nur eine Rechnung, sondern gegebenenfalls auch mehrere Rechnungen in einem Bericht ausgeben wollen. Das heißt also, dass wir die Daten des Briefkopfs in den Gruppenkopf für die einzelnen Rechnungen packen müssen. So benötigen wir also eine Gruppierung für den Bericht, der die Daten unserer Datenherkunft nach den Datensätzen der Tabelle tblBestellungen gruppiert. Diesen richten Sie wie in Bild 3 ein. Hier wählen Sie außerdem die Eigenschaftswerte mit Kopfzeilenbereich, mit Fußzeilenbereich und Kopfzeile und ersten Datensatz auf einer Seite zusammenhalten aus.
Bild 3: Einrichtung der Gruppierung für den RechnungsberichtErstellen des ?Gruppenkopfs
Die Erstellung des Gruppenkopfs einer Rechnung ist im Wesentlichen Design-Arbeit und weniger Denksport. Hier bringen Sie den Briefkopf unter, den Block mit der Empfängeradresse und den Block mit den allgemeinen Rechnungsdaten (s. Bild 4).
Bild 4: Einrichtung des Gruppenkopfes für die RechnungHier gibt es folgende Besonderheiten: Das Feld txtPLZUndOrt fasst die Felder PLZ und Ort der Tabelle Kunden zusammen. Wichtig ist hier wie bei anderen Steuerelementen, dass Sie Tabellennamen und Feldnamen von in mehreren Tabellen vorkommenden Feldern durch Punkt getrennt schreiben und in eckige Klammern einfassen. Dies geschieht noch einmal im Gruppenkopf, und zwar im Textfeld txtAnsprechpartner. Dessen Inhalt lautet:
=[Personal.Anrede] & " " & [Personal.Vorname] & " " & [Personal.Nachname]
Die Feldüberschriften werden Sie normalerweise erst im folgenden Schritt beim Füllen des Detailbereichs anlegen, in der Abbildung sehen Sie aber bereits ihre Anordnung.
Anlegen des ?Detailbereichs
Der Detailbereich ist reine Fleißarbeit – abgesehen von einem Feature, das aber erst später hinzukommt, und der Angabe der Rechnungspositionen. Der Detailbereich enthält die Felder Artikelname, Liefereinheit, Bruttopreis, Einzelpreis, Menge, Rabatt, Mehrwertsteuersatz und Bruttopreis, wobei Letzteres das berechnete Feld ist, das Sie der Abfrage weiter oben hinzugefügt haben. Es fehlt noch das ganz linke Feld in der Entwurfsansicht (s. Bild 5). Es heißt txtPosition und besitzt als Steuerelementinhalt den Wert =1. Damit dieses Feld die Position des Artikels für die aktuelle Rechnung, also innerhalb der aktuellen Gruppierung, anzeigt, stellen Sie die Eigenschaft Laufende Summe dieses Feldes auf Über Gruppe ein.
Bild 5: Einrichtung des DetailbereichsAußerdem fügen Sie das Feld Bruttopreis erneut hinzu (siehe das markierte Feld in der Abbildung). Für dieses stellen Sie die Eigenschaft Sichtbar auf Nein ein sowie Laufende Summe auf Über Gruppe. Geben Sie diesem Feld außerdem die Bezeichnung txtLaufendeSumme. Wir benötigen es später für die Zwischensumme und den Übertrag.
Berechnungen in Berichten oder ?Berechnungen in Formularen
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.