Hallo zusammen,
ich habe ein kleines Problem bei einer Anwendung, in der ich Dokumente mit einer statischen UNID benötige, da diese Dokumente über Verlinkungen aus einer Windowsanwendung aufgerufen werden sollen.
Der Inhalt der Notesdokumente darf zum einen normal geändert werden (z.B. um einen Begriff zu ändern oder einen Dateianhang auszutauschen), muss aber zum anderen auch eine Versionshistorie bieten (z.B. bei umfangreichen Überarbeitungen des Dokuments).
Die Versionierung habe ich über 'Neue Version werden Geschwister' gelöst. Das Geschwisterdokument ist bis zur Freigabe eine Arbeitskopie (docWork) und soll nach Freigabe dann den bisherigen Inhalt des aktuell gültigen Dokuments (docMaster) aufnehmen, während der Inhalt der Arbeitkopie dabei in das ursprüngliche Dokument übertragen wird.
Den Austausch der Inhalte möchte ich über eine Schaltfläche im Arbeitsdokument lösen (siehe Code), alledings habe ich dbei folgendes Problem:
1. Enthalten beide Dokumente im RTF 'Anweisung' nur Notesinhalte (Text, Abschnitte, Tabellen) funktioniert der Austausch einwandfrei
2. Enthält docWork einen in den Text eingebetteten Dateianhang, funktioniert die Übertragung an docMaster ohne Probleme, der Anhang kann von dort auch geöffnet werden.
3. Enthält docMaster einen Dateianhnag, kommt es beim Speichern von docWork zu der Fehlermeldung:
'Notes-Fehler: Ein oder mehrere Anhänge des Quelldokuments fehlen. Starten Sie Fixup, um das Dokument in der Quelldatenbank zu löschen'
Im Debugger sieht es so aus, als würde Notes das eingebettete Objekt (bei meinem Test ein Textfile) immer weiter ineinander verschachteln (siehe Screenshot des Debbugers)
Hat jemand eine Idee, wie ich das Problem lösen kann?
Sub Click(Source As Button)
Dim ses As New NotesSession
Dim ws As New NotesUIWorkspace
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim docTemp As NotesDocument
Dim docWork As NotesDocument
Dim docMaster As NotesDocument
Dim itemWork As NotesItem
Dim itemMaster As NotesItem
Dim masterID As Variant
Dim workID As String
Set db = ses.CurrentDatabase
Set uidoc = ws.CurrentDocument
Set docWork = uidoc.Document
Set docTemp = New NotesDocument( db )
workID = docWork.UniversalID
Call docWork.Save(True, False, False)
Call ws.EditDocument(False,docWork)
'Schritt 1: MasterDoc - Anweisung in Temp und Item löschen
masterID = docWork.GetItemValue("$VERREF")
Set docMaster = db.GetDocumentByUNID(masterID(0))
Set itemMaster = docMaster.GetFirstItem( "Anweisung" )
Call itemMaster.CopyItemToDocument( docTemp, "Anweisung" )
Call docMaster.RemoveItem("Anweisung")
'Schritt 2: WorkDoc - Anweisung in Master kopieren
Set itemWork = docWork.GetFirstItem( "Anweisung" )
Call itemWork.CopyItemToDocument( docMaster, "Anweisung" )
Call docMaster.Save(True, False, False)
'Schritt 3: Nachverarbeitung
Call uidoc.Close(True)
Set docWork = db.GetDocumentByUNID(workID)
Call docWork.RemoveItem("Anweisung")
Call docTemp.CopyAllItems( docWork, True )
Call docWork.Save(True, False, False) <-- Hier kommt es zur Fehlermeldung
Call ws.EditDocument(False,docWork)
End Sub
Gruß
Dirk
Hallo Peter,
danke für die Hinweise, habe den Code angepasst und erneut getestet, leider immer noch das selbe Verhalten. Soblad aus dem docMaster ein eingebetteter Dateianhang in docWork übertragen werden soll, erhalte ich bei der Speicheroption von docWork den besagten Fehler.
Der Debugger zeigt für docTemp 3 Items: $File, SaveOptions und Anweisung, also eigntlich wie erwartet und in Richtung docMaster funktioniert es weiterhin problemlos.
Sub Click(Source As Button)
Dim ses As New NotesSession
Dim ws As New NotesUIWorkspace
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim docTemp As NotesDocument
Dim docWork As NotesDocument
Dim docMaster As NotesDocument
Dim itemWork As NotesItem
Dim itemMaster As NotesItem
Dim masterID As Variant
Dim workID As String
Dim docEdit As Boolean
Set db = ses.CurrentDatabase
Set uidoc = ws.CurrentDocument
Set docWork = uidoc.Document
Set docTemp = New NotesDocument( db )
docTemp.SaveOptions = 0
workID = docWork.UniversalID
docEdit = uidoc.EditMode
If docEdit = -1 Then
uidoc.Save
End If
Call uidoc.Close(True)
Set docWork = Nothing
Set docWork = db.GetDocumentByUNID(workID)
'Schritt 1: MasterDoc - Anweisung in Temp und Item löschen
masterID = docWork.GetItemValue("$VERREF")
Set docMaster = db.GetDocumentByUNID(masterID(0))
Set itemMaster = docMaster.GetFirstItem( "Anweisung" )
Call itemMaster.CopyItemToDocument( docTemp, "Anweisung" )
Call docMaster.RemoveItem("Anweisung")
'Schritt 2: WorkDoc - Anweisung in Master kopieren
Set itemWork = docWork.GetFirstItem( "Anweisung" )
Call itemWork.CopyItemToDocument( docMaster, "Anweisung" )
Call docMaster.Save(True, False, False)
'Schritt 3: Nachverarbeitung
Call docWork.RemoveItem("Anweisung")
Call docTemp.CopyAllItems( docWork, True )
Call docWork.Save(True, False, False)
Set docTemp = Nothing
End Sub
Gruß
Dirk
Hallo Roland,
vielen Dank für den Tipp, funktioniert jetzt wie gewünscht. :)
Zum Abschluss der der lauffähige Codeabschnitt:
(habe bei Temp -> Work noch 'copyAllItems' durch 'copyItemToDocument' ersetzt, damit auch tatsächlich nur der gewünschte Inhalt übertragen wird)
'Schritt 1: MasterDoc - Anweisung in Temp und Item löschen
masterID = docWork.GetItemValue("$VERREF")
Set docMaster = db.GetDocumentByUNID(masterID(0))
Set itemMaster = docMaster.GetFirstItem( "Anweisung" )
Call itemMaster.CopyItemToDocument( docTemp, "Anweisung" )
Call docTemp.Save(True, False, True)
tempID = docTemp.UniversalID
Set docTemp = Nothing
Call docMaster.RemoveItem("Anweisung")
'Schritt 2: WorkDoc - Anweisung in Master kopieren
Set itemWork = docWork.GetFirstItem( "Anweisung" )
Call itemWork.CopyItemToDocument( docMaster, "Anweisung" )
Call docMaster.Save(True, False, False)
'Schritt 3: Nachverarbeitung
Call docWork.RemoveItem("Anweisung")
Set docTemp = db.GetDocumentByUNID(tempID)
Set itemTemp = docTemp.GetFirstItem( "Anweisung" )
Call itemTemp.CopyItemToDocument( docWork, "Anweisung" )
Call docWork.Save(True, False, False)
Call docTemp.Remove( True )
Gruß
Dirk