Magic hat geschrieben:ich muss gestehen, dass ich bisher immer davon ausgegangen bin, dass Filter langsamer sind als Scopes. Wenn es (in bestimmten Fällen) nicht so ist, dann habe ich mal wieder etwas gelernt.
Aber wie kommt ihr auf MEMVARS im Zusammenhang mit Index?
ramses hat geschrieben:Hast du daran gedacht dass du in ADS Filterausdrücken keine Mem-Variablen verwenden darfst
...
Beim ADS werden -soweit ich weiß- Scopes nicht auf dem Server ausgewertet sondern nur durch den lokalen Treiber.
Wenn allerdings Filter durch den Server ausgewertet werden können, erfolgt dies auch auf dem Server! Wenn innerhalb eines Filters Mem-Variablen oder Locals verwendet werden, kann der Filter
nicht auf dem Server ausgewertet werden, da der Server ja den jeweils aktuellen Wert der Variable nicht kennt!
Deswegen sollte man statt
den Filter wie folgt setzen:
Code: Alles auswählen
cFilter := "PersNr="+AllTrim(nPersNr)
cbFilter := "{||"+cFilter+"}"
bFilter := &cbFilter
DbSetFilter( bFilter,cFilter )
Ich habe mir deswegen die folgende Funktion geschrieben:
Code: Alles auswählen
FUNCTION UTsDbSetFilter( cFilter ) // Im Gegensatz zu DbSetFilter() wird Filterbedingung nur als String
LOCAL cOldFilter:=DbFilter() // übergeben, "" akzeptiert und der alte Filter zurückgegeben.
LOCAL cbFilter,bFilter
IF valType(cFilter)=="C"
IF empty( cFilter )
DbClearFilter()
ELSE
cbFilter := "{||"+cFilter+"}"
bFilter := &cbFilter
DbSetFilter( bFilter,cFilter )
ENDIF
ENDIF
RETURN( cOldFilter )
Damit kann der Filter wie folgt gesetzt werden:
Uli