Autor Thema: Zweimal .AppendRTItem mit Anhang => Anhänge im Zieldokument teilen sich $FILE  (Gelesen 4046 mal)

Mitch

  • Gast
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
(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
« Letzte Änderung: 16.06.11 - 12:20:01 von Mitch »

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
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.
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Mitch

  • Gast
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

  • Gast
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

  • Gast
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

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

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Hallo Mitch,

interessanter Workaraound mit dem CopyItemToDocument. Wäre mir jetzt nicht sicher gewesen, ob die $File-Items mitgenommen werden, aber Deinen Äußerungen nach scheint das ja so zu sein.

Wie Du schreibst, werden die Felder bei der Bearbeitung im Frontend zusammengefasst. Dies kannst du auch schon in Deinem Programm mittels rtiTarget.compact erreichen. Spannend ist dann, ob die Trennung der $File-Items immer noch funktioniert, wahrscheinlich ist: ja.
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Mitch

  • Gast
Hey Marco,

das habe ich direkt mal probiert.

Ein rtiTarget.Compact vor dem Abspeichern macht keinen Unterschied, auch nicht wenn davor noch ein weiteres rtiTarget.Update läuft.

Das ist aber auch gar kein Problem (macht Notes ja auch selbst so wenn der Inhalt zu groß ist), denn selbst wenn ich da x-mal das Item "RTI" drin stehen habe, so kriege ich mit "GetFirstItem("RTI") doch immer das vollständige Item in den Zugriff und kann korrekt weiter anhängen. Ich kann den Beispiel-Button also auch mehrmals hintereinander klicken und die RTIs werden immer brav unten "angehängt".

Einen Haken habe ich aber schon entdeckt: Das funktioniert nur, wenn man sich die Richtextfelder in verschiedenen Dokumenten befinden, ansonsten kriegt man die Meldung "Notes Error: Anhang wurde bei mehr als einem Dokument gefunden". Da müsste man vermutlich ein temporäres Dummy-Dokument verwenden, damit die Anhänge als "neue" Anhänge erkannt werden.

Gruß,

Mitch

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz