Autor Thema: Richttextitem wird zusätzlich angelegt  (Gelesen 4408 mal)

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Richttextitem wird zusätzlich angelegt
« am: 25.05.11 - 16:03:27 »
Hallo,

ich habe gerade folgendes Problem:
In einer Anwendung gibt es sogenannte Vorgänge quasi als Deckblatt für verknüpfte Dokumente (Verknüpfung erfolgt über Sammlung von IDs in einem Feld). Zu bestimmten Fälligkeiten werden diese Vorgänge beendet und mit neuen Fälligkeiten neu angelegt. Dabei soll der Inhalt eines Richtextfeldes ("Bemerkung") weitervererbt werden, wobei es sich um Richtextinhalte verschiedener alter Vorgänge in einem neuen Vorgang handeln kann.

Hier ein Auszug aus der Methode:
Code
With oAktDoc 'aktuelles Dokument
 If Not .IsUIDocOpen Then 'Methode wird auch aus dem Frontend heraus verwendet, folgender Code soll dann aber nicht ausgeführt werden, sondern nur bei täglicher Hintergrundaktualisierung (wg. Richtext & Frontend / Backend = nicht so einfach)
  Dim oAktivDocOLD As NotesDocument, oVorgangDocOLD As NotesDocument
  Dim oBemerkungOLD As NotesRichTextItem, oBemerkungNEW As NotesRichTextItem
  Dim bRTvorhanden As Boolean
  For n = 0 To Ubound(oAryDoc) 'oAryDoc ist eine Liste von Notes-Dokumenten, die mit dem aktuellen Vorgang verknüft sind
   On Error Resume Next
   Set oAktivDocOLD = oDB.GetDocumentByUNID(oAryDoc(n).DocUniqueID_Master_Old(0))
   If Not oAktivDocOLD Is Nothing Then _
   Set oVorgangDocOLD = oDB.GetDocumentByUNID(oAktivDocOLD.DocUniqueID_Master(0))
   On Error Goto processError
   If Not oVorgangDocOLD Is Nothing Then
    If .UniversalID <> oVorgangDocOLD.UniversalID Then
    'Prüfen, ob Daten des OldVorgangs bereits übernommen (dazu wird eine Liste im akt. Vorgang geführt)
     bRTvorhanden = False
     If .hasitem("DocUniqueID_UebernBem") Then
      If Not Isnull(Arraygetindex(.DocUniqueID_UebernBem, oVorgangDocOLD.UniversalID)) Then _
      bRTvorhanden = True
     End If
     If Not bRTvorhanden Then
      Set oBemerkungOLD = oVorgangDocOld.GetFirstItem("Bemerkung")
      Set oBemerkungNew = .getfirstitem("Bemerkung")
      If Not oBemerkungOLD Is Nothing Then
       If oBemerkungOLD.Type = 1 And oBemerkungOLD.Text <> "" Then
        If oBemerkungNew Is Nothing Then
         Set oBemerkungNew = .createrichtextitem("Bemerkung")
        Else
         If oBemerkungNew.Text <> "" Then oBemerkungNew.AppendText(Chr(13) & Chr(13))
        End If
        If oVorgangDocOLD.BemerkungLinkSetzen(0) = "1" Then 'Die Anwender können in den Vorgängen bestimmen, ob auch ein DocLink im neuen Vorgang eingetragen werden soll
         oBemerkungNew.AppendText "Bemerkung aus Vorgang " & oVorgangDocOld.VorgangNr(0) & "/" & _
         oVorgangDocOld.TeilNr(0) & " "
         oBemerkungNew.AppendDocLink oVorgangDocOld, "zum Vorgang..."
         oBemerkungNew.AppendText ":" & Chr(13)
         .BemerkungLinkSetzen = "1"
        End If
        oBemerkungNew.AppendRTItem oBemerkungOld
        If .hasitem("DocUniqueID_UebernBem") Then
         .DocUniqueID_UebernBem = Fulltrim(Arrayunique(Arrayappend(.DocUniqueID_UebernBem, oVorgangDocOLD.UniversalID)))
        Else
         .DocUniqueID_UebernBem = oVorgangDocOLD.UniversalID
        End If
       End If
      End If
     End If
    End If
   End If
  Next
 End If 
End With

Jetzt habe ich leider festgestellt, dass ich gelegentlich zwei oder mehr Richtextfelder "Bemerkung" im neuen Vorgangsdokument habe (sichtbar in Eigenschaften Dokument), das erste leer (stammt vermutlich aus der Maske i.V.m. computewithform) und (ein) weitere(s) mit dem übernommen Inhalt. Eigentlich wird .createrichtextitem("Bemerkung") ja nur ausgeführt, wenn das Feld vorher über .getfirstitem nicht gefunden wurde.

Jemand eine Idee, was ich hier übersehen habe? DANKE!



EDIT 26.05.2011 11:05 Daumen hoch
« Letzte Änderung: 26.05.11 - 11:05:43 von marschul »
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #1 am: 25.05.11 - 16:07:15 »
Wenn im geöffneten Dokument alles korrekt angezeigt wird, kannst Du die weiteren Richtextfelder ignorieren. Sowas habe ich in meinen Anwendungen schon seit Jahren immer wieder, ohne dass es zu irgendeinem Problem gekommen ist. Ich denke, es ist die notesinterne Verwaltung der Richtextfelder, die sowas produziert und dann auch damit umgehen kann.

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #2 am: 25.05.11 - 16:21:29 »
Hallo Peter,

das stimmt: Wenn ich ein solches Dok im Client öffne und speichere, existiert anschließend nur noch ein Bemerkungsfeld mit den korrekten Inhalten.

Was in der Praxis nicht vorkommen sollte (obwohl, bei den Spezialitäten im Fachbereich weiß man ja nie...), aber theoretisch denkbar: Wird ein solches Vorgangsdokument nicht angefasst und zu seiner Fälligkeit automatisch beendet, entsteht wieder ein Folgedokument. Dann würde die Routine über .getfirstitem im alten Vorgang (wahrscheinlich???) nur das erste Bemerkungsfeld finden und das ist leider leer. D.h. die Vererbung klappt nur beim ersten Mal. Dumm an der Sache: Das lässt sich nicht eben mal schnell simulieren, da alles ziemlich komplex  :(
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #3 am: 25.05.11 - 16:28:07 »
Das solltest Du mal provozieren und ausprobieren. Ich könnte mir gut vorstellen, dass Notes auch bei mehreren gleichnamigen Richtextfeldern in der Felderliste mit .GetFirstItem klar kommt.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #4 am: 25.05.11 - 16:34:25 »
Natürlich funktioniert NotesDocument.GetFirstItem auch bei mehreren Items gleichen Names. Peter. Und deshalb heisst es auch "Get*First*Item.

Und Notes legt selbst mehrere RT-Items gleichen Namens nur dann automatisch an, wenn die 64kB-Grenze geknackt wird. Alles andere verursacht der Programmierer  ;)

Bernhard

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #5 am: 25.05.11 - 16:49:49 »
Und wieder etwas dazugelernt: Peter hat Recht. Bei RTitems gleichen Namens liefert .getfirstitem tatsächlich ein Objekt zurück, welches den Inhalt all dieser Felder enthält (bei z.B. $File ist das anders).
Damit sind die Sorgenfalten erst einmal beseitigt, wobei nach wie vor nicht klar ist, wodurch das 2. Feld entsteht  ???

Hatte zwischenzeitlich in Verdacht, dass aufgrund der Schleife mit dem wiederholten Set oBemerkungNew = .getfirstitem("Bemerkung") u.U. Nothing herauskommt und deshalb ein weiteres Feld explizit angelegt wird, aber das konnte schnell getestet werden:
Code
Sub Click(Source As Button)
 Dim oWS As New NotesUIWorkspace
 Dim oCurrDoc As NotesDocument
 Dim oRTitem As NotesRichTextItem
 Set oCurrDoc = oWS.CurrentDocument.Document
 Set oRTitem = oCurrDoc.GetFirstItem("Body")
 If oRTitem Is Nothing Then Set oRTitem = oCurrDoc.CreateRichTextItem("Body")
 oRTitem.AppendText "Muff1"
 Set oRTitem = oCurrDoc.GetFirstItem("Body") ' -> Test, ob das soeben angelegte RTitem zurückgegeben wird
 If oRTitem Is Nothing Then
  Set oRTitem = oCurrDoc.CreateRichTextItem("Body")
 End If
 oRTitem.AppendText "Muff2"
 oCurrDoc.Save True, False
End Sub

In das 2. CreateRichTextItem gelangt das Programm NICHT.

