Codeblock wird nicht ausgeführt
by Dubidu
Hi an alle!
Ich habe momentan das Problem, dass bei mir eine Funktion bzw. die ForAll-Schleife nicht ausgeführt wird, alles vor der Schleife jedoch schon!
Global initialisiert:
Public computerWorkerList List As workerComputer ' Used by function generateWorkerComputer
Property Get compareWorker(newWorker As String) As Boolean
Print "Hallo Welt!" ' Wird ausgeführt!!!
Forall worker In computerWorkerList
Print "Hello World!" ' Wird nicht ausgeführt!
If worker.GetWorker = newWorker$ Then
msg$ = "Mitarbeiter " & newWorker$ & " wurde schon einem Computer zugeordnet"
Messagebox msg$
compareWorker = False
Else
compareWorker = True
End If
End Forall
End Property
Es gibt zwei seltsame Verhaltensweisen:
- Das erste "Hallo Welt" wird ausgegeben. Das in der Schleife jedoch nicht!
- Wenn ich den Inhalt der Get-Funktion in die Funktion kopiere, in der sie aufgerufen wird, wird der vollständige Code ausgeführt!
Hier die Funktion, die die Get-Funktion oben aufruft:
Sub generateWorkerComputer
newWorker$ = Inputbox$("Bitte Mitarbeiter eingeben")
If (compareWorker(newWorker$)) = False Then ' Controlls if worker is already stored
Exit Sub
End If
...
...
End Sub
Liebe Grüße
Dubidu :)
Den Fehler habe ich nun gefunden.
Wenn die Liste computerWorkerList leer ist, dann springt der Interpreter erst gar nicht in die Forall-Schleife rein.
In der Forall-Schleife habe ich jedoch compareWorker auf True initialisiert, falls der Mitarbeiter nicht schon angelegt angelegt wurde. Da der Interpreter jedoch nicht in die Schleife reinspringt, wird die Variable niemals auf true gesetzt und so muss ich sicherstellen, dass ich vorher die Variable auf true setze und später in der Schleife ggf. wieder auf false, wenn der Mitarbeiter schon existiert;
Property Get compareWorker(newWorker As String) As Boolean
compareWorker = True
Forall worker In computerWorkerList
If worker.GetWorker = newWorker$ Then
msg$ = "Mitarbeiter " & newWorker$ & " wurde schon einem Computer zugeordnet"
Messagebox msg$
compareWorker = False
'Else
' compareWorker = True
End If
End Forall
End Property
Liebe Grüße
Giordano
Ich habe nun leider ein neues Problem.
In meinem Programm habe ich die Option gespeicherte Mitarbeiter wieder zu löschen:
Sub deleteWorkerComputer(deleteWorker As String)
Dim msg As String
Forall worker In computerWorkerList
If worker.GetWorker = deleteWorker Then
Delete computerWorkerList(deleteWorker)
msg = "Mitarbeiter " & deleteWorker & " wurde aus der Datenbank gelöscht"
Messagebox msg
End If
End Forall
End Sub
computerWorkerList ist eine Liste mit eigenen erstellten Objekten namens "workerComputer". In der Liste sind also bei mehreren Mitarbeitern, entsprechend mehrere Instanzen von workerComputer angelegt.
Wenn ich nun einen Mitarbeiter lösche und danach einen neuen hinzufügen möchte, kommt die Fehlermeldung "Object variable not set". Für mich ist das nicht nachvollziehbar, da ich ja nicht die ganze Liste gelöscht habe, sondern nur ein Objekt in der Liste, oder sehe ich da etwas falsch?
Hier der Code wie ein Objekt (workerComputer) in die Liste eingefügt wird:
Dim newWorker As String
Dim newNumb As String
Dim newCompRef As String
...
' Code zum Einlesen der Daten
...
Dim workerRef As New workerComputer(newWorker, newNumb, newCompRef)
Set computerWorkerList(newWorker) = workerRef
Ich hoffe, ihr könnt mir weiterhelfen, da ich erst seit einer knappen Woche in LotusScript programmiere.
Danke, im Voraus für eure Hilfe!
Liebe Grüße
Giordano
Hi MadMetzger,
Nur die Fehlermeldung alleine reicht nicht aus. An was für einer Stelle kommt die Meldung denn?
nach dem ich einen Mitarbeiter gelöscht habe und dann einen neuen anlege und die Methode workerExists aufgerufen wird bzw. eine äquivalente Methode, die nach vorhandener Nummer oder Computernamen prüft.
Property Get workerExists(newWorker As String) As Boolean
Dim msg As String
workerExists = False ' You have to declare workerExists on this place on true, for the case computerWorkerList is empty.
' In this case the forall-loop will never run.
Forall worker In computerWorkerList
If worker.GetWorker = newWorker Then
msg = "Mitarbeiter " & newWorker & " wurde schon einem Computer zugeordnet"
Messagebox msg
workerExists = True
End If
End Forall
End Property
Interessant ist dann auch noch der Code beteiligter Methoden.
Hier der komplette Code von der Funktion, die einen neuen Mitarbeiter anlegt:
Sub generateWorkerComputer
Dim newWorker As String
Dim newNumb As String
Dim newCompRef As String
newWorker = Inputbox$("Bitte Mitarbeiter eingeben")
If (workerExists(newWorker)) = True Then ' Controlls wether workerNumber already exists
Exit Sub
End If
newNumb = Inputbox$("Bitte Mitarbeiternummer eingeben")
If (workerNumberExists(newNumb)) = True Then ' Controlls wether workerNumber already exists
Exit Sub
End If
newCompRef = Inputbox$("Bitte Computernamen eingeben")
If (computerAlreadyAssigned(newCompRef)) = True Then
Exit Sub
End If
Dim workerRef As New workerComputer(newWorker, newNumb, newCompRef)
Set computerWorkerList(newWorker) = workerRef
computerWorkerList(newWorker).print
End Sub
Liebe Grüße
Giordano
Hi Markus,
ich habe nun herausgefunden, dass der Interpreter bei
If worker.GetWorker = newWorker Then
in der Methode workerExists meckert.
Scheinbar wird der Verweis auf das gelöschte Objekt trotz der delete-Anweisung nicht vollständig gelöscht, da ich ihn noch im Debugger sehen kann, jedoch vollkommen ohne Inhalt. Der Interpreter versucht dann die Methode worker.GetWorker aufzurufen, aber da ja alle Methoden und Variablen gelöscht wurden, geht das schief.
Wie sieht der Code aus, mit dem du das Anlegen und wieder Löschen durchführst.
Das Anlegen wird in generateWorkerComputer durchgeführt. Am Anfang werden Daten über die Inputbox abgefragt und dann anschließend ganz unten wird eine Instanz von workerComputer angelegt und in die workerComputerList hinzugefügt.
Dim workerRef As New workerComputer(newWorker, newNumb, newCompRef)
Set computerWorkerList(newWorker) = workerRef
computerWorkerList(newWorker).print
Das Löschen wird in der Methode deleteWorkerComputer durchgeführt (s. o.)
Die Frage ist nun, wie ich nicht nur den Inhalt eines Objekts löschen kann, sondern den Verweis zu einem Objekt selber!
Liebe Grüße
Giordano