Farbschema: Hell
Sie befinden sich hier: start » de » Dokumentation » Werkzeuge für Microsoft Access » WKL Forms Object Library » how-to » Nach einer Aktion eine Benachrichtigung mit Rückgängig anzeigen

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

  • WklToast ist ein Objekt, kein Steuerelement. Erstellen Sie es mit New in dem Modul, das die Aktion ausführt. Kein Formular braucht ein Steuerelement, und auch ein Unterformular kann Benachrichtigungen anzeigen.
  • Show zeigt eine Benachrichtigung an: Text, Art (wtkSuccess, wtkWarning …), einen optionalen Titel, die Beschriftung der Aktion und einen Tag, 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 WithEvents auf Modulebene des Formulars und behandeln Sie Action(Id, Tag). Oder nennen Sie in ActionFunction eine Funktion (=WiederHerstellen(17)), wie bei OnAction eines 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 WithEvents deklarieren; eine Benachrichtigung, die ein lokales Objekt anzeigt, löst ihre Ereignisse ins Leere aus. Verwenden Sie dort ActionFunction, 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 Form angezeigte Benachrichtigungen schließen sich, wenn dieses Formular geschlossen wird (Closed mit wtrOwnerClosed). Benachrichtigungen im Access-Fenster bleiben, bis ihre Zeit abgelaufen ist, auch wenn das Formular geschlossen wird, das sie angezeigt hat.
  • Count, Close und CloseAll wirken auf alle Benachrichtigungen der Access-Sitzung, gleich welches Objekt sie angezeigt hat. Verwenden Sie CloseAll vor 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

de/wiki/msaccess/comctl/how-to/show-a-note-after-an-action.txt · Zuletzt geändert: von Wolfgang van der Stille