Toon posts:

[VBA] Snelheidsoptimalisatie lists en databasebewerkingen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Momenteel ben ik bezig met een planningssysteem in Access. Dit systeem heeft al een jaar of 3 naar behoren gewerkt, alleen wil ik nu graag de interface waarmee de planning aangepast wordt optimaliseren. Eigenlijk heb ik dan ook twee vragen (want twee deelgebieden).

Allereerst genereer ik op mijn nieuwe planningsformulier alle dagen voor de komende maand, en de bijbehorende shifts. Via een Do While loop en de DateAdd functie genereer ik een lijst van data. Hierna haal ik voor die bepaalde dag alle shifts op uit de database. Binnen deze loop zit een tweede Do While loop die de recordset afloopt en uiteindelijk de elementen in de lijst plaatst.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Do While datum < eindDatum
 ... 
 Ophalen shifts uit de database
 ...
 Do While nog niet laatste record / shift
  ...
  ElementToevoegen(datum, shift)
  ...
 Loop
 ...
 datum = datum +1
 ...
Loop


Nu zijn er eigenlijk maar drie afzonderlijke subsets van shifts in de database. Dit kunnen er wel meer worden, maar in de huidige configuratie zijn het er maar drie. Probleem is dat het opbouwen van de lijst aardig wat tijd kost. Zou het een oplossing zijn om bijvoorbeeld bij het begin van deze functie 3 arrays aan te maken en hier de shifts in te stoppen. Je hoeft de database dan maximaal maar drie keer aan te spreken. Of bijvoorbeeld drie "shiftobjecten"?


Het volgende heeft betrekking op een controleprocedure die plaatsvindt bij het inplannen van een persoon. Het systeem checkt of de werknemer niet meer dan 8 uur gaat werken op die dag, of de werknemer niet al ingepland is voor die shift, of de werknemer geen overlappende shifts heeft en tot slot of er binnen het bedrijf wel genoeg ruimte is om die werknemer te laten werken. Ook dit zijn weer allemaal afzonderlijke databasebewerkingen die veel tijd kosten. Hoe ik dit ga optimaliseren weet ik nog niet, maar zou het een idee zijn om een werknemer object te maken, deze te instantieren met de planning van desbetreffende werknemer (vanuit de DB) en dan het object te querien (en de DB met rust te laten)?

Iets laten werken is moeilijk, iets snel laten werken is helemaal pittig. :)

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Volgens mij is het aanmaken van shift- en medewerker objecten stukken beter voor je performance dan de manier die je nu gebruikt. Daar moet je echter nogal wat vragen bij stellen:

• Zijn de gegevens per shift/medewerker generiek genoeg om er een object voor te definiëren?
• Hoeveel gegevens worden op deze manier in de objecten gestopt?
• Loont het de moeite?
• ...

Wat betreft het eerste punt: als de gegevens in een database kunnen, kunnen ze waarschijnlijk ook in een object gevat worden, mits je geen rare uitzonderingen met een work-around opgelost hebt. Het tweede punt is iets waar jij nu alleen even zicht op hebt, dat moet je dus zelf nagaan. Het derde punt zou ik bijna direct met ja willen beantwoorden.

Je kunt het natuurlijk redelijk snel testen:

- maak een database met één tabel
- prop een hoop gegevens in de tabel
- query 5 verschillende waardes uit de tabel en meet de tijd
- query eenmaal alles, zet in object
- vraag dezelfde waardes op en meet de tijd

Je kunt je voorstellen dat hoe ingewikkelder de queries worden, hoe langer ze gaan duren. Daar gaat mijns inziens vooral de winst zitten bij objecten. En natuurlijk dat 5 keer een object iets vragen veel sneller is dan 5 moeilijke queries uitvoeren! Succes, and keep us informed!

My personal website


  • Markieman
  • Registratie: December 2001
  • Laatst online: 15-05 12:16
Wat betreft de snelheid van het plaatsen in een listbox. Bij iedere toevoeging wil VB die listbox opnieuw 'tekenen'. Dit kost uiteraard tijd.

Mijn oplossing een tijd terug was om de listbox invisible te maken, dan vullen en dan weer visible maken.

Om de GUI er nog een beetje uit te laten zien plaats je nog een dummy(lege) listbox over de andere heen die visible is als de andere invisible is.

edit:

OZ-Gump: sorry, was mijn interpretatie van het langzaam opbouwen van een lijst...

[ Voor 13% gewijzigd door Markieman op 04-02-2005 09:18 ]

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Markieman: waar haal jij die listbox vandaan? Ik zie die namelijk nergens in de openingspost. En dat was volgens mij ook niet de vraag ...

My personal website


Verwijderd

Een paar kleine optimalisaties, die niet al te veel impact zullen hebben op je huidige code :

Je zegt dat je dataadd gebruikt om iedere keer een dag verder te gaan. DateAdd("d",1,Datum) kun je vervangen door Datum = Datum + 1

Als je in je code meerdere keren dezelfde queries aanroept met andere condities, is het misschien sneller om aan het begin van je code de uitkomst van de queries in tijdelijke tabellen te stoppen ( Select into query ), en daar dan je select op te doen.