Rechnungsverwaltung: Gestellte Rechnungen sperren und stornieren

Seit dem letzten Artikel erhält eine Rechnung beim Stellen ihre Rechnungsnummer. Damit ist sie noch nicht vor Änderungen geschützt: Öffnen wir sie erneut, können wir Mengen ändern, Positionen löschen und das Datum überschreiben, obwohl die Rechnung bereits beim Kunden liegt. Das widerspricht dem Zweck einer gestellten Rechnung. Außerdem fehlen zwei Aktionen, die eine Rechnungsverwaltung braucht: Eine gestellte Rechnung muss sich stornieren lassen, und ein Entwurf, den niemand mehr braucht, soll sich löschen lassen. Wie wir das Rechnungsformular abhängig vom Status sperren und die beiden Aktionen im Kundendetailformular unterbringen, liest Du in diesem Artikel.

Beispieldatenbank

Die Beispiele dieses Artikels findest Du in der Datenbank Rechnungsverwaltung_Rechnungen-SperrenUndStornieren.accdb.

Sie baut auf der Datenbank aus dem Artikel Rechnungsverwaltung: Die Rechnungsnummer (www.access-basics.de/724) auf.

Die Regeln für die drei Status

Bevor wir Code schreiben, legen wir die Regeln fest. Unsere Rechnungen kennen drei Status aus der Tabelle tblRechnungsstatus: 1 (Entwurf), 2 (Gestellt) und 3 (Storniert) – siehe Bild 1.

Werte der Tabelle tblRechnungsstatus

Bild 1: Werte der Tabelle tblRechnungsstatus

Für jeden Status gelten andere Regeln:

  • Entwurf: Ein Entwurf darf bearbeitet, gestellt und gelöscht werden. Er hat noch keine Rechnungsnummer, deshalb entsteht beim Löschen keine Lücke in der Nummernfolge.
  • Gestellt: Eine gestellte Rechnung darf nur noch angesehen und storniert werden. Das Löschen ist nicht erlaubt, denn ihre Nummer ist vergeben, und die Rechnung muss aufbewahrt werden.
  • Storniert: Eine stornierte Rechnung darf nur noch angesehen werden.

Wir setzen diese Regeln in zwei Formularen um: im Rechnungsformular frmRechnung, das je nach Status schreibgeschützt wird, und im Kundendetailformular frmKundendetail, in dem wir die Schaltflächen zum Stornieren und Löschen unterbringen.

Das Rechnungsformular abhängig vom Status sperren

Access bietet für Formulare drei Eigenschaften, mit denen wir steuern, was der Benutzer mit den Daten tun darf: Bearbeitungen zulassen, Anfügen zulassen und Löschen zulassen. In VBA heißen sie Allow-Edits, AllowAdditions und AllowDeletions.

Im Artikel Rechnungsverwaltung: Rechnungen eines Kunden (www.access-basics.de/723) haben wir diese Eigenschaften im Eigenschaftenblatt fest auf Nein gestellt. Hier brauchen wir sie dynamisch: Ob eine Rechnung bearbeitet werden darf, hängt von ihrem Status ab, wobei sich der Status von Rechnung zu Rechnung unterscheiden kann.

Das passende Ereignis ist Beim Anzeigen des Formulars. Es tritt immer dann ein, wenn ein Datensatz zum aktuellen Datensatz wird, also auch beim Öffnen des Formulars.

Die Prozedur Form_Current dazu gibt es in frmRechnung bereits:

Im Artikel Rechnungsverwaltung: Die Rechnungsnummer (www.access-basics.de/724) aktivieren oder deaktivieren wir darin die Schaltfläche cmdRechnungStellen, je nachdem, ob die Rechnung eine Rechnungsnummer hat (siehe Bild 2).

Rechnung mit deaktivierter Schaltfläche cmdRechnungStellen

Bild 2: Rechnung mit deaktivierter Schaltfläche cmdRechnungStellen

Öffne den VBA-Code von frmRechnung und ersetze die Prozedur Form_Current durch die folgende Prozedur:

Private Sub Form_Current()
     Dim bolEntwurf As Boolean
     bolEntwurf = (Nz(Me!RechnungsstatusID, 1) = 1)
     Me.AllowEdits = bolEntwurf
     With Me!sfmRechnungspositionen.Form
         .AllowEdits = bolEntwurf
         .AllowAdditions = bolEntwurf
         .AllowDeletions = bolEntwurf
     End With
     Me!cmdRechnungStellen.Enabled = bolEntwurf
End Sub

Die Prozedur ermittelt zuerst, ob die angezeigte Rechnung ein Entwurf ist. Der Ausdruck in Klammern liefert True, wenn RechnungsstatusID den Wert 1 hat, anderenfalls False.

Die Funktion Nz ersetzt den Wert Null durch 1, falls das Feld Rechnungs-statusID noch keinen Wert enthält. Damit bleibt ein neuer Datensatz bearbeitbar.

Access [basics]

Unser exklusives Angebot für Dich!

Access im Unternehmen
7,90 € im Monat*

(Das Abo ist jederzeit monatlich kündbar)

Hier geht’s weiter →

Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.

PayPal VISA Mastercard SEPA
Kostenlos & unverbindlich

Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?

Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?

In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.

Jetzt kostenloses Access-Audit anfordern →