Autor Thema: Kopieren von NotesItems zwischen Dokumenten  (Gelesen 2666 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