Hallo,
ich möchte gerne beim Speichern eines (neuen oder bestehenden) Dokumentes ein Richtextfeld (Anmerkung) in ein anderes RichTextfeld (Historie) kopieren und das erste löschen. Der einzufügende Inhalt soll von einem Abschnitt umgeben werden.
Hier der Code im QuerySave Event der Maske:
Dim session As New Notessession
Dim doc As NotesDocument
Dim rtianm As Variant
Dim rtidet As NotesRichTextItem
Set doc = source.document
Set rtidet = doc.GetFirstItem("Historie")
If rtidet Is Nothing Then
Set rtidet = New NotesRichTextItem (doc, "Historie")
End If
Set rtianm = doc.GetFirstItem ("Anmerkung")
If Not rtidet Is Nothing Then
If (Len(rtianm.values > 0)) Then
Call rtidet.BeginSection(Now() & " - " & session.CommonUserName)
Call rtidet.AppendRTItem(rtianm)
Call rtidet.EndSection()
Call doc.RemoveItem("Anmerkung")
End If
End If
Call doc.Save(False, True)
Der Code funktioniert soweit und im Debugger habe ich auch gesehen, dass der Inhalt übernommen und das Dokument gepeichert wird, denn nach dem doc.Save gibt es in der doc Instanz ein Item "Historie" mit den gewünschten Inhalten. Bereits im nächsten Event (PostSave) ist aber die Variable doc wieder in dem Zustand vor dem Speichern.
Ich guck mir Lotus Script grad seit ca. 1 Jahr mal wieder an und hab vermutlich irgendwas grundlegendes vergessen. Nur was?!!?
Vielen Danke,
Mirko
Hm.. Da ich bei der Nutzung des QueryClode einen Fehler erhalte (soll hier aber erstmal egal sein) und den Beitrag von Bernhard verstehen möchte, habe ich die Historisierung mal ins QuerySave eingebaut um den Code zusammenzuhalten.
Wenn ich im QuerySave das Notesdocument in NotesUiDocument.document verändere schreibst du ja, dass die Änderungen erst wieder ins notesuidocument übernommen werden, wenn es per reopen dazu manuell bewegt wird.
Trifft das für alle Backendänderungen zu? Kann ich also das NotesDocument nach Lust und Laune ändern, danach das NotesUiDocument.Reload und die Änderungen im Backend werden durch das Speichern übernommen? Wohl gemerkt: Ich befinde mich im QuerySave...
Dieses Stück Code funktioniert so nämlich nicht:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
'Historisierung
Dim doc As NotesDocument
Dim rtianm As Variant
Set doc = source.document
Set rtianm = doc.GetFirstItem ("Anmerkung")
If Not rtianm Is Nothing Then
'Historisierung durchführen
Dim session As New Notessession
Dim rtihis As NotesRichTextItem
Dim rtstyle As NotesRichTextStyle
Dim rtnav As NotesRichTextNavigator
Dim leer As Variant
'Historiefeld initialisieren
Set rtihis = doc.GetFirstItem("Historie")
If rtihis Is Nothing Then
Set rtihis = New NotesRichTextItem (doc, "Historie")
End If
'Einfügeoperator an den Beginn des Historie-Items setzen.
Set rtnav = rtihis.CreateNavigator
If rtnav.FindFirstElement(3) Then
leer = False
Else
leer = True
End If
If Not leer Then Call rtihis.BeginInsert(rtnav)
'Content einfügen
Set rtstyle = session.CreateRichTextStyle
rtstyle.fontsize = 8
rtstyle.Bold = True
Call rtihis.AppendStyle(rtstyle)
Call rtihis.AppendText (Now() & " - " & session.CommonUserName)
Call rtihis.AddNewLine (1)
Call rtihis.AppendRTItem(rtianm)
Call rtihis.AddNewline (2)
'Abschlussarbeiten
If Not leer Then Call rtihis.EndInsert()
Call doc.RemoveItem("Anmerkung")
'[1] Speichern ?!?
End If
Call source.Reload
'[2] Im Debugger alles OK.
Call source.Close
End Sub
An der Stelle [2] ist im Debugger im document des source Objektes das Anmerkung Feld wie gewünscht entfernt und in der Historisierung ein neuer Abschnitt eingefügt. Alles bestens. Nach dem Querysave werden keine Routinen im Debugger mehr durchlaufen in denen Code enthalten ist. Wenn ich das Dokument anschliessend öffne, steht der Text immernoch im Feld "Anmerkung" und in der Historie ist nix enthalten ???
Liegt das daran, dass ich das Dokument vorher [1] sichern muss? Bringt jedoch nichts. Oder ist source.reload kein angesprochenes reopen?
Bin auf eure Rückmeldung gespannt,
Mirko