Domino 9 und frühere Versionen > ND8: Entwicklung
Update eines RichTextField
rambrand:
Hallo,
ich möchte ein reines Ansichtsdokument (wird nicht gespeichert) erstellen in dem ein Abgleich durchgeführt wird.
Dazu rufe ich über die Gliederung direkt die Maske des Dokuments auf.
Über Postopen durchlaufe ich eine Ansicht (Softwareliste) lese in einer anderen Ansicht (Installierte Software) die jeweilige Anzahl der Dokumente aus. Das gleiche ich mit einer weiteren Ansicht (Lizenzansicht) ab. Dann ziehe ich pro Software die Anzahl vorhandener Installationen von der Anzahl vorhandener Lizenzen ab. Dabei kommt ein positiver oder negativer Wert heraus.
Soweit funktionierte alles.
Jetzt kam aber der Extra-Wunsch: Negative Zahlen in rot, positive Zahlen in schwarz.
Also muss das Feld in das die Differenzen abgebildet werden ein RichText-Feld sein.
Ich musste dann lernen, dass Änderungen im RT im Backend nicht ins Frontend übertragen werden.
Daher hab ich im Internet recherchiert und fand ich einen Tipp, bei dem man ein Dummy-Dokument erstellt, dort das RT-Feld befüllt, dann auf das UIDocument des Dummys zugreift, den Inhalt des RT in die Zwischenablage kopiert. Dann geht man in das UIDocument des eigentlichen Dokuments und pasted dort den Inhalt der Zwischenablage hinein.
Funktioniert alles bis zum Paste. Sobald ich Call uidoc.paste ausführe erhalte ich den Fehler "Dokumentbefehl ist nicht verfügbar".
--- Code: ---Sub Postopen(Source As Notesuidocument)
Dim session As New NotesSession
Dim uiws As New NotesUIWorkspace
[ ... einiges an Code für die Listenerstellung ... ]
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim dummydoc As NotesDocument
Dim uidoc As NotesUIDocument
Dim dummyuidoc As NotesUIDocument
Dim dummyrt As NotesRichTextItem
Dim richStyle As NotesRichTextStyle
Set richStyle = session.CreateRichTextStyle
Set db = session.CurrentDatabase
Set uidoc = uiws.CurrentDocument
Set dummydoc = db.CreateDocument
dummydoc.form="FormLizenzabgleichDummy"
dummydoc.saveoptions = "0"
Set dummyrt = New NotesRichTextItem(DummyDoc,"DummyRT")
[ ... Code zur Erstellung der Listen ... ]
For i = 0 To (Ubound(swliste)-1)
Set swcoll = swview2.GetAllDocumentsByKey(swliste(i))
str_swliste = str_swliste & Cstr(swliste(i)) & Chr(13)
str_installationen = str_installationen & Cstr(swcoll.Count) & Chr(13)
str_lizenzen = str_lizenzen & Cstr(dummylic) & Chr(13)
str_differenz = str_differenz & Cstr((dummylic - swcoll.Count)) & Chr(13)
If ((dummylic-swcoll.count) <0) Then
richStyle.NotesColor = COLOR_RED
Else
richStyle.NotesColor = COLOR_BLACK
End If
Call dummyrt.AppendStyle(richStyle)
Call dummyrt.AppendText(Cstr(dummylic-swcoll.Count))
Call dummyrt.AddNewline(1)
Next
Call dummyrt.Update
[ ... damit ist das RT im DummyDokument vollständig ... ]
Set dummyuidoc = uiws.EditDocument(True,DummyDoc)
Call dummyuidoc.GotoField("DummyRT")
Call dummyuidoc.SelectAll
Call dummyuidoc.Copy
Call dummyuidoc.Close(True)
uidoc.EditMode = True
Call uidoc.GotoField("licabgl_differenz")
Call uidoc.Paste '<-- hier knallt es dann
Call uidoc.Refresh
End Sub
--- Ende Code ---
In der Beschreibung (http://searchdomino.techtarget.com/tip/Dynamically-update-Lotus-Notes-rich-text-fields-using-LotusScript) die ich angewandt habe, wurde das ganze über einen Button gelöst. Liegt das generell am Postopen?
Bye,
Markus
klaussal:
Warum nimmst du keine zwei Felder (eins mit roter Schrift, das andere in schwarz) und versteckst das eine oder andere je nach Ergebnis ?
rambrand:
Hallo Klaus,
das Problem ist, die Listen sind dynamisch. Da können irgendwann, was weiss ich wieviel an Elemente kommen.
Da Notes keine dynamischen Tabellen kennt, habe ich mir beholfen, indem ich mit 4 Feldern auskommen. SW-Name, Installationen, Lizenzen als Textfelder, dort werden alle Werte in einem String angezeigt. Jedem Wert folgt ein Zeilenumbruch, so bekomme ich eine schöne (dynamische) Liste. Das RT-Feld wollte ich genauso aufbauen.
Daher kann ich das nicht über Verbergen lösen.
Bye,
Markus
Peter Klett:
Ich gehe mal davon aus, dass Dein Feld "licabgl_differenz" nicht bearbeitbar ist, oder?
Wenn Dein Dummydokument das enthält, was Du anzeigen willst, und das was Du zeigen willst, sowieso nicht gespeichert werden soll, warum kopierst Du es vom Dummydokument in das andere, anstatt das Dummydokument einfach zu öffnen?
Ist in dem Dummydokument überhaupt irgendetwas sichtbar, was kopiert werden kann? Eventuell kommt auch daher der Fehler, dass Du nichts in die Zwischenablage kopierst und dieses Nichts dann einfügen willst. Da könnte auch solch eine Fehlermeldung bei herauskommen.
Haben die Benutzer in der Datenbank Autorenrechte und dürfen Dokumente erstellen? Dann würde ich ein Dokument im Hintergrund komplett erstellen lassen, speichern und danach im Lesemodus öffnen. Beim nächsten Mal suchst Du wieder das Dokument, löschst das Richtextfeld und rechnest es erneut. Dann hast Du immer ein Dokument in der Datenbank, das nirgendwo angezeigt wird (könnte z.B. auch ein Profildokument sein). In dieses Dokument packst Du noch ein Autorenfeld mit einem "*", damit jeder Benutzer, der Autorenrechte hat, dieses Dokument bearbeiten kann.
Bei nur Leserecht könnte das Dokument über einen Agent per Agent.RunOnServer erstellt und aktualisiert werden.
rambrand:
Guten Morgen Peter,
Danke für die Tipps. Bei Deiner Frage, dass das Feld nicht bearbeitbar ist, gehe ich davon aus, das hat eine gewisse Bedeutung? Es steht auf Berechnet. Als immer noch (ambitionierter) Laie, was hätte es hier für eine Auswirkung, wenn es auf Bearbeitbar stehen würde?
Inhalt hatte das RT-Feld im DummyDoc, hab ich im Debugger geprüft.
Ich war da wohl mal wieder auf dem umständlichen Weg unterwegs. Warum einfach wenn es auch kompliziert geht. Die Idee mit dem Profildokument klingt gut. Das werde ich jetzt so machen.
Bye,
Markus
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln