Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: AleX_-_ am 11.11.13 - 10:47:41

Titel: Änderungen von NotesDokumenten cachen
Beitrag von: AleX_-_ am 11.11.13 - 10:47:41
Hallo,

ich habe folgenden BeispielCode:
Set nd = nc.Getfirstdocument()
While Not (nd Is Nothing)   
   Call nd.Replaceitemvalue("Test", "123")      
   Set nd = nc.Getnextdocument(nd)
Wend

Set nd = nc.Getfirstdocument()
While Not (nd Is Nothing)
   MsgBox nd.Getitemvalue("Test")(0)   
   Set nd = nc.Getnextdocument(nd)
Wend


Im unteren Loop gehen die Änderungen aus dem oberen Loop verloren.
Gibt es eine Möglichkeit die Änderungen zu 'cachen' (ich möchte die Dokumente aber nicht speichern)?

Danke für die Hilfe.
Titel: Re: Änderungen von NotesDokumenten cachen
Beitrag von: Tode am 11.11.13 - 10:55:29
In dem Moment, wo Du das Objekt neu allokierst, geht das verloren....
Wenn du nicht speichern willst, dann würde ich mir das in Listen merken:

z.B.:
Code
Dim docList List as Variant
Dim itemList List as String
Set nd = nc.Getfirstdocument()
While Not (nd Is Nothing)   
   erase fieldList
   itemList ( "Test" ) = "123"
   itemList ( "AnderesFeld" ) = "abc" 
   docList( nd.UniversalId ) = itemList
   Set nd = nc.Getnextdocument(nd)
Wend
und in der nächsten Schleife:
Code
curitemList = docList( nd.UniversalId )
Forall item in curitemList
    call nd.ReplaceItemValue( listtag( item ) , item )
End Forall

P.S.: Zweimal die selben Dokumente durchlaufen ist im Normalfall nicht nötig... Kannst Du das nicht zusammenfassen?
Titel: Re: Änderungen von NotesDokumenten cachen
Beitrag von: pram am 13.11.13 - 22:59:13
Du musst dafür sorgen, dass die Garbage-Collection die Dokumente nicht aus dem Speicher wirft. Dies erreichst du, indem du dir die Dokumente in einer Liste/Array merkst. Da jede Instanz eines Dokuments nur 1x im Speicher vorkommt, bekommst du so im 2. Durchlauf das geänderte, aber nicht gespeicherte Dokument.
Code
Dim cache list as NotesDocument
Set nd = nc.Getfirstdocument()
While Not (nd Is Nothing)
   set cache(nd.NoteId) = nd ' Halte eine Referenz auf jedes Doc.
   Call nd.Replaceitemvalue("Test", "123")      
   Set nd = nc.Getnextdocument(nd)
Wend

Set nd = nc.Getfirstdocument()
While Not (nd Is Nothing)
   MsgBox nd.Getitemvalue("Test")(0)   
   Set nd = nc.Getnextdocument(nd)
Wend
erase cache

So ginge es, finde aber obigen Code unschön, nochdazu gibt es bei ~8000 Dokumenten Out of memory-Fehler, welche den Client und Server abstürzen lassen. Besser wäre es wohl wirklich alles in einer Schleife zu machen.

Gruß
Roland