Hallo zusammen,
ich übernehme ein Richtextfeld (Anhänge, eingebundene Bilder, Text) via AppendRTItem in ein RTItem eines anderen Dokumentes.
Führt man diese Aktion zweimal aus, so sind die Inhalte im RTItem des Zieldokumentes doppelt drin. Das ist ja auch in Ordnung, so habe ich es erwartet.
Enthält das Quell-Item allerdings einen Anhang, so teilen sich die nun doppelten Anhänge im Ziel-Dokument ein $FILE Item. Auch das ist eigentlich clever, da so nicht unnötig Ballast aufgebaut wird.
Aber: Löscht man nun einen der doppelten Anhänge im Ziel-Item (egal welchen), so wird auch das zugehörige $FILE Item gelöscht, der/die verbleibenden (doppelten) Anhänge sind dann nur noch leere Verweise die sich entsprechend auch nicht öffnen lassen ("Element des Dokuments nicht gefunden").
Das Problem ist, wenn in der betroffenen Anwendung nun ein Kunde versehentlich zweimal die Übernahme anstößt, das merkt und seinen Fehler bereinigen will in dem er die doppelten Informationen löscht, die verbleibenden Anhänge defekt sind.
Nachvollzogen unter 7.0.2 und 8.0.1 mit einer Test-Datenbank, die nur diese Funktionalität enthält.
Code der Übernahme-Aktion:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim docSource As NotesDocument, docTarget As NotesDocument
Dim rtiSource As NotesRichTextItem, rtiTarget As NotesRichTextItem
Set db = s.CurrentDatabase
Set view = db.GetView("RTI_TEST")
Set docSource = ws.CurrentDocument.Document
Set docTarget = view.GetDocumentByKey("RTI_TARGET", True)
Set rtiSource = docSource.GetFirstItem("RTI")
Set rtiTarget = docTarget.GetFirstItem("RTI")
Call rtiTarget.AddNewline(1)
Call rtiTarget.AppendText("Übernahmezeitpunkt: " & Now)
Call rtiTarget.AddNewline(1)
Call rtiTarget.AppendRTItem(rtiSource)
Call docTarget.Save(True, False)
End Sub
(Test-DB nur zum Nachstellen in einer sauberen Umgebung, daher kein Errorhandling etc.)
Frage: Kann ich das verhindern? Wenn ja: Wie? Oder gibt es bessere Ansätze zum Übernehmen von Richtextfeldern?
Gruß,
Mitch
So, jetzt habe ich noch etwas experimentiert.
Zum Thema "Works as designed" kann ich nur sagen, dass das ein wenig unglaubwürdig ist, da das Problem auch auftritt, wenn die Anhänge nur den gleichen Namen haben! Wenn ich also den Inhalt aus zwei verschiedenen Dokumenten mit verschiedenen RTItems in ein Zusammenfassungsdokument übernehme, beide Quellen aber einen Anhang "Ergebnis.txt" (mit unterschiedlichen Inhalten) haben, dann "gewinnt" der zuerst übernommene Anhang. Der zweite ist nach der Übernahme bloß ein Verweis auf das bestehende $FILE Item.
Aber das nur am Rande, denn ich habe nun doch eine Möglichkeit gefunden, ein RTItem an ein anderes RTItem anzuhängen, ohne dass sich doppelte Anhänge ein $FILE Item teilen:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim docSource As NotesDocument, docTarget As NotesDocument
Dim rtiSource As NotesRichTextItem, rtiTarget As NotesRichTextItem
Set db = s.CurrentDatabase
Set view = db.GetView("RTI_TEST")
Set docSource = ws.CurrentDocument.Document
Set docTarget = view.GetDocumentByKey("RTI_TARGET", True)
Set rtiSource = docSource.GetFirstItem("RTI")
Set rtiTarget = docTarget.GetFirstItem("RTI")
Call rtiTarget.AddNewline(1)
Call rtiTarget.AppendText("Übernahmezeitpunkt: " & Now)
Call rtiTarget.AddNewline(1)
'Update notwendig wenn (wie hier) noch vorher am Ziel-RTF rumgefummelt wird,
'denn sonst ist der Inhalt des "angehangenen" RTIs da vor statt da hinter!
Call rtiTarget.Update
'Mehrere RTI mit gleichem Namen werden automatisch zusammengefasst.
Call rtiSource.CopyItemToDocument(docTarget, rtiTarget.Name)
Call docTarget.Save(True, False)
End Sub
Alle Anhänge haben nun ein eigenes $FILE Item und können entsprechen auch ohne Probleme einzeln gelöscht werden.
Der "Trick" ist, dass CopyItemToDocument nicht die originalen Werte überschreibt wenn das Item im Zieldokument schon vorhanden ist, sondern einfach ein weiteres Item mit dem gleichen Namen anlegt. Im Frontend geöffnet werden diese Items als ein einziges Feld angezeigt (beim Speichern sogar zu einem Item zusammengefügt sofern der Platz ausreicht).
Erfolgreich getestet unter 7.0.2, 8.0.2 und 8.5.2.
Rollen sich bei diesem Weg bei irgendjemanden die Zehennägel auf weil ich irgendwelche bösartigen Haken übersehen habe?
Gruß,
Mitch