Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: cebolina am 31.05.11 - 14:54:02

Titel: nur Items mit bestimmtem Prefix kopieren
Beitrag von: cebolina am 31.05.11 - 14:54:02
Hallo,

ich will in ein Dokument (doc) aus einem anderen Dokument (refDoc) bestimmte Items kopieren (in diesem speziellen Fall geht es um die Übernahme von Kundendaten).
In beiden Dokumenten sind die Item-Namen identisch.
Die betreffenden Namen beginnen alle mit dem gleichen Prefix "kunde" (Bsp.: kunde_Name, kunde_Vorname, kunde_ort, etc.)

Welches Konstrukt ist zu empfehlen?
Dieses:
Code
...
Forall i In refDoc.Items
	If Lcase(Left$( i.Name , 5)) = "kunde" Then
		Call doc.ReplaceItemValue(i.Name , refDoc.GetItemValue(i.Name))
	End If
End Forall
...

oder dieses:
Code
...
Dim refItem As NotesItem
Forall i In refDoc.Items
	If Lcase(Left$( i.Name , 5)) = "kunde" Then
		Set refItem = refDoc.GetFirstItem(i.Name)
		Call doc.CopyItem(refItem , i.Name)
	End If
End Forall
...

Beide Versionen funktionieren, aber vielleicht gibt es eine elegantere Variante, wenn ich berücksichtige, dass es "nur" ca. 20 "kunde_*"-Items gibt, aber vielleicht 100, die nicht mit "kunde" beginnen?
Wie machen es die Profis?

Gruß Stefan
Titel: Re: nur Items mit bestimmtem Prefix kopieren
Beitrag von: koehlerbv am 31.05.11 - 14:59:41
Das sind schon die beiden gängigen Varianten. Und "vorselektieren" kannst Du nicht.

Bedenke auch, dass Notes sowie der Tabelle der Itemnamen ausliest - das Überlesen der von Dir nicht benötigten Items passiert so oder so - und das im RAM. Da würde ich mir bezüglich der Laufzeit keine grossen Gedanken machen.

Bernhard
Titel: Re: nur Items mit bestimmtem Prefix kopieren
Beitrag von: cebolina am 31.05.11 - 15:10:53
Danke für die Info.
Dann mach ich es über die doc.ReplaceItemValue-Variante.

Stefan
Titel: Re: nur Items mit bestimmtem Prefix kopieren
Beitrag von: Tode am 01.06.11 - 06:47:54
Natürlich gibt es zusätzlich noch die Möglichkeit der aktiven Eingrenzung... Irgendwann brauchst Du ja eventuell doch mal ein Feld, was im Ziel anders heisst als in der Quelle.
Ich arbeite dann immer mit Arrays oder Listen, je nachdem was grade besser reinkommt.

Liste wäre in etwa so:

LCopyFields("Quellfeldname") = "Zielfeldname"
Forall zielfeld in LCopyFields
  Quellfled = Listtag(zielfeld)
  Call zieldoc.Replaceitemvalue(zielfeld,quelldoc.GetItemValue(quellfeld))
End forall

Oder so:
Allefelder = split("quellfeld1~zielfeld1,quellfeld2~zielfeld2,quellfeld3,zielfeld3",",")
Forall feld in allefelder
  Call zieldoc.replaceitemvalue(strtoken(feld,"~",1),quelldoc.GetItemValue(strtoken(feld,"~"))
end forall

Das hat den Nachteil, dass du beim hinzukommen von einem Feld den code ändern musst (oder du lagrst die mappings in eine konfig aus), aber den Vorteil, dass Du flexibler bist.

HtH
Titel: Re: nur Items mit bestimmtem Prefix kopieren
Beitrag von: cebolina am 01.06.11 - 07:39:01
Natürlich gibt es zusätzlich noch die Möglichkeit der aktiven Eingrenzung... Irgendwann brauchst Du ja eventuell doch mal ein Feld, was im Ziel anders heisst als in der Quelle.
Ich arbeite dann immer mit Arrays oder Listen, je nachdem was grade besser reinkommt.
Danke für die Ergänzung, aber in meinem speziellen Fall wollte ich mir eben ersparen, die entsprechenden Feldnamen herauszusuchen und abzuschreiben.
Für andere Fälle aber sicher eine gute Lösung - werde ich mir merken.

Stefan
Titel: Re: nur Items mit bestimmtem Prefix kopieren
Beitrag von: pram am 01.06.11 - 09:40:43
Ich gehe meist über ein Zwischendoc:
Code
call source.copyAllItems(tempDoc, false)

forall item in tempdoc.items
   itemname= item.name
   if not mustCopy(itemName) then '... alle nicht benötigten Items aus tempDoc entfernen
     call item.remove()
     do while tempDoc.hasItem(itemName) ' Bei RT oder Mime-Feldern sind Items oft mehrfach vorhanden
       call tempDoc.removeItem(itemName)
     loop
   end if
end forall
call tempDoc.copyAllItems(dest, true) ' das bereinigte Doc über das Zieldoc kopieren

Obiges geht etwas schneller und macht viel weniger Probleme bei Dokumenten mit Richtext/MIME-Inhalten
(insb werden die $FILE Items berücksichtigt)

Wenn Keine Richtext/Autorenfelder oder sonstiges beteiligt sind, sondern es sich um reine Text/Zahlenfelder handelt, spricht aber auch nichts gegen die "replaceItemValue" Methode

Gruß
Roland
Titel: Re: nur Items mit bestimmtem Prefix kopieren
Beitrag von: cebolina am 01.06.11 - 09:54:54
@Roland (pram)
In meinem Fall geht es ausschließlich um Text-Felder.
Trotzdem Danke für die Anregung.

Stefan