Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Dr 84 am 14.03.14 - 14:21:53

Titel: SELECT Formel optimieren
Beitrag von: Dr 84 am 14.03.14 - 14:21:53
Hallo zusammen,

eine Ansicht in der DB hat folgende SELECT Formel:
Code
SELECT (form = "LNPrep" | form="Leistungsnachweis") & ad_delete !="1" & @Date(ln_wvg) > @Today & orphan!="1" & hide != "1"

Die Auswertung "@Date(ln_wvg) > @Today "  (Datum der Wiedervorlage liegt in der Zukunft) macht die Ansichtaufbau sehr sehr langsam..

Wie kann ich diese Formel optimieren?
Titel: Re: SELECT Formel optimieren
Beitrag von: Glombi am 14.03.14 - 14:38:45
Also ich mache es so:
Erstelle einen Agenten, der einmal nachts das aktuelle Tagesdatum in ein Feld der Dokumente schreibt und vergleiche dann mit dem Feld.

Oder sowas:
http://atnotes.de/index.php/topic,10260.0.html

Andreas
Titel: Re: SELECT Formel optimieren
Beitrag von: Dr 84 am 14.03.14 - 14:52:55
Danke Glombi! Top tipp.
Titel: Re: SELECT Formel optimieren
Beitrag von: Mitch am 14.03.14 - 14:58:34
Huhu,

oder du schreibst einen Agenten der die Select-Formel der Ansicht jede Nacht ändert, so dass das Datum fix drin steht. Das könnte bei großen Dokumentenzahlen und/oder Repliken vielleicht performanter sein.

Oder du markierst bestimmte Dokumente über Nacht. Zum Beispiel könnten alle Dokumente in denen das Wiedervorlagedatum erreicht ist mit einem neuen Item geflaggt werden. Dann kannst du Ansichten bauen für Doks die dieses Item haben oder eben nicht haben. Musst dann natürlich dran denken das Item ggf. wieder zu entfernen, z.B. wenn sich das Wiedervorlagedatum verschiebt oder entfernt wird.

Gruß,

Mitch
Titel: Re: SELECT Formel optimieren
Beitrag von: Peter Klett am 14.03.14 - 19:02:00
Ich würde nicht jedes Dokument jeden Tag mit dem aktuellen Tagesdatum ändern, sondern per Agent den benötigten Status setzen, z.B. zukünftig, oder abgelaufen, dann brauchst Du das Dokument nur einmal zu ändern, und nicht täglich.
Titel: Re: SELECT Formel optimieren
Beitrag von: jo@chim am 17.03.14 - 11:04:22
Alle Dokumente anfassen ist gar nicht nötig - es geht auch, die Selektions- und/oder Spaltenformeln der betreffenden Views mit einem zeitgesteuerten Agenten über Nacht anzupassen. Das sieht dann so aus:

Code
Sub Initialize
	Dim session As New NotesSession
	Dim db As NotesDatabase
	
	'Name der Variablen für den Datumswert in den Views
	varActStr$="_varAct"
	
	datStrStart%=Len(varActStr$)+12
	
	Set db = session.CurrentDatabase
	views = db.Views
	On Error Resume Next
	Forall v In views
		'Überprüfe Selektionsfomeln
		org_formula$=v.SelectionFormula
		If Left(org_formula$, Len(varActStr$)) = varActStr$ Then
			org_formula$=v.SelectionFormula
			org_dat$= Mid(org_formula$,datStrStart%,10)
			new_dat$=Format(Now(),"dd.mm.yyyy")
			new_formula$=Replace(org_formula$,org_dat$,new_dat$)
			v.SelectionFormula=new_formula$			
		End If
		'Überprüfe Spaltenformeln
		Forall vc In v.Columns
			org_formula$=vc.Formula			
			If Left(org_formula$, Len(varActStr$)) = varActStr$ Then
				org_formula$=vc.Formula
				org_dat$= Mid(org_formula$,datStrStart%,10)
				new_dat$=Format(Now(),"dd.mm.yyyy")
				new_formula$=Replace(org_formula$,org_dat$,new_dat$)
				vc.Formula=new_formula$			
			End If
			
		End Forall
	End Forall
End Sub

"_varAct" ist der Kennzeichner für Views mit zu ändernden Datumswerten, die der Agent anfassen soll. Eine Spaltenformel kann dann z.B. so oder ähnlich aussehen:

Code
_varAct:=@ToTime("17.03.2014");
@If(@ToTime(Datumsfeld)<_varAct;"Überfällig";"Im Plan");
...

In der ersten Zeile muss immer der Kennzeichner stehen, damit das Datum geändert wird. Läuft hier seit mehreren Jahren problemlos, auch über internationale Repliken.