We came across a situation where we needed to be able to count how many attachments were in a rich text field in LotusScript.
Scenario – We had a table with four tabbed rows. In each tab was a rich text field (which was hidden unless user clicked on tab). We needed a way of viewing how many attachments (if any) each rich text field was holding without clicking on each tab to see.
The below function CountAttachmentsRTF takes in two arguments, a NotesDocument variable, and a rich text field name as a string.
This function depends on the function IsRtfMT. This Function can be found at https://searchdomino.techtarget.com/tip/Check-Rtf-Field-Empty-New-One-Which-Works.
The Function CountAttachmentsRTF returns an integer which is equal to the total attachments in the provided rich text field.
Function CountAttachmentsRTF (doc As NotesDocument, rtfFieldName As String) As Integer '------------------------------- ' Functionality: Counts how many attachments a Rich Text Field holds. ' Author: Adrian Marikar ' Company: Domino People Ltd ' Date: 12/02/2020 ' Dependency ' IsrtfMT function (https://searchdomino.techtarget.com/tip/Check-Rtf-Field-Empty-New-One-Which-Works) '------------------------------- ' Error handling: https://www.polymorph.co.uk/content/blog-posts/lotusscript-error-handling-in-a-structured-manner/ ' Use any error handling method you like. If True Then Dim AttachmentsField As Variant Dim counter As Integer try: On Error Goto catch Set AttachmentsField = doc.GetFirstItem(rtfFieldName) counter% = 0 'Use isrtfMT function to validate if rtf is not empty i.e. has attachments or text If isrtfMT(doc, rtfFieldName) = 0 Then If Isarray(AttachmentsField.EmbeddedObjects) Then ' Isarray validates for attachments ignoring embedded text Forall att In AttachmentsField.EmbeddedObjects If att.Type = EMBED_ATTACHMENT Then counter% = counter + 1 End If End Forall Else counter = 1 'If embedded text only, then add 1 to counter. End If End If Else catch: On Error Goto 0 ' Displays error details to user 'Turn on for debugging ' Msgbox "Fn: CountAttachmentsRTF" & " ERROR: " & Error$ & " (" & Err & ") on line " & Erl ' handle the error Select Case Err Case Else ' an error I can't handle here so pass back to caller Error Err, Error$ End Select Resume finally End If finally: CountAttachmentsRTF = counter ' return counter (integer) End Function
Function IsrtfMT (doc As Notesdocument , FieldName As String) As Integer ' Purpose: This function checks if a rich text field is empty ' Origin: This function is taken from https://searchdomino.techtarget.com/tip/Check-Rtf-Field-Empty-New-One-Which-Works ' Error handling: https://www.polymorph.co.uk/content/blog-posts/lotusscript-error-handling-in-a-structured-manner/ ' Use any error handling method you like. If True Then Dim mbdcount As Integer Dim plaintext As String Dim rtitem As Variant try: On Error Goto catch ' do some code mbdcount =0 ' initialize Set rtitem = doc.GetFirstItem(fieldname) If ( rtitem.Type = RICHTEXT ) Then plainText = rtitem.GetFormattedText( False, 0 ) ' render the Rich item into text this gets all text values and ignores attachments/OLE If Len(plaintext) < 1 Then If Isarray(rtitem.EmbeddedObjects) Then Forall o In rtitem.EmbeddedObjects ' loop through array of embedded objects in the rich text item mbdcount=mbdcount+1 ' there is at least one emb object End Forall End If End If End If Else catch: On Error Goto 0 'Turn on for debugging 'Msgbox fnName & " ERROR: " & Error$ & " (" & Err & ") on line " & Erl ' handle the error Select Case Err Case Else ' an error I can't handle here so pass back to caller Error Err, Error$ End Select Resume finally End If finally: If (mbdcount + Len(plaintext)) < 1 Then ' if there are no embedded objects AND there is no text also IsrtfMT=1 ' return flag to calling string RTF IS EMPTY Else IsrtfMT=0 ' return flag to calling string RTF IS NOT EMPTY End If End Function
Example Usage
Step 1. Create a new Notes application (.NSF) and create a new form similar to form in screenshot below. Set up a form similar to below in designer. Important thing is to have at least one rich text field and one result field to display the count. Make the txt_Result fields computed.
Step 2. Add both functions to target form’s “Objects” so that they show in Objects window as in screenshot below. You can do this by clicking on Initialize and pasting the functions outside of the Sub tags.
Step 3. Paste below code into Initialize Object of target form. This code runs when form is opened for either viewing or editing. If you changed field names or added more/less fields in the form creation step, then please update code to reflect your form.
Sub Initialize If True Then try: On Error Goto catch Dim ws As New NotesUIWorkspace Dim doc As NotesDocument Dim uidoc As NotesUIDocument Set uidoc = ws.CurrentDocument Set doc = ws.CurrentDocument.Document If Not ( uidoc.IsNewDoc ) Then 'replacing txt_Result fields with number of attachments inside the rti_TestRTF fields Call doc.ReplaceItemValue( "txt_Result1",CountAttachmentsRTF(doc, "rti_TestRTF1") ) Call doc.ReplaceItemValue( "txt_Result2",CountAttachmentsRTF(doc, "rti_TestRTF2") ) End If catch: On Error Goto 0 'Displays error details to user ' Ignoring this error on purpose! ' Msgbox "Form: LicenseHCL, Sub: Initialize" & " ERROR: " & Error$ & " (" & Err & ") on line " & Erl Select Case Err Case 0: Exit Sub Case Else Error Err, Error$ End Select Resume finally End If finally: 'Dummy edit/de-edit - This shows value of computed field in UI without having Edit and Save. Call ws.Currentdocument.Close(True) Call ws.EditDocument(False, doc) End Sub
Step 4. Preview form in Notes and fill in fields, placing attachments/text into fields. Ctrl+S to save (if you have not created Save Action button). You can now close the form.
Step 5. Create a view that displays the txt_Name field in first column. Preview this view. Double click on the document that we created earlier.
As you can see, the counter counts the three PDFs in the first rich text field as 3 and counts the two lines of text as 1. We can now count the attachments in a rich text field in LotusScript.
EDIT: Please note that the lines of text being counted as 1 was a special use case for ourselves. We needed to know if any text existed in rich text field even if there were no embedded attachments. If you do not need this functionality, please comment out line 32 of CountAttachmentsRTF function i.e. counter = 1 ‘If embedded text only, then add 1 to counter.
Best regards,
Adrian Marikar – Domino People Ltd
Lars says:
I cannot follow the logic of two lines of text being equal to one attachment.
Please explain.
Adrian Marikar says:
Hi, Lars. Thank you for pointing this out. I have now updated post. We wanted to know if any text existed in RTI even if there were no embedded attachments. Thanks again. Maybe see you at Engage đŸ™‚