Saturday, June 19, 2010

Sort Lotus Notes document collection

Using this Lotus Script code, I can sort a Lotus Notes document collection using a specified field, such as text/date/number, as the key.

This example shows entries in ascending order, but the array sort within the function can be extended.

Note: The comment within the code explains what happens as the code goes into effect.

Function SortDocumentCollection(dc As NotesDocumentCollection, strKeyFieldName As String) As NotesDocumentCollection

%REM
dc a populated document collection that you what to sort
strKeyFieldName the field in the document that will be used as a key in the sort
%END REM

Dim session As New NotesSession
Dim db As NotesDatabase
Dim sdc As NotesDocumentCollection
Dim doc As NotesDocument
Dim itemSorKey As NotesItem
Dim a As Integer, b As Integer, c As Integer, moved As Integer
Dim varSorKey As Variant

Dim tmparray As SortingArray

%REM
in the declaration set-up the following custom class Type SortingArray
sortkey As Variant
unid As String
End Type
%END REM

Set db = session.CurrentDatabase

%REM
by creating a profile document collection for a form that dose not exist in the database create a document collection with no document in, this is used later to hold the sorted results.
%END REM
Set sdc = db.GetProfileDocCollection("$$Blank-DocumentCollection")

a% = 0

REM loop through document collection.
Set doc = dc.GetFirstDocument
Do While Not(doc Is Nothing)

Set itemSorKey = doc.GetFirstItem(strKeyFieldName)

REM check the sork key field item existes.
If itemSorKey Is Nothing Then
REM if not set the sort key to blank.
varSorKey = ""
Else
REM else set the sort key to the fiest value in the sort key item.
varSorKey = itemSorKey.values(0)
End If

REM populate custom class.
Redim Preserve array(a%) As SortingArray
array(a%).sortkey = varSorKey
array(a%).unid = doc.UniversalID

REM get the next document.
Set doc = dc.GetNextDocument(doc)
a% = a% + 1
Loop

REM sort sort the array.
b% = 0
moved% = True

Do Until Not moved%
moved% = False

REM assending sort.
For b% = 0 To Ubound(array) - 1
If array(b%).sortkey > array(b% + 1).sortkey Then
tmparray = array(b%)
array(b%) = array(b% + 1)
array(b% + 1) = tmparray
moved% = True
End If
Next
Loop

REM populate the blank document collection (sdc) in sorted order.
For c% = 0 To Ubound(array)
Set doc = db.GetDocumentByUNID(array(c%).unid)
Call sdc.AddDocument(doc)
Next

REM return the sorted document collection.
Set SortDocumentCollection = sdc

End Function

6 comments:

  1. Thanks for the code.

    Quick tip for those who want to sort collections from a database which is different to the one the code is running in

    replace: Set db = session.CurrentDatabase
    with: Set db = dc.Parent

    ReplyDelete
  2. Hi,
    Thanks for the code ,

    %REM
    in the declaration set-up the following custom class Type SortingArray
    sortkey As Variant
    unid As String
    End Type
    %END REM

    Can you explain how to declare this,I am unable to do it.Please help me on this

    Thanks

    ReplyDelete
    Replies
    1. In the declaration type:

      Type SortingArray
      sortkey As Variant
      unid As String
      End Type

      Delete
  3. Pinched from http://searchdomino.techtarget.com/tip/LotusScript-sorts-a-Lotus-Notes-document-collection eh ?

    ReplyDelete
  4. Alternative / Original? http://blog.tjitjing.com/index.php/2006/05/how-to-sort-notesdocumentcollection-in.html

    ReplyDelete
  5. Great and that i have a nifty provide: How To Reno A House house renovation budget template

    ReplyDelete