Autor Thema: Kopieren von NotesItems zwischen Dokumenten  (Gelesen 2746 mal)

Offline Keydins

  • Aktives Mitglied
  • ***
  • Beiträge: 163
  • Geschlecht: Männlich
Kopieren von NotesItems zwischen Dokumenten
« am: 17.03.12 - 13:14:12 »
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?


Code
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
« Letzte Änderung: 19.03.12 - 10:48:56 von Keydins »
Gruß Dirk

Aktuelle Notesumgebung
~800 BasicClients 9.0.1 FP9 SHF55
  10 FullClients 9.0.1 FP7 SHF143
    7 DominoServer 9.0.1 FP9 HF 139 / 64 Bit

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Kopieren von NotesItems zwischen Dokumenten
« Antwort #1 am: 17.03.12 - 16:12:00 »
'Schritt 3: Nachverarbeitung
Call uidoc.Close(True)
Set docWork = Nothing oder Delete docWork
Set docWork = db.GetDocumentByUNID(workID)   
Call docWork.RemoveItem("Anweisung")   

Versuchs mal so. Wenn der Fehler dann noch auftritt, schau mal im Debugger, ob docTemp Items mit Namen $File enthält, wenn nicht, werden die nicht mit dem RTF kopiert (den "Fehler" gab es in einer früheren Notes-Version mal, könnte 5 oder 6 gewesen sein).

Im oberen Teil speicherst Du das uidoc im Backend (Call docWork.Save(True, False, False)), falls vorher Änderungen im Richtextfeld vorgenommen wurden, sind die vermutlich weg. Dort würde ich das uidoc speichern (also im Frontend), dann ein SaveOptions = 0 und uidoc.Close. Das nachfolgende

Call ws.EditDocument(False,docWork)

finde ich merkwürdig. Du öffnest das Dokument nochmal im Lesemodus? Wenn Du es in den Lesemodus setzen willst, genügt ein uidoc.EditMode = False. Brauchst Du m.E. aber nicht, wenn Du speicherst und schließt, wie oben beschrieben. Im Schritt 3 schließt Du es ja sowieso, wozu dann das Umschalten in den Lesemodus? Damit er fragt, ob die Änderungen gespeichert werden sollen? Und was, wenn nicht, soll er trotzdem die Daten übernehmen?

Also:

Knopf drücken
Frage: Wollen Sie wirklich? Falls Nein -> Ende
uidoc.Save
SaveOptions = 0 (oder "0")
uidoc.Close
Dokument aus dem Speicher entfernen (Set doc =Nothing, oder Delete doc)
Im Backend neu holen
Daten umschubsen
Dokument wieder öffnen


Offline Keydins

  • Aktives Mitglied
  • ***
  • Beiträge: 163
  • Geschlecht: Männlich
Re: Kopieren von NotesItems zwischen Dokumenten
« Antwort #2 am: 19.03.12 - 09:30:00 »
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.

Code
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
Gruß Dirk

Aktuelle Notesumgebung
~800 BasicClients 9.0.1 FP9 SHF55
  10 FullClients 9.0.1 FP7 SHF143
    7 DominoServer 9.0.1 FP9 HF 139 / 64 Bit

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Kopieren von NotesItems zwischen Dokumenten
« Antwort #3 am: 19.03.12 - 09:44:04 »
Soweit ich weiß kopiert Notes bei "copyAllItems" erst mal nur eine Referenz auf das File.
Erst beim SAVE werden diese aktualisiert. (d.h. in der DB werden dafür neue $FILE-Objekte angelegt)

Wenn du nun die Quelle löscht, bevor du das Ziel speicherst, stirbt auch die Referenz und es kommt zu der Fehlermeldung.
Einfachste (und vermutlich einzige) Abhilfe könnte sein -> docTmp speichern.

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Keydins

  • Aktives Mitglied
  • ***
  • Beiträge: 163
  • Geschlecht: Männlich
Re: Kopieren von NotesItems zwischen Dokumenten
« Antwort #4 am: 19.03.12 - 10:48:37 »
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)

Code
'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
Gruß Dirk

Aktuelle Notesumgebung
~800 BasicClients 9.0.1 FP9 SHF55
  10 FullClients 9.0.1 FP7 SHF143
    7 DominoServer 9.0.1 FP9 HF 139 / 64 Bit

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz