Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: baumi78 am 26.01.05 - 16:18:53

Titel: Problem mit notesview.getnextdocument(doc)
Beitrag von: baumi78 am 26.01.05 - 16:18:53
Hallo liebe Notes Gemeinde,

ich habe mal wieder ein Problem mit dem ich irgendwie nicht weiterkomme.

Ich habe einen Agenten der über die Dokumente einer View läuft, diese Dokumente bearbeitet (wodurch sie aus der View "rausrutschen"). Das ganze sieht stark vereinfacht so aus:

Code
Set exportView = db.getView("ExportView")

Set doc = exportView.getFirstDocument()
			
While Not(doc Is Nothing) 
					
	 Call schreibeDateninRelDB
					
'Hole das nächste Dokument (vor dem Speichern, sonst rutschen wir aus der Ansicht)
					
	Set tmpDoc1 = exportView.getNextDocument(doc)

'Speichern

	Call doc.save(True, True)
'und der nächste bitte
	Set doc = tmpDoc1   
Wend



Nun passiert es aber das mein getnextdocument mir manchmal kein Document zurückliefert obwohl definitiv noch Dokumente in der View liegen. Es ist auch kein genaues Schema zu erkennen, nach dem dies mal funktioniert oder auch eben nicht. Die EIgenschaft "TopLevelEntryCount" leifert mir die in meinen Augen korrekte Anzahl der Dokumente. Kennt jemand ähnliche Phänomene?? Wie genau funktioniert das Durchlaufen einer View intern? Kann es sein das die View "kaputt" ist. Ansichtsindizies hab ich schon neu aufgebaut.

Weiß jetzt echt nicht mehr weiter!

Grüße Baumi
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: Glombi am 26.01.05 - 16:24:26
Als Workaround kannst Du Dir die Dokumente in eine NotesDocumentCollection holen. Dann müsstest DU sowas machen wie

set dc = view.GetAllDocumentsByKey( "<key>",true )

<key> wäre dann der Wert der ersten sortierten Spalte.

Andreas
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: TMC am 26.01.05 - 22:33:19
Mag jetzt vielleicht nicht unbedingt die Lösung zu Deinem Problem sein, aber ein View.Refresh schadet da sicherlich auch nicht (höchstens der Perfomance).
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: elajen am 27.01.05 - 09:29:14
Hallo,

beim Durchlaufen von View's mußt darauf achten, das, wenn du Dokumente veränderst, und die Dokumente fliegen aus der Ansicht raus, geht das getnextDocument schief. Daher solltest du mit einer ViewEntryCollection arbeiten. Das ist wie ein Snap-shot vom View.

Gruß von Ekki
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: baumi78 am 27.01.05 - 10:54:32
Hallo,

 vielen Dank für die schnelle Hilfe, ich glaube aber das Problem hat sich relativiert, scheinbar war meine Datenbank gerade irgendwie dabei sich intern "aufzulösen", auch andere Funktionen haben sich merkwürdig verhalten. Da auch ein Fixup keine Besserung brachte habe ich die Datenbank neu angelegt (war in diesem Fall kein Problem) und jetzt tritt auch der Fehler nicht mehr auf!

p.s. zu Ekkis Hinweis: gilt deine Aussage auch dann wenn ich mir das nächste Dokument schon hole bevor ich den "Vorgänger" verändere (wie in meinem Codeschnipsel zu sehen)?

Grüße Baumi
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: elajen am 27.01.05 - 11:57:17
Hallo,

das sollte funktionieren.

Gruß von Ekki
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: Abdelhadi Doujali am 02.02.05 - 14:27:20
Hi,

Wenn man in einer Ansicht Dokumente durchläuft, bearbeitet und speichert, dann verrutscht die Reihenfolge der Dokumente, dh. wenn du gerade Dok1 bearbeitet und speicherst, beim nächsten Durchlauf erwartest du eigentlich Dok2. Wenn du Glück hast, bekommst auch Dok2, sonst Dok10 oder gar nicht -> Fehler.
Um dieses Problem zu vermeiden musst 2 Doks (oDoc und oDocnext) definieren wie in diesem Bsp:
Direkt am Anfang der Schleife oDocnext setzen, also
Set oDocnext=oDoc, damit sicherst du dir auf jedenfall das nächste Dok.
Dann am Ende der Schleife das hier machen:
Set oDoc = oView.GetNextDocument(oDocnext)


Bsp. ich lösche Doks aus einer Ansicht:

   Dim oSession As New notessession
   Dim oDB As notesdatabase
   Dim oView As notesview
   Dim oDoc As Notesdocument
   Dim oDocnext As Notesdocument

   
   Set oDB = oSession.currentdatabase
   Set oView = odb.getview ("vwDruckmasken")
   Set oDoc = oView.GetFirstDocument
   
   While Not (oDoc Is Nothing)
      Set oDocnext=oDoc
      Call odoc.Remove( True )
      Set oDocnext = oView.GetFirstDocument
      Set oDoc = oView.GetNextDocument(oDocnext)
   Wend
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: Axel am 02.02.05 - 19:20:38
Hi,

bist du wirklich sicher, dass das richtig funktioniert?  ???

Du schreibst, dass du am Anfang der Schleife oDoc in oDocNext sicherst. So weit so gut, aber weiter unter in der Schleife überschreibst du oDocnext mit GetFirstDocument. Meines Erachtens bringst du hier die Schleife komplett durcheinander.

Die Lösung die ich immer verwende sieht so aus (hier auf Basis einer Collection, geht aber mit einer View genauso):

Dim session As New Notessession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim docTemp As NotesDocument
Dim collection As NotesDocumentCollection

Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument
   
While Not (doc Is Nothing)
      Set docTemp = collection.GetNextDocument(doc)
      Call doc.Remove( True )
      Set doc = docTemp
Wend

Axel 
Titel: Re: Problem mit notesview.getnextdocument(doc)
Beitrag von: Abdelhadi Doujali am 03.02.05 - 10:43:26
Hi Axel,

du hast recht, leider ist es mir ein Fehler untergelaufen.
Also wenn man ein Doc in einer Ansicht bearbeitet und speichert oder löscht, wie in meinem Bsp. dann muss man das nächste Doc als erstes in der Schleife holen.

Bsp. ich lösche Doks aus einer Ansicht:

   Dim oSession As New notessession
   Dim oDB As notesdatabase
   Dim oView As notesview
   Dim oDoc As Notesdocument
   Dim oDocnext As Notesdocument

   
   Set oDB = oSession.currentdatabase
   Set oView = odb.getview ("vwDruckmasken")
   Set oDoc = oView.GetFirstDocument
   
   While Not (oDoc Is Nothing)
      'hole näcste oDocnext vom oDoc
      Set oDocnext = oView.GetNextDocument(oDoc)
      'oDoc löschen oder bearbeiten und speichern.
      Call oDoc.Remove( True )
      'setze oDoc=oDocnext
      Set oDoc=oDocnext
   Wend

 
Ich denke so ist es richtig, im Prinzip wie dein Code.
Danke für den Hinweis und viel Spaß
Abdelhadi