Autor Thema: Sortierfunktion für Documentcollections  (Gelesen 2361 mal)

Offline Gandhi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 918
  • Geschlecht: Männlich
  • Domino for the masses
Sortierfunktion für Documentcollections
« am: 19.09.06 - 08:42:46 »
Hi, gibt es irgendwo eine fertige (und benutzbare) Sortierfunktion für Documentcollections.
Stelle mir die Signatur in etwa so vor (das sollte bessererklären, was ich will)
function sortDC(dc as notesdocumentcollection, sortByFieldName as string, sortOrder as string/integer/...) as notesdocumentcollection.

Mein Problem ist, dass ich diese DCs nicht über irgendwelche Views/Folders beziehen kann, da ich meinen Administratoren Ärger mit tausenden von privaten Views/Foldern ersparen will/muss.
Der "Wenn ich" und der "Hätt' ich" das sind zwei arme Leut'
oder für den Süden:
Hatti Tatti Wari - san drei Larifari

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Sortierfunktion für Documentcollections
« Antwort #1 am: 19.09.06 - 09:12:19 »
also ich habe sowas mal geschrieben...

Allerdings musst Du einen anderen Ansatz verwenden: Eine dc ist per se nicht sortiert, auch wenn Du die Dokumente in der richtigen Reihenfolge reinschiebst...

Mit folgendem Code in einem Agenten und 3 markierten Dokumenten z.B. in Deiner Mail- DB kannst Du das nachvollziehen:

   Dim ses As New NotesSession
   Dim db As NotesDatabase   
   Dim dc As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim dc2 As NotesDocumentCollection
   Dim doc2 As NotesDocument
   
   Dim subject1 As String, subject2 As String
   
   Dim i As Integer
   
   Set db = ses.CurrentDatabase
   Set dc = db.UnprocessedDocuments
   Set dc2 = db.Search( |Form="blablub"| , Nothing , 0 )
   
   Set doc = dc.GetLastDocument
   While Not doc Is Nothing
      Call dc2.AddDocument( doc )
      Set doc = dc.GetPrevDocument( doc )
   Wend
   
   For i = 1 To dc.Count
      Set doc = dc.GetNthDocument( i )
      subject1 = doc.GetItemValue( "Subject" )( 0 )
      Set doc2 = dc2.GetNthDocument( i )
      subject2 = doc2.GetItemValue( "Subject" )( 0 )      
   Next

Du wirst sehen: Obwohl doch eigentlich dc2 genau umgekehrt sortiert sein sollte wie dc, sind subject1 und subject2 immer gleich.

Der einzige Ansatz, der funktioniert ist folgender:

For i = 1 to dc.Count
  set doc = GetKleinstesDokument( dc , "Subject" )
  call dc.RemoveDocument( doc )
End For

und dann natürlich das "ausprogrammieren" der Funktion "GetKleinstesDokument", das ist aber sehr einfach, weil es keine komplizierte Sortier- Funktion erfordert sondern die einzige Möglichkeit das "stupide" durchlaufen aller Dokumente ist:

Set doc = dc.GetFirstDocument
While not doc is nothing
   tmp = doc.GetItemValue( feldName )( 0 )
  if tmp < minimum then
    minimum = tmp
   set minDoc = doc
  end if
  set doc = dc.GetNextDocument( doc )
Wend

Das ist von der Performance her natürlich miserabel..

Es gibt noch eine andere etwas performantere aber wesentlich komplexere Methode die Sortierung von DCs zu realisieren, nämlich über Listen (dann kann man alles in eine Funktion packen, und muss nicht stupide durchzykeln:

dim dcList List as NotesDocument
Dim sortList() as String

Redim sortList( dc.Count - 1 )
x = 0
Set doc = dc.GetFirstDocument( )
While not doc is nothing
  tmp = doc.GetItemValue( sortFeld )
  dcList( tmp ) = doc
  sortList( x ) = tmp
  x = x + 1
Wend

' jetzt sortlist sortieren über den performanten @Sort- Befehl:
Dim tmpDoc as NotesDocument
tmpDoc.SortIt = sortList
evalString = |@Sort( sortIt )|
sortedList = Evaluate( evalString , tmpDoc )

Forall sortedVal in sortedList
  Set nextDoc = dcList( sortedVal )
  '- diese Dokumente sind jetzt sortiert...
Next

Achtung: Diese Funktion muss erweitert werden, wenn die Sortierwerte möglicherweise nicht eindeutig sind...Wenn also einzelne Werte mehrfach vorkommen, dann muss vor dem hinzufügen zur Liste noch geprüft werden "schon vorhanden" (über isElement( ) ) und dann ggf. der Wert ergänzt werden (z.B. durch eine laufende Nummer)

HTH
Tode
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline diali

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.023
  • Geschlecht: Männlich
Re: Sortierfunktion für Documentcollections
« Antwort #2 am: 19.09.06 - 09:26:57 »
bau Dir ein 2D-Array, gehe die Collection durch, schreibe an die Stelle (0, x) den Sortierschlüssel (Feldinhalte des Dokumentes) und an die Stelle (1,x) die UniversalID des Dokumentes.

Danach ein QSort über das Array und dann mit einer Schleife über das Array gehen und mit der UniversalID die Dokument holen (NotesDocument = NotesDatabase.GetDocumentByUnlID).

Fertig ist bei mir nur der QSort für das Array alles Andere ist aber kein Aufwand.
Gruß
Dirk

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz