Sub QuickSort( array() As String, LeftBound As Integer, RightBound As Integer ) Dim intLeft As Integer Dim intRight As Integer Dim intPos As Integer Dim strTemp As String Dim strPivot As String intLeft = LeftBound intRight = RightBound intPos = ( intRight + intLeft ) / 2 strPivot = array( intPos ) Do While intLeft <= intRight Do While array( intLeft ) < strPivot intLeft = intLeft + 1 Loop Do While array( intRight ) > strPivot intRight = intRight - 1 Loop If intLeft <= intRight Then strTmp = array( intLeft ) array( intLeft ) = array( intRight ) array( intRight ) = strTmp intLeft = intLeft + 1 intRight = intRight - 1 End If Loop If LeftBound < intRight Then QuickSort( array, LeftBound, intRight ) End If If intLeft < RightBound Then QuickSort( array, intLeft, RightBound ) End If End Sub
Quicksort for a document collection Since getting having an unsorted DocumentCollection is generally a pain, I've written some code that's pretty quick in sorting these documents on the fly. This uses a QuickSort algorithm, instead of the much slower bubble sorts that seem to be floating out here... I actually borrowed the CollectionToArray code from this board a while back, but it also used a bubble sort routine that was way too slow. This code should be able to be used as is. I've used this method in several DB's with no changes since the initial write. The only thing you should have to change is the variable which tells it which field to sort on (explained below)... Sub CollectionToArray ( dc As NotesDocumentCollection) Dim doc As NotesDocument Dim k As Long k = dc.Count If k<>0 Then Redim da( 1 To k+1) As NotesDocument Set doc = dc.GetFirstDocument For i=1 To k Set da(i) = doc Set doc = dc.GetNextDocument(doc) Next End If 'Need to add a value at the end that will always be greater than all other values Set da(k+1) = dirDB.CreateDocument da(k+1).Lastname = "ZZZZZZZZ" End Sub Function swap(i As Integer,j As Integer) As Variant Dim temp As NotesDocument Set temp = da(i) Set da(i) = da(j) Set da(j) = temp End Function Sub QuickSort (leftpos As Integer, rightpos As Integer) Dim i As Integer Dim j As Integer Dim pivot As String If (leftpos < rightpos) Then i=leftpos j=rightpos + 1 pivot = da(leftpos).GetFirstItem(key).Text Do Do i=i+1 Loop While da(i).GetFirstItem(key).Text<pivot And i<=rightpos Do j=j-1 Loop While da(j).GetFirstItem(key).Text > pivot And j>=leftpos If (i<j) Then Call swap(i, j) End If Loop While (i<j) Call swap(leftpos,j) Call QuickSort(leftpos,j-1) Call QuickSort(j+1,rightpos) End If End Sub These need to be public variables, so place them in your "Declarations": Dim s As NotesSession Dim db As NotesDatabase 'The current database Dim da As Variant Const key = "LastName" 'This the name of the FIELD you want to sort on Now, how to use this stuff... In your Initialize, or wherever you're calling this from: 1) Get your DocumentCollection (here: dc) 2) Call CollectionToArray(dc) 'just creates an array of your documents so that we can re-order them 3) Call QuickSort(Lbound(da), Ubound(da)-1) 'actually sorts your documents 4) Redim Preserve da( 1 To Ubound(da)-1) As NotesDocument 'just chops off the 'ZZZZZ' value we needed as a 'high' value (see CollectionToArray routine) 5) Forall doc In da ... End ForAll 'Use this to loop through your sorted documents Remember, the DocumentArray (da) is just an array of documents, so you can reference the 'doc' in your ForAll and any of it's properties, fields, etc. just like any other document. Let me know if you have any problems, or just to let me know you found this useful... Steve Held Paxion Corporation Anpassung: Replace the For i=1 To k Set da(i) = dc.GetNthDocument(i) Next with the appropriate GetNextDocument() code instead for some addtl. speed. GetNthDocument is much slower than GetNextDocument....