Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Entwickeln Sie eine Rechnungsverwaltung mit beliebigen Mehrwertsteuersätzen.

Techniken

Tabellen, Formular, Berichte, VBA

Voraussetzungen

Access 97 und höher

Beispieldatenbank

Rechnungsverwaltung97.mdb, Rechnungsverwaltung00.mdb

Steuerfeste Rechnungsverwaltung

André Minhorst, Duisburg

Wer individuelle Arbeiten verrichtet, möchte diese auch in Rechnung stellen. Also: Word anschmeißen, Formatvorlage rauskramen, Adresse, Datum und Positionen aufschreiben und dann noch schnell mit den Taschenrechner den Rechnungsbetrag inklusive Steuern ausrechnen. Nein! Das ist doch viel zu umständlich. Viel einfacher geht es mit der Rechnungsverwaltung, die Sie im vorliegenden Beitrag kennen lernen.

Individuelle Rechnungen

Freiberufler und kleine Unternehmen, die nicht gerade massenweise Produkte oder Leistungen verkaufen, bauen an Stelle von SAP für die Rechnungsverwaltung meist auf Word und Excel.

Da diese Programme aber nun auch nicht gerade für diese Arbeit ausgelegt sind, greifen Sie einfach mal wieder zu Access.

Kunden, Rechnungen und Positionen lassen sich in wenigen Tabellen verwalten, Formulare sorgen für eine komfortable Eingabe und die Rechnung gibt es natürlich in Form eines Berichts.

Neue Steuersätze inklusive

Nun soll das Ganze natürlich so flexibel bleiben wie möglich - das heißt vor allem, dass die Einführung eines neuen Mehrwertsteuersatzes kein Update bedeutet, sondern lediglich das Hinzufügen eines Datensatzes in der passenden Tabelle.

Außerdem sollte der Benutzer die relevanten Texte anpassen können, ohne direkt den Entwurf des Berichts bearbeiten zu müssen. Statt eines vorgefertigten "Sehr geehrte Damen und Herren" soll also durchaus eine individuelle Ansprache möglich sein, aber diese Eingabe muss im Formular, nicht im Berichtsentwurf erfolgen.

Dadurch, dass alle Änderungen in passenden Textfeldern im Formular passieren und die Inhalte in den fertig formatierten Bericht gelangen, ist zumindest sichergestellt, dass die Rechnungen ein einheitliches Layout liefern. In Word ist die Wahrscheinlichkeit, in der Zeile zu verrutschen oder verschiedene Zeichenformate zu verwenden, deutlich höher.

Steuern ...

Die Rechnungsverwaltung bewahrt den aktuellen und kommende Steuersätze in einer eigenen Tabelle namens tblSteuersaetze auf (s. Abb. 1). Das ist sehr wichtig, auch für eigene Anwendungen: Wenn sich der Mehrwertsteuersatz ändert, müssen Sie sehr vorsichtig vorgehen. Ein unbe

dachtes Ändern von 16 % auf 19 % dürfte in vielen Fällen zu Problemen führen, weil dadurch bestehende Datensätze und damit Rechnungen plötzlich Positionen mit einem neuen Steuersatz enthalten - und sich die Brutto-Rechnungsbeträge damit ändern können.

Abb. 1: Tabelle zur Verwaltung der Steuersätze

Abb. 2: Das Hauptformular zu Rechnungseingabe

Das gilt natürlich nicht pauschal für alle Anwendungen, sondern ist eher ein gut gemeinter Ratschlag: Wenn Sie selbst an einer Access- oder sonstigen Anwendung Änderungen vornehmen, um den Steuersatz zu aktualisieren, passen Sie einfach auf.

Der vorliegenden Rechnungsverwaltung können Sie mit beliebigen Steuersätzen kommen: Hauptsache, Sie legen dafür einen neuen Datensatz in der Tabelle tblSteuersaetze an und verwenden die neuen Steuersätze erst ab deren Einführung in Ihren Rechnungen.

Man hätte der Anwendung noch ein Formular zum Ergänzen der Steuersätze mitgeben können - aber die sehr seltenen Ergänzungen kann man auch mal direkt in der Tabelle vornehmen. Natürlich nur, wenn man die Anwendung nur selbst verwendet und nicht weitergibt.

Funktionen der Lösung

Das Hauptformular der Rechnungsverwaltung dient der Eingabe von Rechnungen (s. Abb. 2).

Es zeigt alle wichtigen Details im Überblick an; lediglich zum Hinzufügen oder Bearbeiten eines Kunden muss man ein weiteres Formular öffnen. Die Bedienung des Formulars bedarf keiner weiteren Anleitung. Falls Sie ein Eingabefeld für die Rechnungsnummer vermissen: Es gibt keines. Die Anwendung nimmt einem die Erstellung der Rechnungsnummer ab und erzeugt diese als Kombination aus der Jahreszahl und einer vierstelligen laufenden Nummer wie im folgenden Beispiel (etwa 2006-0001). Einzelheiten dazu finden Sie weiter unten.

Abb. 3: Eingeben von Kundendaten

Abb. 4: Anzeige einer abgeschlossenen Rechnung

Kunden anlegen und bearbeiten

Die Schaltfläche Bearbeiten neben dem Kombinationsfeld zur Auswahl eines Kunden öffnet das Formular frmKunden - entweder im Bearbeitungs- oder im Anfügemodus, je nachdem, ob im Kombinationsfeld bereits ein Kunde ausgewählt ist.

Die einzige Besonderheit beim Anlegen eines Kunden ist, dass Sie zusätzlich zum Namen und/oder der Firma noch eine Bezeichnung eingeben müssen. Diese wird später im Rechnungsformular zur Auswahl angeboten und sorgt zum einen dafür, dass man keine Funktion mehr stricken muss, die beim Fehlen von Angaben wie Name oder Firma einen passenden Ausdruck zur Anzeige zusammenbaut. Zum anderen können Sie so mehrere Rechnungsadressen etwa für die gleiche Firma anlegen und diese im Kombinationsfeld an ihren Bezeichnungen unterscheiden (s. Abb. 3).

Rechnungen abschließen

Irgendwann einmal ist der Punkt erreicht, an dem man sicher keine Änderungen an einer Rechnung mehr vornehmen muss - normalerweise sollte dies spätestens mit der Bezahlung der Fall sein. Damit Sie bereits erledigte Rechnungen nicht versehentlich ändern, können Sie diese mit der Schaltfläche Rechnung abschließen sperren - die dadurch ausgelöste Funktion schreibt lediglich das aktuelle Datum in ein Feld der Rechnungstabelle und aktualisiert das Formular. Dieses wiederum deaktiviert alle Eingabefelder, sobald es eine gesperrte Rechnung anzeigt.

Es lassen sich dann lediglich noch die drei Schaltflächen im unteren Bereich des Formulars betätigen (s. Abb. 4).

Drucken oder Vorschau?

Zwei der drei Schaltflächen, die auch bei gesperrtem Datensatz noch aktiviert sind, drucken die Rechnung direkt auf den aktuellen Standarddrucker aus oder zeigen sie in der Berichtsvorschau an. Letzteres eröffnet die Möglichkeit, über das Datei-Menü den Drucken-Dialog zu öffnen und einen alternativen Drucker auszuwählen.

Schneller geht’s nicht

Wenn man ein paar Rechnungen angelegt hat, liegen wohl alle notwendigen Floskeln etwa für den Rechnungstext in den einen oder anderen Rechnungsdatensatz vor. Außerdem arbeitet der eine oder andere ja doch mehrmals für den gleichen Auftraggeber und erledigt unter Umständen sogar die gleichen Aufgaben für diesen.

Für all diese Fälle ist die Schaltfläche Neue Rechnung auf Basis dieser Rechnung vorgesehen: Sie legt einen neuen Rechnungsdatensatz an, der genau die gleichen Daten der aktuellen Rechnung enthält, und kopiert auch die enthaltenen Rechnungspositionen mit. Einzig die Rechnungsnummer wird automatisch aktualisiert.

Druck machen

Die Ausgabe der Rechnung erfolgt im Bericht rptRechnung. Diesen müssen Sie freilich noch an Ihre Bedürfnisse anpassen, da Sie vermutlich nicht Max Mustermann heißen (s. Abb. 5).

Abb. 5: Vorschau auf die zu erstellende Rechnung

Da sich Ihre Adresse, Bankverbindung, Steuernummer und dergleichen vermutlich nur selten ändern, passen Sie diese nur einmal an. Dies geschieht direkt im Berichtsentwurf; eine Tabelle und die notwendigen Formulare zum komfortablen Eingeben dieser Daten wären zwar nette Features, würden den Rahmen dieses Artikels aber sprengen. Außerdem mag vielleicht der eine oder andere eine ganz individuelle Gestaltung seines Briefkopfes vornehmen oder hat gar eine Vorgabe umzusetzen.

Datenmodell

Das Datenmodell besteht aus mehr Tabellen, als es die recht einfache und wenig umfangreiche Oberfläche erkennen lässt (s. Abb. 6).

Die Tabellen tblRechnungen, tblKunden und tblPositionen enthalten die wesentlichen Daten, die Tabellen tblAnreden, tblSteuersaetze und tblEinheiten sind lediglich Lookuptabellen zur vereinfachten Eingabe von Daten.

Zwischen tblRechnungen und tblKunden besteht eine 1:n-Beziehung, da jeder Rechnung ein Kunde, jedem Kunden aber mehrere Rechnungen zugewiesen werden können.

Andersherum ist es bei den Rechnungen und den enthaltenen Positionen: Jede Rechnung kann mehrere Positionen enthalten, aber jede Position nur in einer einzigen Rechnung vorkommen.

Das ist ein großer Unterschied zum Datenmodell etwa von Bestellverwaltungen wie der Nordwind-Datenbank: Hier dient die Positionstabelle erst dazu, beliebige Kombinationen aus Rechnungen und Artikeln festzulegen; in der vorliegenden Anwendung sind jedoch keine sich wiederholenden Positionen eingeplant.

Formulare

Die Anwendung enthält drei Formulare, von denen sfmRechnungen als Unterformular zur Anzeige der Rechnungspositionen im Formular frmRechnungen dient. Das dritte Formular im Bunde heißt frmKunden und dient zum Anlegen und Bearbeiten von Kunden.

Abb. 6: Das Datenmodell mit allen Tabellen der Rechnungsverwaltung

Abb. 7: Das Unterformular sfmRechnungen enthält Steueelemente zur Bearbeitung von Rechnungspositionen.

Formular zur Anzeige von
Rechnungspositionen

Das im Formular frmRechnungen enthaltene Unterformular sfmRechnungen dient zur Eingabe der Positionen einer Rechnung (s. Abb. 7). Das Unterformular ist an die Tabelle tblPositionen gebunden und enthält die in der Abbildung zu erkennenden Felder der Tabelle. Das einzige weitere Steuerelement ist das nur durch den Rahmen zu erkennende Textfeld unten rechts im Detailbereich. Dieses benötigt man beim Anzeigen einer gesperrten Rechnung zum Deaktivieren unpassender Steuerelemente - dazu später mehr.

Formular zur Anzeige
der Rechnungen

Einige Details mehr weist das Formular frmRechnungen auf. Es ist an die Tabelle tblRechnungen gebunden, zeigt aber nicht alle enthaltenen Felder in Form bearbeitbarer Textfelder an - die Rechnungsnummer etwa taucht nur in der Titelleiste des Formulars auf.

Ermittlung der Rechnungsnummer

Eine der wichtigsten Funktionen dieses Formulars ist die Ermittlung der Rechnungsnummer. Die fortlaufende Nummer im aktuellen Jahr speichert die Datenbank im Feld Rechnungsnummer der Tabelle tblRechnungen. Die in diesem Feld gespeicherten Rechnungsnummern sollen jedes Jahr mit 1 beginnen und dann fortlaufend durchnummeriert werden. Die Nummern gelöschter Rechnungen werden - sofern es nicht um die zuletzt eingegebene Rechnung handelt - nicht wieder verwendet.

Zur eindeutigen Vergabe von Rechnungsnummern stellt die Anwendung dieser Zahl noch die Jahreszahl voran, in dem die Rechnung ausgestellt wurde (etwa "2006-0001"). Die Anwendung speichert die Jahreszahl nicht separat, sondern nur als Teil des Rechnungsdatums. Für die Anzeige der Rechnungsnummer in der Titelleiste des Formulars sowie in der Druckversion der Rechnung setzt die Anwendung die Rechnungsnummer aus der im Datum enthaltenen Jahreszahl und der Rechnungsnummer zusammen.

Das Ermitteln der Rechnungsnummer übernimmt die Routine FormularAktualisieren, die zu verschiedenen Gelegenheiten aufgerufen wird:

  • beim Anzeigen eines neuen Datensatzes,
  • nach dem Aktualisieren des Rechnungsdatums und
  • nach dem Aktualisieren von Kundendaten.
  • Die Routine ist in Quellcode 1 abgebildet. Sie prüft zunächst, ob entweder noch gar keine Rechnungsnummer vorhanden ist oder ob das Jahr des aktuellen Rechnungsdatums sich von dem Inhalt eines temporären Textfeldes txtJahrTemp unterscheidet. Dieses Textfeld wird erstmalig beim Anzeigen eines Datensatzes mit dem Jahr des Rechnungsdatums gefüllt. Warum dies? Nun, die Rechnungsnummer ist vom aktuellen Jahr abhängig, und zwar ermittelt die Routine die neue Rechnungsnummer, indem Sie per DMax-Funktion die größte bisher vergebene Nummer der bisherigen Rechnungen für das betroffene Jahr ermittelt und eins hinzurechnet.

    Abb. 8: Die Titelleiste enthält grundlegende Informationen zur aktuell angezeigten Rechnung.

    Quellcode 1: Ermitteln der Rechnungsnummer

    Private Sub FormularAktualisieren()

        Dim intRechnungsjahr As Integer

        Dim bolKeineNummer As Boolean

        Dim bolJahrGeaendert As Boolean

        Dim bolRechnungsdatum As Boolean

        Dim strKunde As String

        Dim strRechnungsnummer As String

        

        bolKeineNummer = IsNull(Me!Rechnungsnummer)

        bolRechnungsdatum = Not IsNull(Me!Rechnungsdatum)

        If bolRechnungsdatum Then

            bolJahrGeaendert = Year(Me!Rechnungsdatum) <> _
                Me!txtJahrTemp

        Else

            bolJahrGeaender = False

        End If

        

        If (bolKeineNummer Or bolJahrGeaendert) _
            And bolRechnungsdatum Then

            Me!Rechnungsnummer = Nz(DMax("Rechnungsnummer", _
                "tblRechnungen", "Year(Rechnungsdatum) = " _
                & Year(Me!Rechnungsdatum)) + 1, 1)

        End If

        

        If Not bolRechnungsdatum Then

            intRechnungsjahr = 0

        Else

            intRechnungsjahr = Year(Me!Rechnungsdatum)

        End If

        

        strKunde = Nz(Me!KundeID.Column(1), "./.")

        strRechnungsnummer = Format(intRechnungsjahr, "0000") _
            & "-" & Format(Nz(Me!Rechnungsnummer, 0), "0000")

        Me.Caption = "Rechnungsverwaltung - Kunde: " & strKunde _
            & " - Rechnungsnummer: " & strRechnungsnummer

        

        If Not IsNull(Me!Rechnungsdatum) Then

            Me!txtJahrTemp = Year(Me!Rechnungsdatum)

        End If

    End Sub

    Das passiert allerdings nur, wenn folgende Bedingungen zutreffen: Es muss ein Rechnungsdatum, aber noch keine Rechnungsnummer vorhanden sein, oder das Rechnungsdatum muss aktualisiert worden sein.

    Letzterer Fall würde bedeuten, dass zwar eine Rechnungsnummer vorhanden ist, sich aber auf ein überholtes Vorlageexemplar zur aktuellen Rechnung bezieht - und da diese Nummer für das laufende Jahr ja durchaus schon vergeben sein kann, muss die Routine eine neue Rechnungsnummer ermitteln.

    Um zu dem temporären Textfeld mit der Jahreszahl zurückzukommen: Es ist technisch nicht ausgeschlossen, dass ein Benutzer das Rechnungsdatum und damit das Jahr mehrmals ändert, ohne den Datensatz zu speichern. In dem Fall gibt es keinen Wert, mit dem man das aktuelle Jahr vergleichen könnte - also speichert man diesen nach jeder Änderung in einem eigenen Textfeld.

    Der Rest der Routine stellt die Informationen für die Anzeige in der Titelleiste zusammen. Üblicherweise sieht dies wie in Abb. 8 aus, aber es kann ja auch vorkommen, dass noch kein Rechnungsdatum und/oder keine Rechnungsnummer vorhanden ist.

    In dem Fall sorgt die Routine für die Anzeige der Dummy-Rechnungsnummer 0000-0000. Und bei fehlendem Kunden zeigt die Titelleiste statt dessen Bezeichnung die Zeichenkette ./. an.

    Damit die Routine bei einer erneuten Änderung des Rechnungsdatums auch die Rechnungsnummer anpassen kann, stellt sie noch den Inhalt des Textfeldes txtJahrTemp auf den aktuellen Wert ein.

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.