Fehlerverwaltung mit Online-Komponente

André Minhorst, Duisburg

Wenn Sie eine Anwendung nicht gerade für sich selbst oder Ihren Schreibtischnachbarn (sofern Sie einen haben) erstellt haben, sondern für örtlich weiter entfernte Personen, wird das Beheben von Fehlern schnell zur Qual: Es besteht dann aus einer Mischung aus Telefonaten und per E-Mail verschickten Screenshots mit Fehlermeldungen – und das auch nur, wenn der jeweilige Anwender ausreichend versiert ist. Zumindest für Laufzeitfehler können Sie hier einiges an Zeit und Mühe einsparen – durch die richtige Automatisierung.

Wenn Sie gelegentlich selbst entwickelte Anwendungen verteilen und keine Lust haben, die Fehlermeldungen jeder Kopie der Anwendung separat aufzunehmen und telefonisch oder auf ähnlich zeitraubende Art mit dem Benutzer abzuhandeln, müssen Sie diesen Vorgang so weit wie möglich automatisieren. Damit sparen Sie nicht nur sich selbst, sondern auch dem Benutzer Aufwand und ärger – vor allem wenn dieser einfach nur mit Ihrer Anwendung arbeiten möchte und gar nichts mit dem Erstellen von Screenshots von Fehlermeldungen und ähnlichen Tätigkeiten zu tun haben möchte.

Das grundlegende Handwerkszeug dazu haben Sie möglicherweise bereits vor der Lektüre dieses Beitrags kennen gelernt: Es steckt in den Beiträgen Mails versenden ohne Outlook (4/2004), Fehlerdokumentation (5/2004) und Mail abrufen mit Access und POP3 in der aktuellen Ausgabe von Access im Unternehmen.

Im vorliegenden Beitrag erfahren Sie, wie Sie das Know-how dieser drei Beiträge verbinden und eine Lösung erstellen, die dem Anwender und dem Entwickler möglichst wenig Aufwand bei der Abhandlung auftretender Fehler bereitet.

Damit Sie einen Eindruck von der Funktionsweise der Fehlerverwaltung gewinnen, spielen wir einfach ein kleines Beispiel durch. Damit Sie alle nachfolgend beschriebenen Schritte nachvollziehen können, finden Sie auf der beiliegenden CD vier Beispieldatenbanken zu diesem Beitrag: Die eigentliche Fehlerverwaltung verbirgt sich hinter dem Dateinamen FehlerverwaltungXX.mdb und die Anwendung, die den Fehler auslöst, heißt Fehlerverwaltung_ClientXX.mdb (wobei “XX” durch “97” für Access 97 und “00” für Access 2000 und höher ersetzt wird.

Fehlermeldung versenden

Beginnen wir mit der fehlerhaften Datenbank: Diese enthält ein Formular namens frmBeispielfehler mit der Schaltfläche Fehler erzeugen (siehe Bild 1).

Bild 1: Fehler per Mausklick

Public Function FehlerhafteFunktion() As Long
    On Error GoTo FehlerhafteFunktion_Err
    FehlerhafteFunktion = 1 / 0
   ''Fehlerbehandlung
FehlerhafteFunktion_Exit:
    ''Restarbeiten
    Exit Function
FehlerhafteFunktion_Err:
    Call Fehlerbehandlung("mdlBeispielfehler ", _        "FehlerhafteFunktion", Erl, "Bemerkungen: ./.")
    GoTo FehlerhafteFunktion_Exit
End Function

Quellcode 1

Bild 2: Das Meldungsfenster der Fehlerbehandlung

Ein Klick auf diese Schaltfläche bewirkt den Aufruf der folgenden Ereignisprozedur:

Private Sub cmdFehlerErzeugen_Click()
    FehlerhafteFunktion
End Sub

Die dort aufgerufene Funktion FehlerhafteFunktion dividiert 1 durch 0 und löst damit einen Fehler aus. Damit hier kein Laufzeitfehler mit einer von Access generierten Fehlermeldung auftritt, fängt die Prozedur den Fehler ab (s. Quellcode 1).

Was dann passiert, schauen wir uns zunächst einmal an und kümmern uns im Anschluss um die dahinter stehenden Techniken.

Nach dem Auslösen des Fehlers durch einen Klick auf die Schaltfläche Fehler erzeugen erscheint das Formular aus Bild 2. Das Formular informiert den Benutzer darüber, dass ein Fehler aufgetreten ist und um welchen Fehler es sich handelt.

Es bietet die Möglichkeit, eine E-Mail an den Hersteller der Software zu senden, und zeigt in einem separaten Fenster alle Informationen an, die mit dieser E-Mail versendet werden.

Der Benutzer der Software kann zusätzlich einen Text mit weiteren Hinweisen zum Auftreten des Fehlers eingeben – beispielsweise mit den Schritten, die zum Fehler führten.

Damit der Hersteller den Kunden, bei dem der Fehler aufgetreten ist, identifizieren kann, muss dieser seine Kundennummer eingeben – schließlich soll er mit einer überarbeiteten Version der Software für sein Verständnis belohnt werden.

Schließlich legt der Benutzer noch fest, ob sich zwischen seinem Rechner und dem Internet eine Firewall befindet, die gegebenenfalls das Versenden der E-Mail über Port 110 verhindern könnte.

Wenn das nicht der Fall ist, muss er nur noch auf die Schaltfläche Fehlermeldung senden klicken, um die entsprechende Mail direkt via SMTP zu versenden.

Sollte eine Firewall im Spiel sein, kann die Mail auch über den Standard-E-Mail-Client des Benutzers versendet werden. Dieser wird von der Anwendung automatisch aufgerufen und mit den entsprechenden Daten gefüllt. Unter Outlook 2003 sieht die zu verschickende E-Mail wie in Bild 3 aus.

Bild 3: Fehlerversand per Outlook

Verarbeitung der Fehlermeldung

An diesem Punkt tritt die eigentliche Fehlerverarbeitung in Aktion. Damit ist die Beispieldatenbank FehlerverwaltungXX.mdb gemeint. Mit ihr holt der Entwickler die Fehlermeldungen per POP3 vom Mailserver ab.

Bild 4: Das Hauptformular der Fehlerverwaltung

Das Formular mit dem Titel Fehlermeldungen ist die Steuerzentrale für die Verwaltung der Fehlermeldungen. Interessant ist dort vor allem die Schaltfläche Fehlermeldungen abrufen (siehe Bild 4).

Mit einem Klick auf diese setzen Sie einen Prozess in Gang, der die auf dem E-Mail-Server vorliegende E-Mail mit der Fehlermeldung herunterlädt und ihren Inhalt in der Datenbank speichert.

Die Fehlermeldungen werden dann in einem Listenfeld angezeigt, von wo der Entwickler die einzelnen Meldungen in der Detailansicht anzeigen kann. Die Detailansicht (siehe Bild 5) bietet die Möglichkeit, einem Fehler eine Priorität zuzuordnen, den Fehler als behoben zu markieren und Informationen zur Fehlerbehebung einzutragen.

Bild 5: Detailansicht einer Fehlermeldung

Private Sub ArtikelHinzufügen_Click()
50     On Error GoTo ArtikelHinzufügen_Click_Err
60     Dim strDocName As String
70     strDocName = "Artikel"
80     DoCmd.OpenForm strDocName, , , , acAdd, , _           Me!LieferantenNr
90     DoCmd.Close acForm, "Artikelliste"
100     Forms![Artikel]!Artikelname.SetFocus
110    ''Fehlerbehandlung
120 ArtikelHinzufügen_Click_Exit:
130     ''Restarbeiten
140     Exit Sub
150 ArtikelHinzufügen_Click_Err:
160     Call Fehlerbehandlung("Form_Lieferanten ", _            "ArtikelHinzufügen_Click", Erl, _            "Bemerkungen: ./.")
170     GoTo ArtikelHinzufügen_Click_Exit
End Sub

Quellcode 2

Die nachfolgenden Schritte beschreiben, wie Sie den Fehlerverwaltungs-Client in eigene Anwendungen integrieren.

Import der benötigten Objekte

Der erste Schritt besteht im Import der Objekte, die für die Verarbeitung eines Fehlers erforderlich sind. Dazu öffnen Sie die Zieldatenbank (in diesem Fall eine Kopie der Nordwind-Datenbank) und importieren die gewünschten Objekte:

  • Führen Sie den Menüpunkt Datei/Externe Daten/Importieren aus.
  • Wählen Sie die Beispieldatei Fehlerverwaltung_ClientXX.mdb entsprechend Ihrer Access-Version aus.
  • Importieren Sie von dort das Formular frmFehlerbehandlung und die Module clsSMTP, clsWinsock, mdlAPI, mdlError, MIMEMessage und RFCHeaderLine. (
  • Einbau der Fehlerbehandlung

    Nachdem das Handwerkszeug beisammen ist, legen Sie eine Fehlerbehandlung an. Für Beispielzwecke nehmen wir uns das Formular Lieferanten vor. Der hinter der Schaltfläche Artikel hinzufügen stehende Code enthält bereits eine rudimentäre Fehlerbehandlung.

    Praxis-Tipp

    Eine Fehlerbehandlung sollten Sie prinzipiell für alle Prozeduren einer Anwendung anlegen – Fehler treten immerhin meistens dort auf, wo man sie nicht erwartet. Und wenn Sie diese lückenlos erfassen und melden können, bestehen gute Chancen, eine Anwendung mit der Zeit fast vollständig von Fehlern zu befreien. “Fast vollständig” deshalb, weil man nie alle Fehler ausschließen kann.

    Ersetzen Sie diese durch Ihre eigene Fehlerbehandlung und fügen Sie Zeilennummern hinzu.

    Bild 6: Anlegen von Fehlerbehandlung und Nummerierung per Mausklick

    Private Sub cmdFehlermeldungSenden_Click()
        Dim objSMTP As clsSMTP
        Dim strFehlermeldung As String
        ''Validierung aus Platzgründen ausgespart
        strFehlermeldung = Me!txtMailtext
        strFehlermeldung = strFehlermeldung & _        "KundenBeschreibung: " & Me!txtBeschreibung _        & ";" & vbCrLf
        strFehlermeldung = strFehlermeldung _        & "Kundennummer: " & Me!txtKundennummer & ";"
        If Me.ctlFirewall = True Then
            Set objSMTP = New clsSMTP
            With objSMTP
                .MailFrom = "<E-Mail Absender>"
                .MailTo = "<E-Mail Empfänger>"
                .Port = 25
                .SenderEMail = "<E-Mail Absender>"
                .Sendername = "<Name Absender>"
                .SMTPServer = "<SMTP-Server>"
                .Subject = "Fehlermeldung"
                .Plaintext = strFehlermeldung
                .Send
            End With
        Else
            Call ShellExecute(0&, "Open", "mailto:" _            + "<E-Mail Empfänger>" + "Subject=" + _            "Fehlermeldung" + "&Body=" + _            Replace(strFehlermeldung, vbCrLf, _            "%0a%0d"), "", "", 1)
        End If
        DoCmd.Close acForm, Me.Name
    End Sub

    Quellcode 3

    Die Prozedur sieht anschließend wie in Quellcode 2 aus.

    Praxis-Tipp

    Am schnellsten fügen Sie einer Prozedur die Fehlerbehandlung und Zeilennummerierung über die Funktionen der Menüleiste VBAExtensions hinzu, die wir im Beitrag Erweitern der VBA-Entwicklungsumgebung in Ausgabe 5/2004 von Access im Unternehmen vorgestellt haben. Damit kostet Sie der ganze Vorgang genau zwei Mausklicks (siehe Bild 6). Achtung: Verwenden Sie die neue Version der .dll-Datei, die Sie auf der beiliegenden CD finden!

    E-Mail-Daten anpassen

    Damit die E-Mails mit den Fehlermeldungen an die gewünschte Adresse gesendet werden, passen Sie einige Zeilen Code an.

    Die anzupassenden Anweisungen befinden sich in der Prozedur cmdFehlermeldungSenden des Klassenmoduls des Formulars frmFehlerbehandlung (s. Quellcode 3).

    Die Prozedur setzt den Text der E-Mail zusammen, übermittelt die E-Mail-Daten an das SMTP-Objekt und stößt das Versenden der E-Mail an. Dort ersetzen Sie die folgenden Platzhalter durch die entsprechenden Werte (Platzhalter sind im Quellcode fett gesetzt):

  • <E-Mail Absender>: E-Mail-Adresse des Absenders (beliebig)
  • Public Sub Fehlerbehandlung(strModul As String, strRoutine As String, _    lngZeile As Long, Optional strBemerkungen As String)
        Dim strBeschreibung As String
        Dim strFehler As String
        Dim strInfo As String
        Dim strAnwendungsname As String
        Dim strVersion As String
        strFehler = Err.Description
        strAnwendungsname = "<Anwendungsname>"
        strVersion = "<Anwendungsversion>"
        strInfo = strInfo & "Anwendung: " & strAnwendungsname & ";" & vbCrLf
        strInfo = strInfo & "Version: " & strVersion & ";" & vbCrLf
        strInfo = strInfo & "Datum: " & Now & ";" & vbCrLf
        strInfo = strInfo & "Datenbankpfad: " & CurrentDb.Name & ";" & vbCrLf
        strInfo = strInfo & "Modul: " & strModul & ";" & vbCrLf
        strInfo = strInfo & "Routine: " & strRoutine & ";" & vbCrLf
        strInfo = strInfo & "Benutzer: " & CurrentUser() & ";" & vbCrLf
        strInfo = strInfo & "Fehlernummer: " & Err.Number & ";" & vbCrLf
        strInfo = strInfo & "Fehlerbeschreibung: " & Err.Description & ";" & vbCrLf
        strInfo = strInfo & "Zeile: " & lngZeile & ";" & vbCrLf
        strInfo = strInfo & "Bemerkungen: " & strBemerkungen & ";" & vbCrLf
        DoCmd.OpenForm "frmFehlerbehandlung", WindowMode:=acDialog, OpenArgs:=strInfo
    End Sub

    Quellcode 4

  • <E-Mail Empfänger>: E-Mail-Adresse, von der Sie die Fehlermeldungen abholen möchten
  • <Name Absender>: Name des Absenders (beliebig)
  • <SMTPServer>: Adresse des SMTP-Servers
  • Anwendungsdaten anpassen

    Damit die E-Mail mit der Fehlermeldung Informationen über die Anwendung und ihre Version enthält, ändern Sie zwei Zeilen in der Prozedur Fehlerbehandlung im Modul mdlError. Die zu ändernden Zeilen sind in Quellcode 4 fett gedruckt.

    Anstoßen der Fehlerbehandlung

    Nun müssen Sie nur noch einen Fehler provozieren, um die Funktionalität zu testen. Im Beispielformular Lieferanten können Sie das folgendermaßen tun: Legen Sie einen neuen leeren Datensatz an. Klicken Sie dann auf die Schaltfläche Artikel hinzufügen. Wenn nun die Meldung aus Bild 7 erscheint, haben Sie alles richtig gemacht.

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar