Domino 9 und frühere Versionen > ND7: Entwicklung
ForAll-Schleife wird nicht ausgeführt
Dubidu:
Ich habe nun leider ein neues Problem.
In meinem Programm habe ich die Option gespeicherte Mitarbeiter wieder zu löschen:
--- Code: ---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
--- Ende Code ---
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:
--- Code: ---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
--- Ende Code ---
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
MadMetzger:
Nur die Fehlermeldung alleine reicht nicht aus. An was für einer Stelle kommt die Meldung denn? Interessant ist dann auch noch der Code beteiligter Methoden.
Dubidu:
Hi MadMetzger,
--- Zitat von: MadMetzger am 17.03.08 - 14:32:42 ---Nur die Fehlermeldung alleine reicht nicht aus. An was für einer Stelle kommt die Meldung denn?
--- Ende Zitat ---
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.
--- Code: ---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
--- Ende Code ---
--- Zitat ---Interessant ist dann auch noch der Code beteiligter Methoden.
--- Ende Zitat ---
Hier der komplette Code von der Funktion, die einen neuen Mitarbeiter anlegt:
--- Code: ---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
--- Ende Code ---
Liebe Grüße
Giordano
MadMetzger:
Du kannst mich auch mit Markus ansprechen... ;)
Wie sieht der Code aus, mit dem du das Anlegen und wieder Löschen durchführst. Gut wäre dann auch noch die genaue Stelle, an der der Fehler kommt. Was sagt der Debugger an der Stelle dann?
Und noch ein Hinweis in eigener Sache: Du vermischt hier meiner Meinung nach sehr stark Anwendungslogik mit Oberflächenlogik. Da solltest du drüber nachdenken manche Sachen aus den Methoden herauszuziehen:
--- Zitat von: Dubidu am 17.03.08 - 14:54:16 ---
--- Code: ---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
--- Ende Code ---
--- Ende Zitat ---
Hier ist es fraglich ob ein Aufrufer dieser Methode immer die Messagebox haben will. Was ist, wenn es einen Hintergrundagenten gibt, der vor Anlage eines neuen MA beispielsweise über diese Methode die Existenz eines äquivalenten Mitarbeiters überprüfen möchte. In dem Fall bekommst du in dem Agenten ein Problem.
Dubidu:
Hi Markus,
ich habe nun herausgefunden, dass der Interpreter bei
--- Code: ---If worker.GetWorker = newWorker Then
--- Ende Code ---
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.
--- Zitat ---Wie sieht der Code aus, mit dem du das Anlegen und wieder Löschen durchführst.
--- Ende Zitat ---
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.
--- Code: --- Dim workerRef As New workerComputer(newWorker, newNumb, newCompRef)
Set computerWorkerList(newWorker) = workerRef
computerWorkerList(newWorker).print
--- Ende Code ---
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
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln