Autor Thema: Problem mit notesview.getnextdocument(doc)  (Gelesen 3843 mal)

Offline baumi78

  • Aktives Mitglied
  • ***
  • Beiträge: 124
  • Ich liebe dieses Forum!
Problem mit notesview.getnextdocument(doc)
« 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

Glombi

  • Gast
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #1 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

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #2 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).
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


elajen

  • Gast
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #3 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

Offline baumi78

  • Aktives Mitglied
  • ***
  • Beiträge: 124
  • Ich liebe dieses Forum!
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #4 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

elajen

  • Gast
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #5 am: 27.01.05 - 11:57:17 »
Hallo,

das sollte funktionieren.

Gruß von Ekki

Offline Abdelhadi Doujali

  • Frischling
  • *
  • Beiträge: 22
  • Ich liebe dieses Forum!
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #6 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #7 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 
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Abdelhadi Doujali

  • Frischling
  • *
  • Beiträge: 22
  • Ich liebe dieses Forum!
Re: Problem mit notesview.getnextdocument(doc)
« Antwort #8 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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz