Domino 9 und frühere Versionen > ND7: Entwicklung

Zweimal .AppendRTItem mit Anhang => Anhänge im Zieldokument teilen sich $FILE

(1/2) > >>

Mitch:
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:

--- Code: ---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

--- Ende Code ---
(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

marschul:
Setze mittels eines zusätzlichen Feldes ein Flag im Zieldokument, welches kennzeichnet, dass die Übernahme bereits erfolgt ist. Darauf kann die Aktion reagieren, z.B. durch einen entsprechenden Hinweis & Abbruch oder indem die Aktion verborgen wird oder indem gar nix passiert ...

Ansonsten ist m.E. gegen AppendRTItem nichts einzuwenden.

Interessant ist das Verhalten dennoch, hätte ich so nicht erwartet.

Mitch:
Heyho,

danke für deine Antwort.

Das mache ich bereits jetzt so ähnlich: Ich frage nach, ob die Daten nochmal übernommen werden sollen (es wird nämlich auch gerne mal im Zieldokument "versehentlich" was gelöscht).

Es kommt aber trotzdem vor, dass Leute doppelt übernehmen und dann selbst bereinigen.

Außerdem würde ich das Problem auch aus anderen Gründen gerne umgehen, da es auch auftritt, wenn innerhalb des selben Dokumentes von einem RTItem in ein anderes angehangen wird.

Ich habe da zum Beispiel einen Wizard, der in vielen Schritten auch einen RT-Kommentar abfragt. Die fasse ich bei Abschluss in einem Feld zusammen. Nun würde ich die Schritt-RT-Felder nach Abschluss dann gerne löschen um nicht unnötig Speicherplatz zu verschwenden (die Anhänge sind aufgrund des geteilten $FILE Feldes ja kein Größenproblem, aber eingebettete/importierte Grafiken schon), das kann ich aber nicht, da dann die Anhänge in der Zusammenfassung kaputt gehen.

Gruß,

Mitch

Mitch:
Okay, ich habe die richtigen Suchbegriffe gefunden und das offizielle IBM Statement entdeckt:

https://www-304.ibm.com/support/docview.wss?uid=swg21200321&wv=1

Kurz gesagt: "Works as designed".

Der "Workaround" ist: Ins Dateisystem lösen und neu anhängen. Das ist schade, da die Attachments ja unter Umständen explizit an einer speziellen Position im Richtextfeld erstellt wurden ("Hier das Foto [Anhang1] und hier das Dokument [Anhang2]").

Aber okay, dann muss ich mal schauen, ob und wie ich das einbaue.

Gruß,

Mitch

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:


--- Code: ---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

--- Ende Code ---

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

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln