Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: rhgoe am 27.09.13 - 10:04:33
-
Ich habe eine Ansicht, die nach Datum sortiert ist. Das Feld ist CalendarDatetime.
Jetzt möchte ich in dieser Ansicht alle Dokumente finden, die in der Zukunft liegen. Kein Problem, wenn es ein Dokument für heute oder morgen gibt - was aber, wenn das nächste Zukunfstdokument erst in 3 Wochen liegt?
Welche Methode der Class NotesView eignet sich da am besten? Und wie formuliere ich den Such-Key am geschicktesten?
-
Hallo,
Spontan wuerde ich sagen NotesView.FTSearch.
Oder Du baust Dir die Ansichts-Selection der Dokumente sinngemaess mit
NotesDatabase.Search nach Deinen Wuenschen zusammen.
Andreas
-
Muss es unbedingt in einer Ansicht sein?
Ich würde das mit einem NotesDatabase.Search lösen
Set col = db.Search (|... & Calenderdatetime > @Today|, Nothing, 0)
... steht für andere Selektionsformeln, z.B. die aus Deiner Ansicht.
Wobei noch zu klären wäre, was "Zukunft" bedeutet. Wenn jetzt 27.09.2013 10:19 ist, ist dann ein Dokument 27.09.2013 10:20 Zukunft oder sollen es erst Dokumente ab morgen sein? Entsprechend musst Du natürlich die Formel anpassen.
-
Ich möchte in der Mail-Datenbank, auf die ich design-mäßig keinen Zugriff habe, Termine suchen. Daher dachte ich, in einer Ansicht, die schon mal nur Termine enthält und deren erste Spalte nach Terminen sortiert ist, ginge die Suche schneller.
Aber db.search klingt interessant. Werde ich mal probieren. Vielen Dank!
-
... auf die ich design-mäßig keinen Zugriff habe ...
Und genau deshalb zwingt sich ein db.Search nahezu auf. Was passiert mit Deiner Routine, wenn in der nächsten Version diese Ansicht nicht mehr existiert, oder die Spalten geändert wurden?
Ein db.Search ist unabhängig von Ansichten und gerade in solchem Kontext immer vorzuziehen.
-
Ok, leuchtet unmittelbar ein.
Aber wie kriege ich denn die Document-Collection, die ich als Ergebnis bekomme, dann nach Datum sortiert?
-
M.W. gibt es dafür keine Standardroutine in Notes. Ich mache sowas ungefähr so:
Hole die Collection mittels db.Search
Erstelle eine Liste aller Dokumente, etwa so
Dim dokumente List As NotesDocument
Set doc = col.GetFirstDocument
Do While Not doc Is Nothing
Set dokumente (doc.UniversalID) = doc
Set doc = col.GetNextDocument (doc)
Loop
Erstelle eine neue Collection ohne Dokumente
Suche in der Liste das Dokument mit dem kleinsten Eintrag (falls aufsteigend sortiert werden soll), füge es der Collection hinzu und lösche es aus der Liste.
Im Beispiel nehme ich einfach ein Textfeld, musst Du natürlich anpassen
Dim vgl As String
Dim id As String
Do
vgl = "ZZZZZZZZZ" 'kann auch irgendetwas anderes sein, darf nur nicht in den Werten vorkommen
'und es darf keinen größeren Wert geben
id = ""
Forall dokument in dokumente
If dokument.Feld (0) < vgl Then
vgl = dokument.Feld (0)
id = dokument.UniversalID
End If
End Forall
If id = "" Then
'Kein Dokument mehr in der Liste
Exit Do
End If
'hier dann dokumente (id) der Collection hinzufügen, sowas wie Call sortcol.AddDocument oder so, habe ich gerade nicht im Kopf
'Anschließend Dokument aus der Liste entfernen
Erase dokumente (id)
Loop
Soll nur eine Skizze sein ...
Wenn es zuviele Dokumente sind, kannst Du auch die Liste der Dokumente durch eine Liste von Integern ersetzen und holst Dir jeweils das zu verwendende Dokument über den Listtag. Das ist aber nach meinen Erfahrungen erst ab etwa 30.000 Dokumenten notwendig (sicherlich in Abhängigkeit der Größe der Dokumente und dem verfügbaren Arbeitsspeicher).