Combobox vullen

Status
Niet open voor verdere reacties.

obiku

Gebruiker
Lid geworden
25 jul 2004
Berichten
60
All,

In een access 2003 formulier laat ik in een continuous form vanuit een database informatie zien. Omdat ik in mijn formulieren de access menubalk heb verborgen en diverse mensen niet weten hoe zij met filters moeten werken probeer ik met behulp van comboboxen een excel look-a-like autofilter te creeren.
Het formulier laat 12 verschillende velden zien. In de formulierkop heb ik boven 11 van hen een combobox geplaatst. Het vullen van de comboboxen doe ik nu met 11 queries, waarbij het geselecteerde veld 1 veld is van dezelfde query waarmee het formulier gevuld wordt.
M.a.w. er worden op dit momnet 12 queries uitgevoerd om 1 formulier geheel te vullen. Als het aantal recordset niet zo groot zou zijn gaat dit nog best wel snel, maar het formulier wordt met ruim 10000 recordsets gevuld....
Ik heb op diverse plaatsen de tijd gemeten hoelang Access bezig is met het vullen van het formulier. Hieruit blijkt dat access ruim 7 seconden bezig is om de query die het formulier moet vullen, uit te voeren. Dus om alle comboboxen te vullen is access nogmaals 11*7 seconden bezig.....

Ik blijf waarschijnlijk in een verkeerd kringetje lopen, maar hoe kan ik het vullen van de verschillende comboboxen versnellen. Ik maak de gebruikers namelijk niet blij als het ruim 78 seconden duurt voordat het resultaat zichtbaar is :confused:
 
Ik snap even niet helemaal wat je aan het doen bent. Ik snap dat je een hoofdformulier hebt met veel records, maar 10000 records is voor Access een peuleschil, en dat mag echt geen 7 seconden duren voordat het formulier geladen is. Maar dat is een detail wat met je eigenlijke vraag niet zoveel te maken heeft. In dat formulier heb je dus 11 keuzelijsten gemaakt met opzoekveld. En die gebruiken dezelfde bron als het formulier, zeg je. En daar gaat het mis in het hoofd: waarom? In de onderliggende bron zullen alle records uniek zijn (mag ik hopen voor je), maar dat wordt veroorzaakt doordat de combinatie van alle velden uniek is. Elk veld afzonderlijk hoeft dat niet te zijn, uitgezonderd een veld als een Autonummerveld. Dus als je een veld Plaatsnaam hebt, zal een willekeurige waarde in dat veld best vaker voor kunnen komen. Het heeft dan ook geen zin om in de keuzelijsten een Rijbron te maken die alle 10000 records laat zien.
Er zijn twee mogelijke opties:
1. de waarden voor de keuzelijsten komen uit gekoppelde tabellen (tKlanten, tPlaatsen etc)
2. de waarden komen alleen voor in de onderliggende tabel van het formulier
In het eerste geval hoef je al helemaal de Rijbron niet uit formulierbron te halen, want dan gebruik je de brontabel als basis. En die zal veel minder records bevatten, en snel openen
In het tweede geval haal je de gegevens wél uit de onderliggende tabel, maar je hebt de waarden maar één keer nodig, en je moet de gegevens dus DISTINCT ophalen, en dat levert ook een veel snellere en kleinere rijbron op.

Kortom: het probleem zou niet in de keuzelijsten hoeven te zitten.
 
Mijn excuus, ik laat mijn query alleen de eerste 10000 recordsets weergeven. Als ik met maximale aantal recordsets op All zet worden er ruim 400K recordsets getoont. Dit duurt als nog iets meer dan 5 seconde. Op advies van een collega heb ik mijn tabellen wat beter geindexeerd. Zou dat de 2 seconde winst opleveren?

Ik heb het vullen van de comboboxen nu per combobox met een zelfde, maar uitgeklede query als het formulier, DISTINCT laten vullen. Hierna duurt het vullen van alle comboboxen nog steeds 32 seconde.
Ik heb dus wel enige tijdwinst gemaakt :).
 
Keuzelijsten kunnen hooguit zo'n 65000 waarden bevatten; zodra je een query gebruikt met 400k records, zal die met DISTINCT wellicht geen 400K meer zijn, maar nog steeds veel te groot. En scrollen in een keuzelijst met 65K records is ook geen pretje. Vele malen beter en sneller wordt je systeem dan als je de keuzelijsten voorfiltert met een tekstvak. Dat ingetypte tekst in het tekstvak gebruik je dan om de keuzelijst verder te filteren, zodat het aantal records daarin beperkt blijft. En minder records = betere performance. Die 32 seconde kun je ook in je portemonnee houden, want waarom zou je de keuzelijsten al gelijk vullen? Dat heeft alleen zin als de gebruiker alle keuzelijsten tegelijk gaat gebruiken. Hoe groot is die kans? Je kunt de keuzelijst dus ook vullen op het moment dat de gebruiker de keuzelijst selecteert. Is vroeg genoeg in het proces, en het ontlast de rest van het systeem. En je gebruikt alleen de code voor de keuzelijst die echt nodig is.
 
Thanx,

Ik vul nu in het GotFocus events van de comboboxes iedere combobox met de unieke waardes uit het onderliggende tabel veld. Hierdoor is de tijd om het formulier op te bouw en gereduceerd naar +/- 8 seconde. Uiteraard, zodra er een selectie gemaakt moet worden in een combobox, is access wel weer even bezig om de inhoud van de combobox te tonen. Volgens de timer die ik er ingebouwd heb om op diverse punten te meten hoe lang iets duur, duurt het vullen van de combobox een fractie van een seconde (0,0135 sec). Maar voordat ik weer controle heb (zandloper is weg) gaat er wel wat meer tijd overheen. Het zij zo. Het werkt in ieder geval vele malen sneller dan in mijn eerste opzet.:thumb:
 
Vullen is iets anders als een Rijbron eraan koppelen. Dat laatste gaat inderdaad heel snel, maar het daadwerkelijk vullen is volgens mij ook niet zo te meten. want dat gebeurt zodra je de gebeurtenis afsluit, en je het formulier weer ziet. Dus als je die tijd wilt meten, moet je dat doen op een ander object. Maar of dat nu zo interessant is... Ik zou, zeker bij trage keuzelijsten met veel opties, de keuzelijst dus filteren m.b.v. extra tekstvakken die je er boven zet en waarin de gebruiker dan vereiste tekens typt. Daarmee is heel veel tijdwinst te boeken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan