PDA

Vollständige Version anzeigen : fehlermeldungen abfangen


wagner-laessig
05.07.2001, 11:52
hallo, ihr da draußen

irgendwie trete ich im moment auf der stelle, obwohl die aufgabe mir gar nicht so schwierig zu sein scheint.
ich möchte bei bestimmten fehlermeldungen von access (z.B. laufzeitfehler 3022) diese gegen eine dem formular angepasste msgbox ersetzen (natürlich nicht alle, sondern nur ein paar!).
habe im moment ein wenig ein brett vor dem kopf, wer kann mir helfen, dieses brett zu entfernen?

Kurt aus Kienitz
05.07.2001, 11:58
Hallo

Sieh Dir mal folgende Funktion an.
Dort wird zwar nicht der Fehler 3022 abgefangen, aber das sollte kein Problem sein.

Function IfTabExists(TabName As String) As Boolean
'
' Prüfen, ob eine Tabelle existiert.
'
' Dazu wird versucht die Tabellendefinition der
' gesuchten Tabelle zu öffnen.
' Wenn die gesuchte Tabelle vorhanden ist, klappt
' dies ohne Probleme.
' Wenn die gesuchte Tabelle nicht vorhanden ist,
' wird der Laufzeitfehler 3265 ausgelöst, welcher
' im Errorhandling abgefangen wird.
'
Dim db As Database
Dim tds As TableDefs
Dim td As TableDef

IfTabExists = True

On Error GoTo IfTabExists_Err
Set db = Application.CurrentDb
Set tds = db.TableDefs
Set td = tds(TabName)

Exit Function
IfTabExists_Err:

IfTabExists = False
If Err.Number <> 3265 Then
Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End If

End Function

HTH

A.S.
05.07.2001, 12:11
Hallo, Du da vor dem Monitor :D

wieder einmal etwas mit einigen Möglichkeiten:

Möglichkeit 1 Abfangen an zentraler Stelle innerhalb der jeweiligen Ereignisprozedur:

Dazu definierst Du am Ende der Ereignisprozedur zwei Sprungziele (NameDerProzedur_Exit: und NameDerProzedur_Error: ). Zu Beginn der Ereignisprozedur setzt Du ein "On Error Goto" auf das zweite Sprungziel.

Inhalt des ersten Sprungziels ggf. Schließen noch geöffneter Objekte und verlassen der Prozedur mit Exit Sub bzw. Function.

Im zweiten Sprungziel prüfst Du über "Select Case Err.Number" die Fehlercodes die Du abfangen willst. Tritt ein sonstiger Fehlercode auf, entsprechend per Dialog melden.

Nach Behandlung der Fehler kehrst Du entweder mit "Resume Next" zu der Stelle zurück wo der Fehler ausgelöst wurde oder gehst mit "Resume NameDerProzedur_Exit" an den Endpunkt der Prozedur.

Nachteil: IMHO ist es fraglich ob Du immer korrekt auf den jeweiligen Fehler reagierst. Es ist schwer zu erkennen, wo der Fehler ausgelöst wurde. Gerade wenn mehrere Gleichartige Objekte in einer Prozedur behandelt werden.

Möglichkeit 2 (die ich in der Regel verwende):

Abschalten der Laufzeitfehler mit

On Error Resume Next

und Behandlung der Laufzeitfehler an den Stellen wo er aufgefallen ist.

Um ersteinmal die entsprechenden Fehlerstellen zu ermitteln, versuche ich bei meinen Tests so viele Fehlerquellen wie möglich zu eruieren (Nein, die vor dem Monitor lässt sich immer noch nicht abschalten :D ) und durchzutesten.

Die dritte Möglichkeit - und in einigen Fällen die einzige - ist das "Bei Fehler"-Ereignis des Formulares / Berichtes.

Am besten währe, wenn ich mir meine Vorgehensweise mal so ansehe, aber im Nachhinein eine Kombination von 1 und 2. So kannst Du spezifische Fehler abfangen und allgemeine Fehler, welche Du noch nicht codiert abgefangen hast, melden.

Gruß

Arno

PS Diesmal warst Du schneller, Kurt ;)
[Dieser Beitrag wurde von ArnoSimon am 05.07.2001 editiert.]

wagner-laessig
05.07.2001, 12:19
hallo, ihr zwei
super, so schnell hatte ich mit reaktion nicht gerechnet. die lösung von kurt funzt hervorragend. ich habe keine ahnung, warum mir das nicht eingefallen ist. muß wohl am wetter liegen, viel zu schön für diese klimatisierte kiste in der ich hocke.
vielen dank noch einmal

marcus (hatte ich vorhin vergessen, sorry!)

gloria
05.07.2001, 12:20
hi,
Beitrag von Arno Simon sagt alles. Ich biete noch Select Case an, Bsp:

Private Sub Befehl19_Click()
On Error GoTo Err_Befehl19_Click
Dim Suchtext As String

Suchtext = Me![Eingabe]
If IsNull(Eingabe) = True Then
Beep
MsgBox "Es ist KEIN Suchtext vorhanden .....", 48, "** Fehler: Bezeichnung suchen **"
Else
Me![BEZEICHNUNG_1].SetFocus
DoCmd.FindRecord Suchtext, A_START, False, A_DOWN, False, A_CURRENT, False
End If

Ende_Befehl19_Click:
Exit Sub

Err_Befehl19_Click:
Select Case Err
Case 94
MsgBox "Es ist KEIN Suchtext vorhanden .....", 48, "** Fehler 94: Artikel suchen **"
Err = 0
DoCmd.GoToRecord , , A_FIRST
Resume Ende_Befehl19_Click
Case Else
MsgBox "FehlerCode: " & Str(Err) & " ist aufgetreten, bitte notieren", 16, "** Fehler: Suchen **"
Err = 0
Resume Ende_Befehl19_Click
End Select

ciao glori

wagner-laessig
05.07.2001, 12:21
ach so, arno!

deine idee werde ich, sobald ich etwas mehr zeit dazu haben werde, auch einmal ausprobieren, nur im moment reicht mir die lösung von kurt voll und ganz.
wollte dich nur nicht übergehen, dank auch dir

marcus

A.S.
05.07.2001, 12:58
Hallo Marcus,

so empfindlich bin ich nicht ;) Außerdem hast Du mich ja oben (Hallo ihr zwei...) erwähnt, von daher nehme ich das nicht tragisch :)

Wenn ich dagegen sehe, bei wie vielen Anfragen sogar die Erfolgsmeldung ausbleibt und man somit nicht sieht ob der Hilfesuchende noch Problemchens hat ist das eh halb so wild ;) Hauptsache Du hast eine Lösung die auf Dein Problem passt ;)

Gruß

Arno

wagner-laessig
05.07.2001, 13:01
siehste arno,
wenn ich nicht noch einmal reingesehen hätte, dann wäre mir der tipp von glori mit case/select noch entgangen.

ciaou et cu

marcus