Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: stitze am 08.11.05 - 11:47:54
-
Hi ich bins nochmal,
also ich itereire gerade über eine NotesCollection, hole mir aus dieser ein NotesDocument, und itereiere dann über eine zweite NotesCollection um das NotesDocument aus meiner ersten NotesCollection in der zweiten zu finden. Habe ich dieses gefunden, muss ich das im weiteren Verlauf nicht mehr beachten, also habe ich mir gedacht lösche ich es raus. Es gibt es mehere Dokumente, welche die gleiche Bezeichnung haben wie mein oben gefundenes NotesDocument. Also habe ich mir gedacht mache ich mir eine weitere Collection in der alle Documente stehen mit der entsprechenden Bezeichnung und lösche diese aus meiner zweiten Collection heraus. also iteriere ich über meine Collection mit den zu löschenden Dokumenten und rufe für jedes darin enthaltene Dokument die Methode der zweiten Collection DeleteDocument auf.
Als Fehlermeldung erhalte ich jedoch:
Document is not from this Collection
???
Ist es nicht, denke ich aber schon, naja eigentlich habe ich keinen Plan, kann mir einer weiterhelfen.
Ist vieleicht etwas kompliziert, sry ;)
Mfg
Sebastian Titze
Kann es unter Umständen sein das sich die Variable des zu löschenden Dokumentes, welche ich der Methode DeleteDocument übergebe, aus der NotesCollection referenzieren muss, in der ich das Document eigentlich löschen will?
Obwohl dies eigentlich unlogisch wäre, weil soweit ich weiss das Document als ByVal übergeben wird ???
-
Ich denke mal, daß man ohne Code nicht viel dazu sagen kann. Die Fehlermeldung sieht so aus, als wenn Du da irgendwie die Dokumente und die Collections vermischt.
-
For i = 0 To docCollectionZ60Word.Count
If Not ( docZ60Word Is Nothing ) Then
Call progressBar.SetText( "DB Abgleich: Z52EWDK.nsf -> " & Cstr( lngCountPB) & " Z60Word.nsf -> " & Cstr( i ) , "Bitte Warten..." )
strZ60Name = docZ60Word.Bezeichnung(0)
strZ60Version = docZ60Word.Vnr(0)
strZ52Name = docZ52EWDK.HBName (0)
strZ52Version = docZ52EWDK.HBVersion(0)
If strZ52Name = strZ60Name And strZ52Version = strZ60Version Then
intCount = intCount + 1
i = docCollectionZ60Word.Count
strSelectionZ60Delete = "@Contains( Bezeichnung; """ & strZ60Name & """ )"
Set docCollectionDelete = docCollectionZ60Word.Search( strSelectionZ60Delete, Nothing, 0 )
For j = 1 To docCollectionDelete.Count
Set docDelete = docCollectionDelete.GetNthDocument(j)
Call docCollectionZ60Word.DeleteDocument( docDelete ) [Hier wird der Fehler ausgelöst]
Next
End If
Set docZ60Word = docCollectionZ60Word.GetNextDocument( docZ60Word )
End If
Next
-
Also die Fehlermeldung ist klar. Das zu löschende Dokument ist ja aus der Collection "docCollectionDelete" und nicht aus der "docCollectionZ60Word".
Jetzt ist die Frage, willst Du die Dokumente nur aus der Collection "docCollectionZ60Word" entfernen oder willst Du die tatsächlich aus der Datenbank löschen ?
Für aus der DB löschen kannst Du dann einfach RemoveAll verwenden.
Für löschen aus der Collection fällt mir jetzt nur der Weg ein, daß in der ersten For-Schleife mit abzuwickeln.
-
Also, das Document hole ich mir zwar aus der docCollectionDelete, aber alle Dokumente sind auch in der docCollectionZ60Word.
Ich möchte sie nur aus der Collection entfernen, nicht aus der DB, dann werd ich gefeuert ;)
Problem ich kann es nicht in der ersten For Schleife mit abwickeln, weil wie schon versucht zu erklären gibt es mehrere Dokumente mit gleichem Inhalt im Bezeichnungsfeld, und diese sollen durch die verschachtelte For - Schleife aus der Collection gelöscht werden, da so der Abgleich wesentlich schneller wird auf dauer.
Ca. 1000 Datensätze in der ersten Schleife (nicht mit abgebildet) und ca 4000 in der zweiten Schleife, das haut rein würd ich sagen ;)
-
Mh, ich hab mal in die Notes Hilfe gaschaut, sollte man ja auch manchmal zun ;), da steht fogendes dazu:
The specified document must have originated in this collection. If the document does not exist in the collection, or if it was removed from the database by a RemoveAll operation, an error will be raised.
erklärt so einiges oder?!
Leider gibt es für eine Collection kein Search Befehl, kann man das irgendwie anders machen, einer ne Idee.
-
Mir wurde eine Lösung zugetragen, die generell auch perfomanter ist.
Einfach nicht mit Collections arbeiten, sondern mit Tabellen, dann müssen diese nur einmal gefüllt werden und der komplette Abgleich läuft im Arbeitsspeicher ab und ich auf der DB. Ausserdem kann man da auch Zeilen löschen, so wie ich das brauche :P
-
Tabellen ??? Könntest Du das etwas genauer erklären ? Oder sind Ansichten gemeint ?
-
Es war etwas unglücklich von meinem Ausbilder formuliert ;), es waren Arrays gemeint.