MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access - Code Archiv
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 03.08.2018, 15:56   #1
ebs17
MOF Guru
MOF Guru
Standard Info - Zugriff auf Tabellen effektiv debuggen

In Newslettern von SmartTools Access Weekly fand ich folgende Informationen, die ich einfach weitergebe:

Wenn Sie in Ihren Datenbanken VBA-Routinen mit Zugriff auf Tabellen entwickeln, treten regelmäßig Fehler mit kryptischen Fehlernummern und wenig hilfreichen Hinweistexten auf. Lesen Sie in diesem Tipp, wie Sie in diesen Fällen dem Fehler schneller auf die Schliche kommen können.

In der Regel verwenden Sie für eine Fehlerbehandlung in VBA-Routinen mit Zugriff auf Tabellen eine Konstruktion wie die folgende:
Code:

On Error Resume Next
.....
Set db = CurrentDb()
Set rs = db.OpenRecordset( _
         "SELECT * FROM VerknüpfteTabelle")
If Err <> 0 Then
  MsgBox "Fehler: " & CStr(Err.Number) & _
         ", " & Err.Description
  Exit Sub
End If
.....
Über das Error-Objekt erhalten Sie in solchen Fällen lediglich einen Hinweis der Art "Access konnte die Tabelle oder Abfrage 'XYZ' nicht finden...". Damit kennen Sie aber beispielsweise bei einer ODBC-Verbindung die genaue Ursache noch nicht: Ist der Server mit dem Backend nicht erreichbar? Wurde die richtige Tabelle adressiert? Gab es technische Probleme beim Zugriff auf die Tabelle? Wurde der Zugriff auf die Tabelle aufgrund fehlender Rechte verweigert? Sie müssen also herausfinden, ob das Problem in Ihrem VBA-Code, in ADO/DAO oder in einer unter ADO/DAO liegenden Schicht wie der Jet- oder der Database Engine, dem ODBC-Treiber oder der SQL Server-Authentifizierung liegt. Während sich Probleme im Code, beispielsweise Tippfehler im Namen einer Tabelle oder Objektvariablen vom falschen Datentyp, noch einigermaßen schnell lokalisieren lassen, sind Sie bei Problemen in tiefer liegenden Schichten anscheinend auf sich alleine gestellt.

Wenig bekannt ist die Tatsache, dass Access auch hier Hilfsmittel zur Lokalisierung von Fehlern bereitstellt: Das Error-Objekt ist lediglich das letzte Glied einer Reihe von Hinweisen und gibt Auskunft darüber, warum Access eine Operation schließlich als gescheitert betrachtet hat. Fehler, die auf dem Weg zu den Daten aufgetreten sind, zeigt Access nicht an - andernfalls könnte es zum Beispiel bei einer ODBC-Verbindung durchaus passieren, dass ein halbes Dutzend mehr oder weniger kryptischer Fehlermeldungen beispielsweise von der Jet Engine, dem ODBC-Treiber oder der SQL Server-Authentifizierung zu bestätigen wären, bis schließlich der lapidare Hinweis "Access konnte die Tabelle oder Abfrage 'XYZ' nicht finden..." ausgegeben wird.

Die in unteren Schichten auftretenden Fehler ignoriert Access jedoch nicht einfach, sondern es zeigt sie lediglich nicht an. Festgehalten werden die Fehler in einer Auflistung "Errors" des Objektes "DBEngine" (DAO) oder "Connection" (ADO). Dabei geht Access so vor, dass für jeden Fehler ein Error-Objekt in die Auflistung "Errors" aufgenommen wird. Das letzte Error-Objekt ist Basis des Access-Laufzeitfehlers, die davor liegenden Error-Objekte beinhalten Informationen beispielsweise der Jet-Engine, des ODBC-Treibers oder einer SQL-Komponente und zwar in der Reihenfolge, in der sie für den jeweiligen Datenzugriff angesprochen werden.

Teil 1: DAO
Die folgende Prozedur hilft Ihnen, diese Fehlerhistorie im Falle eines Fehlers beispielsweise mit einer ODBC-Verbindung übersichtlich auszugeben. Kopieren Sie sie zunächst in ein neues oder vorhandenes Modul Ihres VBA-Projektes und richten Sie einen Verweis auf "Microsoft DAO 3.6 Object Library" ein:
Code:

Sub ListErrors(blnMsg As Boolean)
  Dim objErr As Error
  Dim strDebug As String
  Dim strMsg As String

  On Error Resume Next
  If DBEngine.Errors.Count = 0 Then
    Debug.Print "Keine Fehler protokolliert..."
  Else
    For Each objErr In DBEngine.Errors
      With objErr
        strDebug = "Fehler: " & _
                   CStr(.Number) & vbCrLf & _
                   "Ursache: " & _
                   .Description & vbCrLf & _
                   "Quelle: " & _
                   .Source & vbCrLf
        strMsg = strDebug & strMsg
      End With
      Debug.Print strDebug
    Next objErr
    If blnMsg Then MsgBox strMsg
  End If

End Sub
Die Prozedur schreibt die Fehlerhistorie in das Direktfenster der VBA-Entwicklungsumgebung und zeigt sie wahlweise abschließend über "MsgBox" als Zusammenfassung an. Ausgegeben werden jeweils die Fehlernummer (nützlich zum Beispiel für eine Google-Suche), die Klartextmeldung der jeweiligen Komponente sowie die Bezeichnung der Quelle, die den Fehler gemeldet hat (zum Beispiel "DAO.Database" oder der Name einer DLL). In Ihrer Datenbank setzen Sie "ListErrors" dann zum Beispiel so ein:
Code:

On Error Resume Next
.....
Set db = CurrentDb()
Set rs = db.OpenRecordset( _
         "SELECT * FROM VerknüpfteTabelle")
If Err <> 0 Then
  ListErrors True
  Exit Sub
End If
.....
Mit dem Parameter "blnMsg" steuern Sie, ob "ListErrors" eine Zusammenfassung per "MsgBox" anzeigen soll (= True) oder nicht (= False) und die Informationen somit nur im Direktbereich ausgegeben werden.

Teil 2: ADO

Die folgende Prozedur hilft Ihnen nun, diese Fehlerhistorie bei Datenzugriffen per ADO übersichtlich auszugeben. Kopieren Sie sie zunächst in ein neues oder vorhandenes Modul Ihres VBA-Projektes und richten Sie einen Verweis auf mindestens "Microsoft ActiveX Data Objects 2.8 Library" ein:

Code:

Sub ListErrors(blnMsg As Boolean)
  Dim objErr As Error
  Dim strDebug As String
  Dim strMsg As String

  On Error Resume Next
  If CurrentProject.Connection.Errors.Count = 0 Then
    Debug.Print "Keine Fehler protokolliert..."
  Else
    For Each objErr In CurrentProject.Connection.Errors
      With objErr
        strDebug = "Fehler: " & _
                   CStr(.Number) & vbCrLf & _
                   "Ursache: " & _
                   .Description & vbCrLf & _
                   "Quelle: " & _
                   .Source & vbCrLf
        strMsg = strDebug & strMsg
      End With
      Debug.Print strDebug
    Next objErr
    If blnMsg Then MsgBox strMsg
  End If

End Sub
Die Prozedur arbeitet im Großen und Ganzen wie "ListErrors" für DAO, mit dem Unterschied, dass die "Errors"-Auflistung hier statt an "DBEngine" an "CurrentProject.Connection" gebunden ist. Sie schreibt die Fehlerhistorie in das Direktfenster der VBA-Entwicklungsumgebung und zeigt sie wahlweise abschließend über "MsgBox" als Zusammenfassung an. Ausgegeben werden jeweils die Fehlernummer, die Klartextmeldung der jeweiligen Komponente sowie die Bezeichnung der Quelle, die den Fehler gemeldet hat. In Ihrer Datenbank setzen Sie "ListErrors" dann beispielsweise folgendermaßen ein:
Code:

On Error Resume Next
.....
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM VerknüpfteTabelle", _
        CurrentProject.AccessConnection
If Err <> 0 Then
  ListErrors True
  Exit Sub
End If
.....
Mit dem Parameter "blnMsg" steuern Sie wieder, ob "ListErrors" eine Zusammenfassung per "MsgBox" anzeigen soll (= True) oder nicht (= False) und die Informationen somit nur im Direktbereich ausgegeben werden.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}:{10}:{11}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.12.2018, 13:02   #2
stunsailteenytiny
Neuer Benutzer
Neuer Benutzer
Standard

Ich habe diese Funktion in eine Chemikalienverwaltungs-DB eingebaut. Funktioniert seit einem Jahr perfekt! Barcodes werden auf Etiketten für Chemikalienflaschen ausgedruckt, die mit einem Brother-P-Touch-Etikettendrucker gedruckt werden.
flyer template
stunsailteenytiny ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.