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. We-lche 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 Kun-den benötigen Sie die tblKunden-Tabelle, den Rest erledigen die in einer m:n-Beziehung ste-henden 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.

 Datensatzquelle für den Rechnungsbericht (qryRechnungsbericht)

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 Rechnungs-num-mer 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 Rech-nungs-nummer einfließen. Wer wichtig wirken möchte, verwendet eine Rechnungs-nummer wie 950 752 0642.

In der Beispieltabelle tblBestellungen ist die Rechnungsnummer schlicht eine Kom-bi-nation 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 – voraus-gesetzt 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.

Das neue Feld Mehrwertsteuersatz in der Tabelle tblArtikel

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, Fracht-kosten, 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])*[Mehr-wertsteuer]

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.

Einrichtung der Gruppierung für den Rechnungsbericht

Bild 3: Einrichtung der Gruppierung für den Rechnungsbericht

Erstellen 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 Emp-fän-geradresse und den Block mit den allgemeinen Rechnungsdaten (s. Bild 4).

Einrichtung des Gruppenkopfes für die Rechnung

Bild 4: Einrichtung des Gruppenkopfes für die Rechnung

Hier 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.

Einrichtung des Detailbereichs

Bild 5: Einrichtung des Detailbereichs

Auß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

Möglicherweise fragen Sie sich, ob man die Berechnung des Bruttopreises und der anderen berechneten Felder in der Abfrage nicht auch innerhalb des Berichts hätte durchführen können. Die Frage ist berechtigt, da das sogar funktionieren würde. Das Problem ist nur, dass Sie keine datensatzübergreifenden Berechnungen über den Bezug auf das Feld mit dem Berechnungsergebnis durchführen könnten. Ein in der Abfrage berechnetes Feld behandelt Access im Bericht aber wie ein normales Tabellenfeld; hier sind Berechnungen wie etwa das Bilden der Summe über alle Datensätze einer Gruppierung möglich.

Streng genommen würde man im Bericht auch ohne das in der Abfrage berechnete Feld auskommen, aber dann müsste man im Feld zur Berechnung der Summe über mehrere Datensätze Bezug auf die Berechnungsformel nehmen und nicht auf das Feld mit dem Berechnungsergebnis.

Summenbildung im Fußbereich der Gruppierung

Im Fußbereich der Gruppierung heißt es: Abrechnen! Hier wird die Summe über die Felder Netto, MwStBetrag und Bruttopreis des Detailbereichs gebildet und schließlich noch der Frachtkostenanteil hinzuaddiert (s. Bild 6).

Steuerelemente für den Fußbereich

Bild 6: Steuerelemente für den Fußbereich

Dazu fügen Sie für die Eigenschaft Steuerelement einfach den Feldnamen ein und fügen die Summe()-Funktion hinzu, sodass beispielsweise =Summe([Netto]) daraus wird.

Achtung: Interessanterweise müssen wir für die Eigenschaft Laufende Summe für die Summentextfelder nicht etwa den Wert über Gruppe auswählen, sondern den Wert Nein beibehalten (s. Bild 7).

Einstellung der Eigenschaft LaufendeSumme für die Summenfelder

Bild 7: Einstellung der Eigenschaft LaufendeSumme für die Summenfelder

Unterhalb der Rechnungssumme ist ein guter Ort, um die Bankverbindung unterzubringen.

Diese könnte man zwar auch auf der ersten Seite zu den allgemeinen Rechnungsdaten hinzufügen, aber der Rechnungsempfänger wird sich freuen, wenn er zum Begleichen der Rechnung per Online-Banking bei mehrseitigen Rechnungen nicht noch hin- und herblättern muss.

Der Fußbereich greift auf zwei Felder zurück, die sich zwar in der Abfrage, aber nicht im Detailbereich des Berichts befinden: Netto und MwStBetrag. Diese werden aus Gründen der übersicht nicht in jedem Datensatz angezeigt, sondern nur aufsummiert am Ende der Rechnung.

Feinheiten: Zwischensumme und übertrag

Ist abzusehen, dass sich einige Rechnungen über mehrere Seiten erstrecken, macht die Angabe von Zwischensumme und übertrag Sinn. Die Zwischensumme platzieren Sie im Bereich Seitenfuß des Berichts (s. Bild 8). Zur Ermittlung der laufenden Summe müssen Sie zunächst ein zusätzliches unsichtbares Feld im Detailbereich anlegen. Dieses erhält den Namen txtLaufendeSumme und hat als Steuer-elementinhalt den Wert =BruttoPreis. Damit die laufende Summe nur im Rahmen der aktuellen Rechnung ermittelt wird, stellen Sie die Eigenschaft Laufende Summe auf über Gruppe ein.

Entwurfsansicht des Seitenfußes mit der laufenden Summe

Bild 8: Entwurfsansicht des Seitenfußes mit der laufenden Summe

Dieses Feld enthält jeweils den Inhalt des gleichen Feldes aus dem vorherigen Datensatz zuzüglich des Inhalts des Feldes Bruttopreis des aktuellen Datensatzes. Das Feld txtZwischensumme im Seitenfuß des Berichts enthält den Inhalt des Feldes txtLaufendeSumme, welcher am Seitenende dem Wert des untersten angezeigten Datensatzes entspricht.

überschriften für Folgeseiten und Rechnungsübertrag

Fehlen noch die Feldüberschriften für die Folgeseiten in Rechnungen, die über mehr als eine Seite gehen.

Diese platzieren Sie genau wie das Feld zur Anzeige des Rechnungsübertrags im Seitenkopf des Berichts (s. Bild 9). Das Feld zur Anzeige des übertrags heißt txtUebertrag und ist ungebunden.

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