Auf Dokumentation zu stützen, ist irgendwie nicht mein Ding, deshalb habe ich mal folgendes ausprobiert, wobei das verwendete doc ein TextItem namens Form, ein RichtextItem namens Body und kein Item Body2 enthält.
| Sub Initialize |
| Dim session As New NotesSession |
| Dim db As NotesDatabase |
| Set db = session.CurrentDatabase |
| Dim view As NotesView |
| Set view = db.GetView ("test") |
| Dim doc As NotesDocument |
| Set doc = view.Getfirstdocument |
| Dim rtitem As NotesRichtextItem |
| Set rtitem = doc.GetFirstItem ("Body") |
| MsgBox rtitem.Name |
| End Sub |
-> gibt "Body" als Msgbox aus
| Sub Initialize |
| ... |
| Dim rtitem As NotesRichtextItem |
| Set rtitem = doc.GetFirstItem ("Body2") |
| MsgBox rtitem.Name |
| End Sub |
-> gibt ein Object variable not set in der MsgBox-Zeile
| Sub Initialize |
| ... |
| Dim rtitem As NotesRichtextItem |
| Set rtitem = doc.GetFirstItem ("Form") |
| MsgBox rtitem.Name |
| End Sub |
-> gibt ein type mismatch in der Set rtitem ... - Zeile
Also kann ein NotesRichtextItem definitiv ein doc.GetFirstItem, Voraussetzung ist, dass das Item existiert und ein RichtextItem ist, oder eben nicht existiert. Existiert es und ist kein RichtextItem, kommt das type mismatch.
Nun zu Lordi's Code:
1. Mit If doc.HasEmbedded prüfst Du nur, ob in dem DOKUMENT Anhänge vorhanden sind, diese können aber an jedem beliebigen anderen Richtextfeld sein
2. Es ist völlig irrelevant, ob in der MASKE das Feld "Userpicture" ein RichtextItem ist, entscheidend für Deine Routine sind die DOKUMENTE. Schau also in den Dokumenteigenschaften nach, welcher Typ Item gespeichert ist. Da Du über mehrere Dokumente läufst, genügt ein Dokument, bei dem Userpicture ein Textitem ist, und schon bekommst Du den Fehler
-> Exkurs zum Verständnis: Du erstellst in der Maske ein neues Feld Userpicture als Textfeld. Danach erstellst Du mit der Maske ein paar Dokumente, die dadurch ein Textitem Userpicture enthalten. Anschließend änderst Du in der Maske das Feld in ein Richtextfeld. Diese Änderung hat keinen Einfluss auf danach nicht neu im Frontend gespeicherte Dokumente! Notes ist keine relationale Datenbank, bei der Feldänderungen in einer Tabelle erfolgen, die dann gnadenlos drübergebügelt werden, Notes ist dokumentenbasiert und tickt da ganz anders. Auch andere Routinen können in Dokumente Items schreiben, die in der Maske entweder nicht oder ganz anders definiert sind. Das ist die totale Freiheit, verlangt aber eine andere Denkweise des Entwicklers
Du musst also prüfen, ob es sich tatsächlich um ein Richtextitem handelt. Dazu ist eine Möglichkeit, rtitem als Variant zu deklarieren und dann abzuprüfen, ob es sich wirklich um ein RichtextItem handelt (-> siehe Hilfe zu notesItem.Type)
3. Wenn Du wirklich prüfen willst, ob ein RichtextItem Dateianhänge hat, musst Du prüfen, ob EmbeddedObjects ein Array ist. Deshalb knallt Deine Forall-Zeile, weil Du durch ein Nichtarray loopen willst
| If IsArray (rtitem.EmbeddedObjects) Then |
| Forall obj ... |
| End Forall |
| End If |