Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: mb am 05.11.03 - 11:05:46

Titel: "Document is not from this collection"
Beitrag 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
Titel: Re:"Document is not from this collection"
Beitrag von: koehlerbv am 05.11.03 - 16:50:47
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
Titel: Re:"Document is not from this collection"
Beitrag von: Axel am 05.11.03 - 21:37:15
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

Titel: Re:"Document is not from this collection"
Beitrag von: Semeaphoros am 05.11.03 - 21:59:00
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)?
Titel: Re:"Document is not from this collection"
Beitrag von: Axel am 06.11.03 - 09:12:50
@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
Titel: Re:"Document is not from this collection"
Beitrag von: Semeaphoros am 06.11.03 - 09:23:07
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?