1. Row count
Als je het aantal records wil weten of tonen, rekening houdende met filter en index condities, dan is dit de meest voor de hand liggende methode:
DBServer:OrderKeyCount() methode, die onafhankelijk is van de bBrowser instellingen.
Er bestaat ook bBrowser:GetRowcount(). Echter, deze is slechts correct indien:
- bBRowser:RowcountMode := #KeyCount
- bBrowser:RowMode := #Relative (hoewel ik niet 100% zeker ben dat dit een must is)
- indien Optimisatie TRUE staat. Staat deze FALSE, dan geeft GetRowCount() een verkeerde waarde. Want dit hangt nl. af van de DBServer var OrderKeyCount, en die geeft dan ook een verkeerde waarde!
Dit heeft dan weer andere implicaties, want bBRowser gebruikt dat nl. om bv. al dan niet een verticale scrollbar te tonen. Dus als als je optimisatie af hebt staan, is de scrollbar is niet meer betrouwbaar (verschijnt bv. als er niks te scrollen valt)
Besluit: gebruik nergens bBRowser:GetRowCount()
2. Performantie
Alle Orderkey* functies worden buitengewoon belastend indien Setdeleted(TRUE) en/of Setfilter() in gebruik
Dit omdat dan de hele database over het netwerk naar de client wordt gestuurd bij elke call van een Orderkey functie!
Het probleem wordt pas voelbaar bij files met een grotere size (meerdere megabytes). Het aantal records speelt minder een rol.
Nu gebruikt bBRowser deze functies intensief (o.m. bij het scrollen) indien men Rowmode op #Relative heeft staan en/of rowcountmode op #Keycount.
Rowmode #Relative is enkel nodig indien men een correct werkende multiple selection wil hebben. In dat geval moet men echt wel inschatten hoe groot de DBF zal worden. Indien ze meerdere MB wordt, dan moet men echt afstappen van Setfilter() en enkel indexes met FOR-conditions of orderscopes gebruiken. En uiteraard steeds Setdeleted(FALSE) maar dan in alle indexorders een FOR !Deleted() steken.
NB: multiple selection werkt nog wel in rowmode:#absolute, doch een block-selection met shift-click kan soms niet goed werken, afh. van de gebruikte order.
De bBRowser:RowcountMode zet je best steeds op #RecCount van zodra de file een substantiele size heeft.
Multiple selection wordt hierdoor NIET beïnvloed.
Enige nadeel is dat de scrollbar ook verschijnt als er te weinig records zijn om te scrollen, maar ze werkt wel razendsnel.
Het optimisatieprobleem
Default staat Set Optimize TRUE.
Echter als een setfilter actief is, en er wordt extern (dwz in een andere instance van de server) een record bijgevoegd, dan verschijnt deze niet in de server zolang je niet een Clearfilter() en nieuwe SetFilter() hebt gedaan.
The filter problem where new records are not visible is caused by the DBFCDX driver that optimizes the filters. You can switch off the optimizer, and then your problems will go away (but the filter will be slower :-()RddInfo(_SET_OPTIMIZE,FALSE)Note: This is a GLOBAL setting, even though there is also a method RddInfo for the DbServer class !What the driver does is this: once it has read the whole database it stores the record numbers of the records that meet the criterium of the filter. That way it doesn't have to go out and read all the records again. Robert van der Hulst
ECHTER!!
Optimisatie afzetten schept niet enkel een zeer zware performance degradatie, maar andere problemen ook; bv. Orderkeycount() is niet meer correct!!