2016-12-11 3 views
0

Ich bin in Access 2007 nach einem Zeitraum entwickelt andere Dinge zu tun und versuche, Nachrichten an den Benutzer einzufangen. Eine Funktion in einem Formular ändert eine Zeile in einer Tabelle. Die entsprechenden Bits des Codes sindTrap-Zugriff VBA-Nachrichten

On Error GoTo PROC_ERR 
... 
DoCmd.RunSQL szSQL 
... 
PROC_ERR: 
    MsgBox "Error: (" & Err.Number & ") " & Err.Description, vbCritical 

Die SQL-Anweisung ist richtig und er System erscheint mit einem „Du bist ca. 1 Zeile aktualisieren ...“ Nachricht (Nummer 10505). Ich möchte dies abfangen und durch meine eigene Warnmeldung ersetzen. Meine Funktion enthält jedoch keinen Fehler für diese Nachricht. Dies trifft auch nicht auf die Meldung zu, die angezeigt wird, wenn der Benutzer auf "Nein" klickt: "Laufzeitfehler 2501. Die RunSQL-Aktion wurde abgebrochen."

In VBA-Optionen habe ich im Moment Fehler-Trapping gesetzt, um "bei allen Fehlern zu brechen".

Was fehlt mir hier? Ist es mir nicht gelungen, eine andere Option in Access festzulegen?

Antwort

0

Diese Nachricht ist kein Fehler.

können Sie schweigt es mit

DoCmd.SetWarnings False 

Denken Sie daran, sie wieder einzustellen auf.

+0

Fair genug. Aber ich nahm an, dass die Nachricht in der Standardliste der MS Access-Fehlermeldungen so auftrat, als wäre sie ein Fehler. Was ist mit dem anderen Fehler (2501)? Sollte das nicht gefangen sein? –

+0

Ja, leicht - aber Sie können auch "DoCmd.RunSQL" durch "CurrentDb.Execute" ersetzen, um dies im Handumdrehen zu erhalten. – Gustav

+0

Danke, dass Sie auf die alternative Funktion hingewiesen haben. Es funktioniert gut ohne die aufdringlichen Nachrichten. Aber ich habe es gerade mit einer Löschabfrage versucht, die wegen eines Beziehungsproblems fehlschlägt; Es wird ein 3200 Fehler "Datensatz kann nicht gelöscht oder geändert werden" ausgelöst. Wie der Fehler 2501 wird dies nicht von meinem Fehlerhandler abgefangen. Entschuldigen Sie, dass ich Sie weiter bedrängt habe, aber ich verstehe die Fehlerbehandlung als falsch. –

1

Ich würde empfehlen, nicht RunSQL zu verwenden. Es erfordert DoCmd.SetWarnings False, was weitere Warnungen beeinflussen kann, falls es nicht nach DoCmd.SetWarnings True folgt, zum Beispiel nach einem Fehler. Außerdem können Sie die Anzahl der betroffenen Zeilen nicht lesen. Verwenden

db.Execute szSQL, dbFailOnError 

statt, wird es zu stoppen Fehler erlauben und Datenbankstatus nach der Ausführung der Abfrage analysieren. Ohne dbFailOnError werden keine Optionsfehler ausgelöst.

+0

Ja, ich bin froh, von db.Execute erfahren zu haben. Aber meine Funktion ist immer noch nicht Trapping Fehler wie der 3200 man "Datensatz kann nicht gelöscht oder geändert werden". Jede Hilfe dabei würde mich davon abhalten, frustriert meine Haare zu zerreißen. Wenn Sie den vollständigen Code der Funktion benötigen, anstatt das Snippet, das ich vorher gepostet habe, kann ich es liefern. –

+0

Etwas stimmt nicht mit Ihrem Code. Bitte geben Sie es an. Informationen zum Ersetzen von Nachrichten wie 10505 - verwenden Sie einfach Ihre eigene Message-Box vor dem Ausführen der SQL –