Autor Thema: Komplettes Dokument im Hintergrund temporär vorhalten  (Gelesen 2279 mal)

MM85

  • Gast
Hallo zusammen,

nachdem ich nun schon einige meiner Notes Fragen mit Hilfe dieses Forums lösen konnte, muss ich jetzt doch mal einen eigenen Thread starten  ;)

Ich habe folgende Situation: Ich bin dabei eine Datenbank zu bauen, in der wir Projekte und die dazugehörigen Dokumente ablegen können. Mein Design sieht im Moment so aus, dass ich ein Dokument "Projekt" habe das die Verwaltungsinfos zu einem Projekt enthält. Als Response kann man dazu dann ProjektOrdner und ProjektDokumente anlegen, wobei man an einen Ordner weitere Ordner oder Dokumente anhängen kann.
In einer Embedded View im Dokument "Projek" zeige ich alle zum Projekt gehörigen Ordner und Dokumente als Response-Hierarchy an. Das funktioniert alles soweit ganz gut.

Nun zu meinem Problem bzw. der Frage: Für die "ProjektDokumente" soll in Abhängigkeit eines Flags, das für jedes Projekt gesetzt werden kann, eine Versionierung erfolgen. Ich weiß, dass ich in Notes die Versionierung automatisch einschalten kann. Das Problem dabei ist, dass dann ja Response Dokumente generiert werden. Da ich in meiner Embedded View über @AllDescendants alle von einem Projekt abgeleiteten Dokumente anzeige, würde es mir mit dieser Methode der Versionierung auch die Versionen in dieser Übersicht anzeigen....was ich ja aber aus Gründen der Übersichtlichkeit nicht will.
Ich habe mir nun überlegt, dass ich ein Dokument "ProjektDokumentHistory" anlege, das gleich aussieht, wie "ProjektDokument". Sobald ein ProjektDokument in den EditMode wechselt (und das Flag für Versionierung gesetzt ist), kopiere ich den Inhalt aller Felder des ProjektDokuments in ein temporäres ProjektDokumentHistory (QueryModeChange Event):

Code
	

(....)
Elseif (source.EditMode = False) Then
	
	
		Call note.CopyAllItems(note_history, True)
		Dim tmpForm As NotesItem
		Set tmpForm = note_History.ReplaceItemValue("Form","frmProjectDocumentHistory")
		'note_History.Form = "frmProjectDocumentHistory"	
		Dim tmpDocID As NotesItem
		Set tmpDocID = note_History.ReplaceItemValue("frmPD_ParentDocID", ""+note.UniversalID)
		
		
		Dim tmpUser As NotesItem
		Set tmpUser = note_History.ReplaceItemValue("frmPD_CreatedBy", session.UserName)
		Dim tmpSaved As NotesItem
		Dim tmpNow As String
		tmpNow = Now
		Set tmpSaved = note_History.ReplaceItemValue("frmPD_CreatedOn", ""+tmpNow)
		Dim tmpRef As NotesItem
		Set tmpRef = note_History.ReplaceItemValue("$REF","")
		
		

Im PostSave Event führe ich dann
Code
Call note_history.Save( True, True )		
aus.

Sinn der Sache soll sein, dass die Versionsdokumente nur dann angelegt werden, wenn das Hautdokument auch wirklich gespeichert wird. Soweit funktioniert auch das ganz gut. Lediglich mit Attachments in einem RTF habe ich das Problem, dass wenn ich das Attachment im Hauptdokument ändere Notes eine Fehlermeldung "Notes error: one or more of the source document's attachment are missing. Run Fixup to delete the document in the source database" ausgibt. Diese Meldung kommt beim Save des neuen History Dokuments, wenn ein Attachment geändert wurde. Werden nur normale Felder geändert werden, wird das History Dokument ohne Probleme abgespeichert.

Sorry für den langen Post, ich hoffe die Beschreibung meines Problems ist einigermaßen verständlich. Gibt es eine Möglichkeit, mit der ich das Attachment auch komplett in das temporäre Dokument im Hintergrund kopieren kann?
Oder gibt es für meine Aufgabenstellung eine sinnvollere vielleicht auch einfachere Lösungsmöglichkeit?

Vielen Dank für eure Hilfe.
Viele Grüsse
Martin

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Komplettes Dokument im Hintergrund temporär vorhalten
« Antwort #1 am: 03.09.12 - 11:08:19 »
Nur so aus dem Bauch ...

Ich würde das note_history sofort speichern und mit dem Usernamen des Benutzers versehen. Im PostSave entfernst Du den Usernamen wieder. Im Queryclose löschst Du note_history, wenn der Username noch vorhanden ist. Natürlich löschst Du mit Agent.RunOnServer, weil der Benutzer hoffentlich kein Löschrecht hat.

Falls Du nicht löschen willst, kannst Du auch beim nächsten Mal suchen, ob es ein note_history für den Benutzer gibt, nimmst das, löschst alle Items und kopierst alle des aktuellen Dokuments hinein. Das birgt aber die Gefahr, dass der Benutzer gleichzeitig zwei Dokumente im Bearbeitenmodus hält und die Daten gegenseitig überschrieben werden. Müsstest dafür mit einem Flag arbeiten, ob das Dokument aktiv ist.

Die Selektionsformeln in den Ansichten änderst Du so, dass note_histories mit Usernamen in den Ansichten nicht angezeigt werden.

MM85

  • Gast
Re: Komplettes Dokument im Hintergrund temporär vorhalten
« Antwort #2 am: 03.09.12 - 11:16:51 »
Hi Peter,

vielen Dank für die Antwort. Das klingt schon mal sehr hilfreich. Für das Setzen des Benutzernamens habe ich ja das note_history noch als Referenz...wenn ich dann über einen Agent löschen will, dann muss ich diesem praktisch nur die UNID des neu ersetellten note_history Dokumentes übergeben, oder?!
Ich probier das einfach mal aus... :)

Danke.
Viele Grüsse
Martin

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Komplettes Dokument im Hintergrund temporär vorhalten
« Antwort #3 am: 03.09.12 - 11:19:03 »
Genau so ...

MM85

  • Gast
Re: Komplettes Dokument im Hintergrund temporär vorhalten
« Antwort #4 am: 03.09.12 - 13:38:14 »
soo...also ich hab mich mal an der weiteren Umsetzung des Vorschlages versucht. Leider eher weniger erfolgreich. Wie beschrieben habe ich im PostSave ein Feld "Username", das beim Querymodechange mit dem aktuellen User gesetzt wird, wieder auf "leer" gesetzt. Beim anschließenden doc.Save kommt wieder der gleiche Fehler, wie oben beschreiben (Attachment, etc.)

Kann das sein, dass Notes das Attachment irgendwie nicht in das neue Dokument mit rüberkopiert, sondern nur einen Verweis oder so?

Viele Grüsse
Martin

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Komplettes Dokument im Hintergrund temporär vorhalten
« Antwort #5 am: 03.09.12 - 13:45:32 »
Möglicherweise hängt das Problem damit zusammen, dass das Dokument noch im Speicher ist. Ich würde jetzt probieren, das Dokument (note_history) nicht global zu definieren, sondern nur die UniversalID als String. Im QueryModeChange merkst Du nach dem Speichern nur die UniversalID und im PostSave holst Du das Dokument neu über die ID (Set doc = db.GetDocumentByUnid (id)).

MM85

  • Gast
Re: Komplettes Dokument im Hintergrund temporär vorhalten
« Antwort #6 am: 03.09.12 - 14:04:51 »
Okay sowas in die Richtung habe ich mir schon gedacht. Im Moment habe ich nun den doc.Save im PostSave, nachdem ich den Username wieder herausgenommen habe, weggelassen.
Nun wird das note_history Dokument nicht mehr gespeichert aber im Speicher habe ich ja für den Aufruf des Agents das leere Usernamen Feld. Einziges Problem ist nun halt, dass in den History Dokumenten das Username Feld nicht geleert wird um man somit nicht nachvollziehen kann was "gültige" Versionsdokumente sind.

Ich check das mal mit dem Zugriff per ID.
...


EDIT: Schaut gut aus! Die Dokumente werden beim Speichern des Hauptdokuments als Versionsdokument angelegt und beim Abbrechen nicht gespeichert.


EDIT 2: ich hab jetzt noch mal ein paar Tests gemacht und die sehen auch ganz gut aus. Über das Flag zur Versionierung im ProjektDokument kann nun gesteuert werden, ob man die Docs speichern will oder nicht. Vielen Dank für die Unterstützung!

« Letzte Änderung: 03.09.12 - 14:30:50 von MM85 »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz