Autor Thema: DocumentCollection sortieren  (Gelesen 2336 mal)

Offline Doc Torte

  • Aktives Mitglied
  • ***
  • Beiträge: 178
  • Geschlecht: Männlich
  • ...promovierter Bäcker... ;-)
    • ...that's me
DocumentCollection sortieren
« am: 15.04.03 - 10:02:11 »
Moin moin,

lang ist´s her, heute möchte ich da mal wieder ein Problem haben...

ich habe eine Besuchsberichte-DB, aus der suche ich einen bestimmten Kunden(anhand der Kundennummer) zurück erhalte ich eine DocumentCollection, nun sind darin jedoch die Besuchsberichte nicht sortiert, da ich aber die Berichte anhand eines Datums abarbeiten möchte, wollte ich diese vorher schon in der Collection sortieren. Hat da jemand eine Idee ? (meine Suche war bis jetzt erfolglos)

THX
Torte
Wer nicht ständig besser wird, hört bald auf gut zu sein !
Schritt für Schritt geht's immer vorwärts...

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re:DocumentCollection sortieren
« Antwort #1 am: 15.04.03 - 10:26:05 »
Hi,

standardmäßig gibt's da nix. Da mußt du schon selbst Hand anlegen. Ich hab da eine Lösung im Internet gefunden und hab die einmal eingesetzt, funktioniert einwandfrei. Allerdings sortiert sie alphanummerisch.

Zitat

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....

Vielleicht hilft dir das doch weiter.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Doc Torte

  • Aktives Mitglied
  • ***
  • Beiträge: 178
  • Geschlecht: Männlich
  • ...promovierter Bäcker... ;-)
    • ...that's me
Re:DocumentCollection sortieren
« Antwort #2 am: 15.04.03 - 10:50:58 »
Thanks, werd ich mal testen.
Wer nicht ständig besser wird, hört bald auf gut zu sein !
Schritt für Schritt geht's immer vorwärts...

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re:DocumentCollection sortieren
« Antwort #3 am: 15.04.03 - 10:53:41 »
... da gab es vor kurzem schon mal was ähnliches. Es gibt eine Library, mit der man eine NotesDocumentCoellection in ein Array konvertiert, und dort gab es dann eine Sort-Funktion - ich denke die Lib ist bei OpenSource zu finden...

ata
Grüßle Toni :)

Offline Doc Torte

  • Aktives Mitglied
  • ***
  • Beiträge: 178
  • Geschlecht: Männlich
  • ...promovierter Bäcker... ;-)
    • ...that's me
Re:DocumentCollection sortieren
« Antwort #4 am: 15.04.03 - 16:03:42 »
DANKE,

ich hab mich für eine etwas andere Methode entschieden, ich baue mir zwei Arrays, den einem mit dem Datum und den anderen mit den Werten, welche ich aus den Berichten brauche, lasse den Datumsarray sortieren und ordne den Wertearray dementsprechend, und schon kann ich wie gewollt arbeiten...
Wer nicht ständig besser wird, hört bald auf gut zu sein !
Schritt für Schritt geht's immer vorwärts...

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz