Domino 9 und frühere Versionen > ND6: Entwicklung
Typisch Notes
flaite:
Man kann ja noch eine weitere Methode hinzufügen, die auch das mapping
original.feldname1 -> kopie.feldnameAnders
anbietet.
Ich weiss auch nicht ob klassische Funktionen in Scriptlibraries hier nicht die bessere Lösung darstellen.
Da ich seit gestern dynamic languages Programmierer bin (hab mein erstes Groovy script geschrieben), seh ich das sowieso nicht mehr so ideologisch. ;D . (What joker needs curly braced language. My tackle is much lighter than this crap)
Die Klasse führt da auf jedenfall eine gewisse Rigidität ein.
Vielleicht ist es besser das als Funktion zu programmieren:
--- Code: ---public Function copyDocument(docToCopy As NotesDocument, formCopyDocument As String, fieldNamesIn As String) As NotesDocument
Dim fieldNames As Variant
Dim db as notesDabase
Set db = docToCopy.CurrentDatabase
fieldNames = Split(fieldNamesIn, "~")
' document to return
Set copyDocument = db.createDocument ' return value
copyDocument.form=formCopyDocument
' copy the items
Dim itemDocToCopy As NotesItem
Forall fieldName In fieldNames
Set itemDocToCopy = docToCopy.GetFirstItem(fieldName)
If Not itemDocToCopy Is Nothing Then
Call itemDocToCopy.CopyItemToDocument(copyDocument, fieldName)
Else
' do some better errorhandling or logging than this.
Print "NO GOOD. The item " + fieldName + " does not exist in the document to be copied."
End If
End Forall
End Function
--- Ende Code ---
MadMetzger:
Hier eine Variante meinerseits...
--- Code: ---Public Class DocumentCopierFactory
Private source As NotesDocument
Private fieldMap List As String
Private form As String
Public Sub new(source As NotesDocument, formName As String, fields List As String)
If formName = "" Or source Is Nothing Or Isempty(fields)Then
Exit Sub
End If
Set Me.source = source
Me.form = formName
Forall entry In fields
Me.fieldMap(Listtag(entry)) = entry
End Forall
End Sub
Public Function copyDocument(targetDb As NotesDatabase) As NotesDocument
Dim session As New Notessession
Dim newDoc As Notesdocument
Dim db As NotesDatabase
If Not targetDb Is Nothing Then
Set db = targetDb
Else
Set db = session.CurrentDatabase
End If
Set newDoc = db.CreateDocument
newDoc.Form = form
Forall entry In Me.fieldMap
Call newDoc.ReplaceItemValue(entry, source.GetItemValue(Listtag(entry)))
End Forall
Set copyDocument = newDoc
End Function
End Class
--- Ende Code ---
koehlerbv:
Aber auch hier wird nicht berücksichtigt, dass Andreas unterschiedliche Item-Namen im Quell- und im Zieldokument verwendet.
Bernhard
LN4ever:
Immer, wenn ich beim Kopieren irgendwo "GETFIRSTITEM" lese, denke ich mir, daß die Methode nicht umsonst so heißt - daß es also mehrere gleichnamige Feld(Teile) geben kann.
Und da sind wir mitten im Schlamassel. Die Klassenmethode muß also letztlich mehr leisten, z.B. das Dokument erst einmal in ein neues virtuelles Dokument kopieren und in dem die ITEMS durchorgeln. Bei einem Kopierkandidaten dann das gefundene GETFIRSTITEM removen und nach einem weiteren GETFIRSTITEM des gleichen Namens suchen usw. Ggf. sind auch weitere Objekte eines RT-Feldes zu berücksichtigen wie Attachments, OLE-Einbettungen, Bilder, Objekte.
Und wenn man das zusammenfaßt - dann lohnt es sich, daraus eine Klasse zu machen, mit der man auch Vorlagen ordentlich kopieren kann, in denen es beliebigen Inhalt gibt.
Was bisher hier steht, funktioniert für kleine Testdokumente mit kleinen Feldinhalten und ohne Besonderheiten. Und nur dafür.
Gruß
Norbert
MadMetzger:
@Bernhard: Das kann diese Klasse doch leisten. Die List enthält als Tag den Namen des Quellfeldes und der Eintrag zu dem Tag ist der des Zielfeldes.
@Norbert: Das wiederum alles zu beachten, ist eine interessante Sache... Wenn ich wieder Zeit habe versuche ich einiges davon noch einzubauen und kann wenn gewünscht das Ergebnis hier zur Verfügung stellen.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln