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:
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
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:
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 ;)