Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: BMWTordi am 09.08.07 - 10:54:45
-
Guten Tag zusammen
Mit Richtextfeldern hab ich es aber auch die letzte Zeit. Ich habe eine Datenbank in denen ich mir Textbausteine abspeichere die ich dann in anderen Dokumenten einfügen kann. Klappt auch wunderbar.Aber sobald ich Bilder in meine Textbausteine einfüge wird in meine Dokumente nurnoch der Text übernommen der nach den Bildern steht. Alles was vor den Bildern steht übernimmt meine Funktion nicht in mein neues Dokument. Weiß jemand was das sein kann?
Hier mal der abgespeckte code der Funktion/Agent:
Sub Initialize
On Error Goto ErrorHandler
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
Dim doc As NotesDocument
Set doc = uidoc.Document
Call uidoc.Save
Dim rtfield As String
rtfield = uidoc.CurrentField
Dim item As NotesItem
Set item = doc.GetFirstItem(rtfield)
If Not item.Type =1 Then
meld = |Diese Funktion kann nur im einem Richtextfeld genutzt werden !|
Messagebox meld, 16, "Abbruch"
Exit Sub
End If
Dim col As NotesDocumentCollection
Set col = ws.PickListCollection( 3, False, stdb.Server, stdb.FilePath, "Textbausteine", "Textbaustein-Auswahl", "Bitte wählen SIe einen Textbaustein." )
If col.Count = 0 Then Exit Sub
Dim tbdoc As NotesDocument
Set tbdoc = col.GetFirstDocument
Dim tbrtitem As NotesRichTextItem
Set tbrtitem = tbdoc.GetFirstItem( "Textbaustein" )
Dim rtitem As NotesRichTextItem
Set rtitem = doc.GetFirstItem(rtfield)
If rtitem Is Nothing Then Set rtitem = doc.CreateRichTextItem( rtfield )
Call rtitem.AppendRTItem(tbrtitem)
Call uidoc.Save
Call ReOpenDocument( doc )
Call uidoc.GotoField(rtfield)
Call uidoc.Refresh( True )
Exit Sub
ErrorHandler:
If Err = 4411 Then
Exit Sub
Else
Msgbox "Error: " + Chr( 9 ) + Cstr( Err ) + " " + Error( Err ) + Chr( 13 ) + "in Line: " + Chr( 9 ) + Cstr( Erl ), 16, "Critical Error"
Exit Sub
End If
End Sub
-
Ich tippe auf einen Bug in der Implementierung von appendRTItem. Kann mich dunkel daran erinnern, dass ich mich mal vor über 2 Jahren damit rumgeschlagen habe.
Versuch die Geldgeber des Projekts irgendwie zu überzeugen MIDAS RichText eine Chance zu geben.
(http://www.geniisoft.com/showcase.nsf/MidasLSX)
Sowas kann ja getestet werden. Der Mann, der dahinter steht, hat einen guten Namen in der Lotus Community und auch bei IBM Entwicklern. Ich konnte damals meinen Projektsponsor nicht dazu überzeugen. Verstanden hab ich die Entscheidung nicht.
Gruß Axel
-
Danke für den Hilfreichen Tip. Komischerweise hatten wir vorher eine Funktion bei der das einwandfrei funktioniert Hat. Problem war allerdings folgendes:
Ich habe meinen Textbaustein eingefügt und an den leerstellen in meinem Textbaustein hab ich dann noch mauell einige Eintragungen (wie Name oder Datum) gemacht. Nach dem Abspeichern waren diese manuellen Eintragungen jedoch immer wieder verschwunden und es war wieder nur der Blankotextbaustein abgespeichert.
Sub Click(Source As Button)
Dim tbs As New NotesSession
Dim tbuiws As New NotesUIWorkspace
Dim tbuidoc As NotesUIDocument
Set tbuidoc = tbuiws.CurrentDocument
Dim tbdb As NotesDatabase
Set tbdb = tbs.CurrentDatabase
Dim tburdoc As NotesDocument
Dim tbview As NotesView
Dim tbdoc As NotesDocument
Set tbdoc = tbuidoc.Document
Dim tbfname As NotesItem
Dim tbanschrift As Variant, tbname2 As Variant, flag As Variant, tbform As Variant
Dim tbrtitemA As NotesRichTextItem, tbrtitemB As NotesRichTextItem
Dim tbschalter As Variant
tbschalter = tbs.GetEnvironmentString( "$EnvCompanySchalter" )
Dim sperrdok As NotesDocument
Set sperrdok = tbdb.GetProfileDocument("tbsperr", tbs.UserName)
sperrdok.merker = "xxxx"
Call sperrdok.Save(True, True)
Dim rtfield As String, meld As String
rtfield = tbuidoc.CurrentField
Dim rtflist As NotesItem
Set rtflist = tbdoc.GetFirstItem( "rtflist" )
If rtflist.Contains( rtfield) Then
Dim ndbname As String
ndbname = "offstamm.nsf"
Dim ndb As NotesDatabase
Dim openflag As Variant
openflag = otherdb(ndbname, tbdb, ndb)
If Not openflag = False Then
Dim tbQuery As Variant
Dim tbadr As Variant
tbanschrift = tbdoc.Anschrift
tbname2 = tbdoc.Name2
flag = tbuiws.DialogBox( "AuswahlTB", True, True, False, False, False, False, "Textbaustein-Auswahl", tbdoc, True, False, True)
If flag = False Then Exit Sub
tbQuery = Right(tbdoc.help(0),16)
tbuidoc.save
Set tbdoc = tbuidoc.Document
tbdoc.Form = tbuidoc.FieldGetText("Formalias")
Set tbrtitemA = tbdoc.GetFirstItem(rtfield)
If tbrtitemA Is Nothing Then Set tbrtitemA = tbdoc.CreateRichTextItem( rtfield )
If Not ndb Is Nothing Then
If ndb.isopen Then
Set tbview = ndb.GetView( "(tbbyid)" )
Set tburdoc = tbview.GetDocumentByKey( tbQuery, True)
Set tbrtitemB = tburdoc.GetFirstItem( "Textbaustein" )
Call tbrtitemA.AppendRTItem(tbrtitemB)
Set tbfname = tbdoc.getfirstitem("tb_formname")
If tbdoc.tb_formname(0) = "" Then
tbdoc.tb_formname = tburdoc.tb_formname(0)
Else '// If tbdoc.tb_formname(0) = "" Then
Call tbfname.AppendToTextList(tburdoc.tb_formname(0))
End If '// If tbdoc.tb_formname(0) = "" Then
Call tbdoc.Save(True, True)
Call tbuidoc.FieldSetText("SaveOptions","0")
Call tbuidoc.Close
Set tbuidoc = tbuiws.EditDocument(True, tbdoc)
Set tbuidoc = tbuiws.CurrentDocument
Call tbuidoc.FieldSetText("SaveOptions","1")
Call tbuidoc.GotoField(rtfield)
Call tbuidoc.Refresh( True )
End If '// If ndb.isopen Then
End If '// If Not ndb Is Nothing Then
End If '// If tbadr = "" Then
End If '// If Not openflag = False Then
Else '// If rtflist.Contains( rtfield) Then
meld = |Diese Funktion kann nur im einem Richtextfeld genutzt werden !|
Messagebox meld, 16, "Abbruch"
End If '// If rtflist.Contains( rtfield) Then
sperrdok.merker = ""
Call sperrdok.Save(True, True)
End Sub
-
Also...hab nach rumprobieren den Fehler gefunden. Ich darf das Uidoc nicht abspeichern. Ich verstehe zwar nicht warum aber so geht es dann....
Call rtitem.AppendRTItem(tbrtitem)
' Call uidoc.Save <------ muss raus
Call ReOpenDocument( doc )
Call uidoc.GotoField(rtfield)
Call uidoc.Refresh( True )
Exit Sub
-
Ist doch klar. Du änderst im Background das Dokument und speicherst dann das Frontend-"Ergebnis" drüber. Die Änderungen aus dem Background sind dann natürlich futsch.
-
Naja sie waren ja nicht futsch. Aber theoretisch müsste ich das uidoc speichern damit die Feldvalidierungen durchlaufen.
PS: wie wir grad rausgefunden haben funktioniert es wenn ich das uidoc speichere bevor ich das rtitem anhänge.
-
Was ist daran unklar ?
Du hast quasi zwei Instanzen eines Dokumentes. Die eine hast Du als Backend (doc) und die andere als Frontend (uidoc).
Beide Instanzen haben das Item "Body". Im doc setzt Du es explizit, im uidoc wird es beim Speichern durch die Maske vorgegeben.
Der Ablauf ist dann folgendermaßen :
- doc : Item Body wird gesetzt und gefüllt
- uidoc : Save -> Item Body wird mit dem gefüllt, was im Frontend in der Maske im Body eingetragen wurde
- doc : Reopen -> doc wird geöffnet als uidoc, Body entspricht dem, was in Schritt 2 über uidoc gespeichert wurde
-
Das verstehe ich schon. Aber es erklärt nicht warum das richtextfeld nur mit der Hälfte der Informationen gefüllt war.
-
Ahso, sorry. Ich hab mir nicht den ganzen Thread durchgelesen ;)