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.
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).
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.
Unser exklusives Angebot für Dich!
(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.
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 →![Access [basics]](https://access-basics.de/wp-content/uploads/2021/02/logo400.png)

