Fehlermeldung Objectvariable oder With-Blockvariable nicht fetgelegt
Hallo Gemeinde,
ich habe eine Sub geschrieben, die nach buttonklick einen Artikel als an den Hardware-Vendor zurückgegeben, in meiner Access-Datenbank markiert. Hierzu wird zunächst die eingegebene S/N in der Tabelle Artikel gesucht. Bei Erfolg prüfe ich ob dem Artikel eine UUID zugeordnet ist oder nicht. Wenn ja, dann ist es ein Computer, der via RESTAPI im Verwaltungssystem gelöscht wird. Wenn nein, ist es eben kein Computer(= keine Löschung im Verwaltunssystem). Jetzt zum Prob:
Wird ein Computer erkannt, wird dieser in meiner Access-Db als zurückgegeben markiert, der Rechner im Verwaltungssystem gelöscht und der Vorgang in der Tabelle Protokoll eingetragen. Am Schluss erscheint dann und das treibt mich in den Wahnsinn, quasi als MsgBox, die im Betreff genannte Fehlermeldung. Der Fehler hängt scheinbar mit der Variablen rs zusammen, denn positioniere ich die Zeilen rs.Close, Set rs = Nothing und Set db = Nothing an andere Stellen ändert sich die Meldung in, z.B. kein aktueller Datensatz. Irrwitziger Weise oder Gott sei Dank werden aber alle Einträge richtig ausgeführt. D.h. das Rechnerobjekt wird im Verwaltungssystem gelöscht, der Rückgabe-Eintrag wird korrekt gemacht und auch die Protokollierung erfolgt.
Könnte mir jemand erklären wie ich die Meldung weg bekomme, bzw. woher sie kommt?
Eine falsch deklarierte (Objekt.-)Variable kann ich jedenfalls nicht finden...
ich habe eine Sub geschrieben, die nach buttonklick einen Artikel als an den Hardware-Vendor zurückgegeben, in meiner Access-Datenbank markiert. Hierzu wird zunächst die eingegebene S/N in der Tabelle Artikel gesucht. Bei Erfolg prüfe ich ob dem Artikel eine UUID zugeordnet ist oder nicht. Wenn ja, dann ist es ein Computer, der via RESTAPI im Verwaltungssystem gelöscht wird. Wenn nein, ist es eben kein Computer(= keine Löschung im Verwaltunssystem). Jetzt zum Prob:
Wird ein Computer erkannt, wird dieser in meiner Access-Db als zurückgegeben markiert, der Rechner im Verwaltungssystem gelöscht und der Vorgang in der Tabelle Protokoll eingetragen. Am Schluss erscheint dann und das treibt mich in den Wahnsinn, quasi als MsgBox, die im Betreff genannte Fehlermeldung. Der Fehler hängt scheinbar mit der Variablen rs zusammen, denn positioniere ich die Zeilen rs.Close, Set rs = Nothing und Set db = Nothing an andere Stellen ändert sich die Meldung in, z.B. kein aktueller Datensatz. Irrwitziger Weise oder Gott sei Dank werden aber alle Einträge richtig ausgeführt. D.h. das Rechnerobjekt wird im Verwaltungssystem gelöscht, der Rückgabe-Eintrag wird korrekt gemacht und auch die Protokollierung erfolgt.
Könnte mir jemand erklären wie ich die Meldung weg bekomme, bzw. woher sie kommt?
Eine falsch deklarierte (Objekt.-)Variable kann ich jedenfalls nicht finden...
Private Sub rueckgabebutton_Click()
On Error GoTo Err_rueckgabebutton_Click
Dim stDocName As String
Dim stLinkCriteria As String
Dim Code As String
Dim sn As String
Dim Tarray() As String
Dim midWords As String
Dim objRequest As Object
Dim strUrl As String
Dim strResponse As String
Dim Comp, jujueidi, user, Link, Serialn, sAccount, sDatum, var As String
Dim Msg, Style, Title, help, Ctxt, Response, MyString
Dim sbody As String
Dim result() As String
Dim db As DAO.Database
Dim rs As DAO.Recordset
sAccount = GetUserName
sDatum = GetLoginDate
user = "HW-DB"
Link = BLAURL ' Link zur RESTAPI aus Modul2
varwert = " "
Code = Me!QRCodeEingabe ' Eingabebeispiel: S/N: 12345678
Set db = CurrentDb
jujueidi = Null
Tarray() = Split(Code, vbCrLf)
For i = LBound(Tarray, 1) To UBound(Tarray, 1)
If InStr(1, Tarray(i), "S/N:", vbTextCompare) > 0 Then
sn = Tarray(i)
sn = CStr(sn)
Exit For
End If
Next i
midWords = Mid(sn, 6) ' Kürzel S/N: wird abgeschnitten; Seriennummer bleibt übrig
varwert = midWords
snumr = Nz(DLookup("[Seriennummer]", "Artikel", "[Seriennummer]=" & "'" & varwert & "'"), "") ' Pürfung ob Seriennummer in Tabelle Artikel vorhanden
If snumr = "" Then
MsgBox ("Die Seriennummer konnte nicht gefunden werden!" & vbCrLf & "Gerät ist nicht in der Datenbank!")
Exit Sub
Else
Set rs = db.OpenRecordset("Artikel")
rs.MoveFirst
Do Until rs.EOF
rs.Edit
rs.Update
If rs!Seriennummer = varwert Then 'wenn S/N gefunden in Tabelle, wird UUID ausgelesen
jujueidi = rs![UUID]
If jujueidi Like "????????-????-????-????-????????????" Then
Msg = "Der Artikel ist ein Computer!" & vbCrLf & "Beim Fortfahren wird der Rechner im System gelöscht!" & vbCrLf & vbCrLf & " ...Fortfahren?"
Style = vbYesNo + vbCritical + vbDefaultButton1 ' Define buttons.
Title = "WARNING!!!!" ' Define title.
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then ' User chose Yes.
DoCmd.Hourglass True
Set db = CurrentDb
rs.MoveFirst
Do Until rs.EOF
If rs!Seriennummer = varwert Then
rs.Edit
rs![Kunden-Nr] = Null
rs![Leihgerät] = False
rs![Dauerleihgabe] = False
rs![Rückgeliefert am] = Date
rs![Ausleihdatum] = Null
rs![Standort] = "Zurückgeliefert"
rs.Update
jujueidi = rs![UUID]
Comp = rs![Rechnername]
End If
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set db = Nothing
Sleep 2000 ' funktioniert nur i.V. mit Modul3
DoCmd.SetWarnings False
DoCmd.Hourglass False
' Eintrag Rechner löschen via RESTAPI
sbody = "{" & vbCrLf & """Username"": " & """" & user & """" & "," & vbCrLf & """AppReference"": """"," & vbCrLf & """AppTag"": {}" & vbCrLf & "}"
Set objRequest = CreateObject("MSXML2.XMLHTTP")
strUrl = Link & Comp
blnAsync = True
With objRequest
.Open "Delete", strUrl, blnAsync
.SetRequestHeader "Content-Type", "application/json"
.SetRequestHeader "Accept", "application/json"
.Send sbody
'spin wheels whilst waiting for response
While objRequest.ReadyState <> 4
DoEvents
Wend
strResponse = .ResponseText
End With
result() = Split(strResponse, ",")
MsgBox (result(3) & vbCrLf & vbCrLf & "Rechner erfoglreich gelöscht/dekommisioniert!")
' Löscheintrag wird in die Tabelle Protokoll geschrieben
With CurrentDb().OpenRecordset("Protokoll", dbOpenDynaset, dbAppendOnly)
.AddNew
!LastUpdateUser = sAccount
!LastUpdateDate = sDatum
!AutoCreateRechner = "Computer " & Comp & ", " & Serialn & ", " & jujueidi & " im System deleted."
.Update
End With
Me!QRCodeEingabe = ""
Else ' User chose No.
Msg = "Abbruch durch User!!!" 'Define message.
Style = vbOKOnly + vbCritical + vbDefaultButton1 ' Define buttons.
Title = "CANCEL!!!!" ' Define title.
Response = MsgBox(Msg, Style, Title)
If Response = vbOK Then
Me!QRCodeEingabe = ""
Exit Sub
End If
End If
Else
Msg = "Der Artikel ist kein Computer, da keine UUID angegeben ist!" & vbCrLf & " Ein Löschvorgang im System wird nicht ausgeführt" & vbCrLf & vbCrLf & " Die Rückgabe wird eingetragen." & vbCrLf & vbCrLf
Style = vbYesNo + vbCritical + vbDefaultButton1 ' Define buttons.
Title = "WARNING!!!!" ' Define title.
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then ' User chose Yes.
DoCmd.SetWarnings False
DoCmd.Hourglass True
Set db = CurrentDb
'strSQL = "SELECT * FROM Artikel WHERE Seriennummer IS " & """ & varwert & """
Set rs = db.OpenRecordset("Artikel")
rs.MoveFirst
Do Until rs.EOF
If rs!Seriennummer = varwert Then
rs.Edit
rs![Kunden-Nr] = Null
rs![Leihgerät] = False
rs![Dauerleihgabe] = False
rs![Rückgeliefert am] = Date
rs![Ausleihdatum] = Null
rs![Standort] = "Zurückgeliefert"
rs.Update
jujueidi = rs![UUID]
Comp = rs![Rechnername]
End If
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set db = Nothing
Sleep 2000 ' funktioniert nur i.V. mit Modul3
DoCmd.SetWarnings False
DoCmd.Hourglass False
Me!QRCodeEingabe = ""
Exit Sub
End If
End If
End If
rs.MoveNext
Loop
End If
Exit_rueckgabebutton_Click:
Exit Sub
Err_rueckgabebutton_Click:
MsgBox Err.Description
Resume Exit_rueckgabebutton_Click
End Sub
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6819733177
Url: https://administrator.de/contentid/6819733177
Ausgedruckt am: 22.11.2024 um 07:11 Uhr
6 Kommentare
Neuester Kommentar
Nur mal schnell überflogen.
Du verwendest zweimal die selbe Variable rs verschachtelt im Loop und im inneren überschreibst und schließt du das Recordset somit ist das äußere Recordset automatisch bereits geschlossen und existiert nicht mehr du kannst also kein rs.Movenext damit mehr ausführen...
Cheers briggs
Du verwendest zweimal die selbe Variable rs verschachtelt im Loop und im inneren überschreibst und schließt du das Recordset somit ist das äußere Recordset automatisch bereits geschlossen und existiert nicht mehr du kannst also kein rs.Movenext damit mehr ausführen...
Set rs = Nothing
rs.MoveNext
Verwende also gleich eindeutige Recordset Variablen dann passiert sowas auch nicht. p.s. mit F8 durch den Code debuggen hilft .rs.MoveNext
Cheers briggs
Zitat von @hipfzwirgel:
Eine Frage noch zum debuggen: Bei meinem Access passiert nichts wenn ich im Code-Editor an eine bliebige Stelle klicke und die Taste F8 drücke. Mache ich da was falsch?
Setze Breakpoints in der entsprechenden Zeile mit F9 und lass den Code mit F5 laufen, dann läuft er bis zum Breakpoint und hält dort an. Mit F8 führt man den Code dann jeweils um eine Anweisung weiter aus, sind keine Breakpoints gesetzt wird von Anfang der Sub/Funktion debuggt.Eine Frage noch zum debuggen: Bei meinem Access passiert nichts wenn ich im Code-Editor an eine bliebige Stelle klicke und die Taste F8 drücke. Mache ich da was falsch?
Debugging VBA Code (ist bei allen Office Apps gleich)