Nach einer Aktion eine Benachrichtigung mit Rückgängig anzeigen
Teilen Sie dem Benutzer in einer kurzen Benachrichtigung unten rechts im Access-Fenster mit, dass eine Aktion gelungen ist – „Regel gelöscht“ –, mit einem Rückgängig, das er per Maus, Tastatur oder Bildschirmsprachausgabe erreicht. Es gibt kein Meldungsfeld, das geschlossen werden muss, und der Fokus bleibt, wo er ist.
Voraussetzungen: WKL Forms Object Library 1.34 oder höher.
Lösungsüberblick
WklToastist ein Objekt, kein Steuerelement. Erstellen Sie es mitNewin dem Modul, das die Aktion ausführt. Kein Formular braucht ein Steuerelement, und auch ein Unterformular kann Benachrichtigungen anzeigen.Showzeigt eine Benachrichtigung an: Text, Art (wtkSuccess,wtkWarning…), einen optionalen Titel, die Beschriftung der Aktion und einenTag, der mit ihr zurückkommt (zum Beispiel den Schlüssel des gelöschten Datensatzes). Die Benachrichtigung schließt sich nach 4 Sekunden von selbst, mit Aktion nach 8 Sekunden.- Die Aktion: Deklarieren Sie das Objekt
WithEventsauf Modulebene des Formulars und behandeln SieAction(Id, Tag). Oder nennen Sie inActionFunctioneine Funktion (=WiederHerstellen(17)), wie beiOnActioneines Access-Menüeintrags: Sie läuft auch dann, wenn das Modul nicht mehr zuhört. - Tastatur: Strg+Umschalt+Z führt die Aktion der neuesten Benachrichtigung aus. F6 wechselt in die Benachrichtigung, Esc schließt sie, F6 kehrt zurück. Ohne sichtbare Benachrichtigung ändert sich nichts.
Umsetzung
Die Tabelle des Beispiels, einmalig angelegt (führen Sie die Prozedur im Direktbereich aus):
Public Sub CreateNoteSample()
With CurrentDb
.Execute "CREATE TABLE tblRegel (ID LONG CONSTRAINT PK_Regel PRIMARY KEY, Name TEXT(50), Geloescht YESNO)"
.Execute "INSERT INTO tblRegel VALUES (1, 'Mahnung nach 30 Tagen', False)"
.Execute "INSERT INTO tblRegel VALUES (2, 'Rabatt ab 1000 EUR', False)"
End With
End Sub
Ein Endlosformular frmRegeln über SELECT * FROM tblRegel WHERE Not Geloescht mit dem Textfeld Name und der
Schaltfläche cmdLoeschen. Das Löschen markiert den Datensatz nur (Geloescht), sodass Rückgängig ihn
zurückholen kann:
Option Compare Database
Option Explicit
Private WithEvents mToast As WklToast
Private Sub Form_Load()
Set mToast = New WklToast
End Sub
Private Sub cmdLoeschen_Click()
Dim id As Long
Dim regelName As String
If IsNull(Me!ID) Then Exit Sub
id = Me!ID
regelName = Nz(Me!Name, "") ' read before Requery: afterwards the form stands on another record
CurrentDb.Execute "UPDATE tblRegel SET Geloescht = True WHERE ID = " & id, dbFailOnError
Me.Requery
mToast.Show "Regel """ & regelName & """ gelöscht.", wtkSuccess, , "Rückgängig", id
End Sub
Private Sub mToast_Action(ByVal Id As Long, ByVal Tag As Variant)
CurrentDb.Execute "UPDATE tblRegel SET Geloescht = False WHERE ID = " & Tag, dbFailOnError
Me.Requery
End Sub
Dasselbe ohne Ereignisprozedur aus einem Standardmodul, mit einer Funktion, die das Rückgängigmachen übernimmt:
Public Sub RegelLoeschen(ByVal id As Long)
Dim note As New WklToast
CurrentDb.Execute "UPDATE tblRegel SET Geloescht = True WHERE ID = " & id, dbFailOnError
note.Show "Regel gelöscht.", wtkSuccess, , "Rückgängig", , , , "=RegelWiederherstellen(" & id & ")"
End Sub
Public Function RegelWiederherstellen(ByVal id As Long) As Boolean
CurrentDb.Execute "UPDATE tblRegel SET Geloescht = False WHERE ID = " & id, dbFailOnError
If CurrentProject.AllForms("frmRegeln").IsLoaded Then Forms!frmRegeln.Requery
RegelWiederherstellen = True
End Function
Eine Meldung nach dem Speichern, in der Ecke des Formulars statt des Access-Fensters:
Private Sub Form_AfterUpdate()
mToast.Show "Gespeichert.", wtkSuccess, , , , 2000, Me
End Sub
Hinweise
- Eine lokale Variable lässt sich nicht
WithEventsdeklarieren; eine Benachrichtigung, die ein lokales Objekt anzeigt, löst ihre Ereignisse ins Leere aus. Verwenden Sie dortActionFunction, oder halten Sie das Objekt auf Modulebene. - Die Benachrichtigung hält eine Kopie von
Tag. Übergeben Sie den Schlüssel, kein Recordset und kein Formular: Die Benachrichtigung kann diese überdauern. - Mit
Formangezeigte Benachrichtigungen schließen sich, wenn dieses Formular geschlossen wird (ClosedmitwtrOwnerClosed). Benachrichtigungen im Access-Fenster bleiben, bis ihre Zeit abgelaufen ist, auch wenn das Formular geschlossen wird, das sie angezeigt hat. Count,CloseundCloseAllwirken auf alle Benachrichtigungen der Access-Sitzung, gleich welches Objekt sie angezeigt hat. Verwenden SieCloseAllvor einem langen Vorgang, der mit einer leeren Ecke beginnen soll.- Höchstens drei Benachrichtigungen sind sichtbar; weitere warten. Zeigen Sie nicht je Datensatz einer Schleife eine Benachrichtigung an, sondern eine Benachrichtigung mit der Anzahl („12 Regeln gelöscht“).
- Fehler und Entscheidungen, die eine Antwort brauchen, gehören in ein Meldungsfeld oder ein Dialogfeld, nicht in eine Benachrichtigung: Eine Benachrichtigung verschwindet.
Verwandte Themen
- API-Referenz (Englisch): WklToast – Member, Ereignisse, Arten und Gründe für das Schließen.
- API-Referenz (Englisch): WklDockLayout – F6 zwischen den Bereichen; eine sichtbare Benachrichtigung reiht sich dort als erste Station ein.