Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: mb am 05.11.03 - 11:05:46
-
Hallo!
Ich hab hier so ein Script, das immer o.g. Fehler bringt. Ich weiß aber nicht warum (bin aber auch nicht sooo fit in LS). Vielleicht siehts ja einer.
Ich habe, die in meinen Augen entscheidenden Zeilen mal hierher kopiert.
Set col = zieldb.search(|Type = "Person"|,dateTime,0)
zaehler = (col.count)
Set zieldoc = col.getfirstdocument
For i=1To zaehler
docvorhanden = "nein"
Set names_doc = FindMatchingDocumentInView(zieldoc , names_IDView)
If docvorhanden = "ja" Then [...]
End If
Else
weg = True
Set wegdoc = zieldoc
End If
If i < zaehler Then
Set zieldoc = col.getnextdocument(zieldoc)
Else
Set zieldoc = col.getlastdocument
End If
If (weg = True) Then Call wegdoc.remove(True)
weg = False
Next
Der Fehler tritt in dieser Zeile auf: Set zieldoc = col.getnextdocument(zieldoc)
Verdacht: Wenn ich u. bestimmten Umständen ein Doc aus der Collection lösche, erändert sich die Collection dann so, dass ich ein Problem beim Durchlaufen der restlichen Docs bekomme?
Das nächste Doc. wird ja bereits vor dem Löschen geholt.
Aber die Collection jedesmal neu aufzubauen, kann es ja auch nicht sein. Ist es besser erst alle zu löschenden Docs zu sammeln und am Ende zu löschen (wenn ja, wie?)
Marc
-
Das übliche Problem, über das wohl jeder newbee mal stolpert ;-)
Deine Vermutung ist vollkommen richtig: Du ziehst der Funktion zum Instantiieren des nächsten Docs den Boden weg. Die entscheidenden Zeilen fehlen zwar in Deinem Code-Auszug, aber sowas wie
Set NotesDocument = NotesDocumentCollection.GetNextDocument (NotesDocument)
scheitert nach NotesDocument.Remove - das Doc, was als Argument verwendet wird, ist ja nicht mehr da.
Du musst also
- das zu löschende Doc einem temporären Doc zuweisen (docTemp oder so)
- dann Doc das nächste Objekt der Collection zuweisen
- und erst dann docTemp "removen".
HTH,
Bernhard
-
Hi,
ich bin hier etwas anderer Meinung als Bernhard. Denn du weißt das zu löschende Dokument einer temp. Variablen zu, holst dann das nächste Dokument und löscht dann erst. Meines Erachtes zieht du hier niemandem den Boden unter den Füßen weg.
Ich glaube eher deine Schleife ist von der Logik her falsch. Du nimmst eine For-Next - Schleife mit der Variable zaehler als Endbedingung und die holst du dir bevor du Dokument aus der Collection löscht. Das heißt, du hattest in deiner Collection 10 Dokumente, also hat zaehler den Wert 10. Nun löscht du innerhalb der Schleife bspw. 3 Dokumente, also sind in der Collection nur noch 7 Dokumente, aber die Schleife läuft bis 10 und versucht so auf nicht mehr vorhandene Dokument zuzugreifen.
Du verwendest besser eine While-Wend - Schleife.
Dein Code könnte so aussehen:
Set col = zieldb.search(|Type = "Person"|,dateTime,0)
Set zieldoc = col.getfirstdocument
While Not (zieldoc Is Nothing)
docvorhanden = "nein"
Set names_doc = FindMatchingDocumentInView(zieldoc , names_IDView)
If docvorhanden = "ja" Then [...]
End If
Else
weg = True
Set wegdoc = zieldoc
End If
Set zieldoc = col.getnextdocument(zieldoc)
If (weg = True) Then Call wegdoc.remove(True)
weg = False
Wend
Ich hab's nicht getestet. Unter Umständen müsste man die Dokument-Zuweisung doch auch noch anpassen, aber probiers erst mal so.
Axel
-
Bernhard: Axel hat recht, die Reihenfolge stimmt im Code von Marc. Das wegdoc.remove kommt erst nach der etwas "schwerfälligen" Art, wie er das nächste Dokument holt. Somit ist die Reihenfolge, erst nächstes Doc holen, dann ev. aktuelles Doc löschen korrekt.
Axel: Deine Begründung ist falsch. Wenn er am Anfang 10 Docs in der Collection hat, muss er auch 10 Docs überprüfen, egal wieviele er dabei löschen muss oder nicht. Dennoch, Deine Schleife ist natürlich sehr viel eleganter (und einfacher) als die von Marc, und damit natürlich auch weniger Fehleranfällig, gut möglich, dass Du das Problem beseitigt hast, auch wenn die Begründung nicht stimmen kann.
Marc: Welchen Wert hat den i in dem Moment, wo der Fehler auftritt, und wieviele Dokumente wurden bis dahin gelöscht und wieviele Documente warens denn (sprich, welchen Wert hat Zähler)?
-
@Semeaphoros
Stimmt, ich war gestern Abend ein bisschen auf der falschen Spur, denn ich hatte gerade etwas ähnlich gemacht, allerdings hab ich die Dokumente aus der Collection gelöscht.
Aber bei der Schleife von Marc besteht die Gefahr, das die Zuweisung GetNextDocument ins Leere läuft.
Axel
-
Die Gefahr hab ich auch vermutet, aber wahrscheinlich tut es nicht. Vermutlich ist der ELSE Zweig eine NOP, indem das letzte Dokument einfach nochmal zugewiesen wird. Ueberflüssig, aber schadet nix --- Irrtum natürlich vorbehalten ...... klar - oder?