hipfzwirgel
Goto Top

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...


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

Content-ID: 6819733177

Url: https://administrator.de/contentid/6819733177

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

6247018886
6247018886 18.04.2023 aktualisiert um 12:50:09 Uhr
Goto Top
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...
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 face-wink.

Cheers briggs
SlainteMhath
SlainteMhath 18.04.2023 um 12:48:54 Uhr
Goto Top
Moin,

und noch ein Pro-Tipp für's debuggen:

Kommentier die Zeile 2 aus, dann bleibt dein Code in der Zeile stehen in der das Problem auftritt. Oder Du setzt einen Breakpoint und Steppst dann mit F5 / Shift-F5 durch deinen Code bis der Fehler autritt.

lg,
Slainte
hipfzwirgel
Lösung hipfzwirgel 18.04.2023 um 13:54:39 Uhr
Goto Top
Hallo Briggs und Slainte,

vielen lieben Dank für eure Hilfe. Ich habe die rs-Variable entsprechend umbenannt(rs1, rs2 und rs3) und nun geht alles ohne Meldung. Einfach super!!!!!! Ich sah den Wald wohl vor Lauter Bäume nicht...

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?
6247018886
6247018886 18.04.2023 aktualisiert um 14:16:07 Uhr
Goto Top
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.

screenshot

Debugging VBA Code (ist bei allen Office Apps gleich)
hipfzwirgel
hipfzwirgel 18.04.2023 um 15:06:47 Uhr
Goto Top
Hallo Briggs,

jetzt brauche ich aber dringend Hilfe:

irgendwie hat sich beim Debugging-testen da etwas verspult. Bei meiner Form Hauptmenü fehlen die Zuordnungen der VBA-Subs zu den Buttons. D.h. Beim Klick auf irgend einen Button passiert nichts. Die Subs sind im Editor zwar noch da aber wenn ich die Form Hauptmenü im Editor öffne wird nur der Code der Sub rueckgabebutton angezeigt. Alle anderen Buttons haben kein Ereignis mehr. Hast du eine Idee?
hipfzwirgel
hipfzwirgel 18.04.2023 um 15:17:42 Uhr
Goto Top
Hallo Briggs,

hat sich erledigt. Tatsächlich war der komplette Code bis auf Rueckgabebutton weg. hab ihn aus Sicherungskopie wieder hergestellt. Puuuhhh, was ein Glück. Fall Komplett gelöst...