Zu provizieren, dass 2 Felder angelegt werden, war übrigens auch nicht so einfach, wie gedacht, ein zweites Create meckert Notes nämlich an. Hab's dann so gemacht, dass ich das UIDoc zuerst speichere (dieses enthält laut Maske ein Body-Feld) und anschließend noch ein Body-Feld im Backend-Doc erstellt und dieses auch gespeichert. Ist Pfui, aber war ja auch nur meine Spielwiesen-DB  ;)
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline TRO

  • Senior Mitglied
  • ****
  • Beiträge: 296
Re: Richttextitem wird zusätzlich angelegt
« Antwort #6 am: 25.05.11 - 16:55:11 »
das ist ein bekanntes Problem, ein

rtitem.Compact

(und eventuell vorher ein rtitem.Update, siehe Designer-Hilfe zu Compact)

hilft da.


Aus der Knowledgebase:

The Document Properties on a Notes document shows two entries for the same Rich Text field (RTF). This issue occurs on documents that use LotusScript to create or update the Rich Text field.  Two or more Rich Text fields will appear in the Document Properties until the document is edited and saved in the front-end or user interface.  Workaround: In Notes/Domino 6.0 the new Compact method (of NotesRichTextItem class) can be used to remove the extra items.

Content

This issue occurs on documents that use LotusScript to create or update the Rich Text field.  Two or more Rich Text fields will appear in the Document Properties until the document is edited and saved in the front-end or user interface.  This issue was reported to Quality Engineering and it was determined that Notes is working as designed.

This issue has been observed with the following methods in Notes 4.5x and later (with the exception noted):

AddNewLine
AppendText
CreateRichTextItem -    Note: This method causes the issue in only Notes 4.5x/4.6.x.
EmbedObject -  Note: This method does not cause the issue in Notes 6.x or 7.x.

AddNewLine example:
Set rtitem=doc.getfirstitem("RTF")
Call rtitem.addnewline(1)

AppendText example:
Set rtitem=doc.getfirstitem("RTF")
Call rtitem.appendtext("add some text")

CreateRichTextItem example:
Call doc.RemoveItem("RTF")
Set rtitem = doc.CreateRichTextItem("RTF")
Call rtitem.AppendText(value)

EmbedObject example:
Set rtitem = New NotesRichTextItem( doc, "Body" )
Set object = rtitem.EmbedObject ( EMBED_ATTACHMENT, "", "c:\work\test.txt")


Note:  You may observe that using the New method with the NotesRichTextItem class will produce only one field entry.  This is actually undesirable as the Item is not properly added to the Document object.  See the related document noted below.

Example:
Call doc.RemoveItem("RTF")
Dim rtitem as New NotesRichTextItem(doc, "RTF")
Call rtitem.AppendText(value)

Workaround:
In Notes/Domino 6.0 the LotusScript Compact method was added to the NotesRichTextItem class.  The method provides the means to compact unused space within Rich Text fields, and during the process unnecessary items of the object are removed.  This method can therefore be used to work around the issue described in this document. Once updates to the NotesRichTextItem are complete the Compact method can then be applied.

Example:
Set rtitem=doc.getfirstitem("RTF")
Call rtitem.appendtext("add some text")
Call rtitem.compact

Note: When using the Compact method it is best to call it after all updates to the NotesRichTextItem have been made, as it will effect the positions of any NotesRichTextNavigator objects, relating to the NotesRichTextItem object, that the code contains.


Supporting Information
In Notes/Domino 6.5 the JavaScript Compact method was added to the RichTextItem class.



               


Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #7 am: 25.05.11 - 17:07:28 »
rtitem.Compact

... ist ein guter Hinweis - Danke! Probier ich morgen früh gleich aus, Züge warten leider nicht... Schönen Abend!
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Richttextitem wird zusätzlich angelegt
« Antwort #8 am: 26.05.11 - 09:40:48 »
rtitem.compact klappt hervorragend  :)

Es lässt sich also festhalten, dass ein über das Frontend gespeichertes RT-Item bei anschließender Bearbeitung im Backend mehrfach im Dokument existiert. Dazu genügt (konnte ich gerade reproduzieren) ein .appendtext, so wie im Beitrag von TRO beschrieben. Wird zum Schluss ein rtitem.compact vor dem Speichern des Backend-Dokuments durchgeführt, exisitert anschließend nur noch ein RT-Item - gem. Bernhards Beitrag natürlich abhängig von der Größe des Inhalts  ;)

Vielen Dank für Eure Unterstützung!
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz