06. august 2003 - 12:50Der er
8 kommentarer og 2 løsninger
optimering af funktion
hejsa... i forlængelse af spg: http://www.eksperten.dk/spm/369858 kunne jeg godt tænke mig at høre om der var en der kunne optimere denne funktion yderligere. Det er en funktion der bruges ofte, og skal derfor køre så hurtigt som muligt... Dertil skal der siges at jeg bruger ikke "helligdag" tabellen/funktionen til noget...
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Public Function Arbejdsdag(Dato As Date) As Boolean If Weekday(Dato) = 7 Or Weekday(Dato) = 1 Then Arbejdsdag = False ElseIf DCount("*", "Helligdage", "Dato = #" & Format(Dato, "yyyy-mm-dd") & "#") > 0 Then Arbejdsdag = False Else Arbejdsdag = True End If End Function
Public Function FindAntalArbejdsdage(Startdato As Date, Slutdato As Date) As Long Dim tmpDato As Date Dim n As Integer tmpDato = Startdato Do Until tmpDato >= Slutdato If Arbejdsdag(tmpDato) Then n = n + 1 End If tmpDato = tmpDato + 1 Loop FindAntalArbejdsdage = n End Function
Afhængig af gnst. afstand mellem datoerne: Hvis den er høj, kan du jo udnytte, at hver 7. dag er lørdag og/eller søndag. Så er det ikke nødvendigt at spørge på alle datoer. Hvis der typisk er giga-mange datoer, kan du tælle hvor mange dage der er ialt, og derfra fratrække antallet af lørdage og søndage, samt antallet af helligdage...Koden må du selv fedte med, synes jeg.
Public Function Arbejdsdag(Dato As Date) As Boolean If Weekday(Dato) = 7 Or Weekday(Dato) = 1 Then Arbejdsdag = False else Arbejdsdag = True End If End Function
Public Function FindAntalArbejdsdage(Startdato As Date, Slutdato As Date) As Long Dim tmpDato As Date Dim n As Integer tmpDato = Startdato Do Until tmpDato >= Slutdato If Arbejdsdag(tmpDato) Then n = n + 1 End If tmpDato = tmpDato + 1 Loop FindAntalArbejdsdage = n End Function
det man bruger funktionen til, er at søge efter hvormange arbejdsdage der er mellem d. 15 i denne, og d. 14 i næst-kommende måned. så det er jo ikke et gigastort tal... :)
ferdinand.k> You said that you are not using "Helligedage" table! I have removed it from the loop but as far as I see it you MUST go through each day to see if it is a working day or a weekend (saturday or sunday). I would also have thought that holidays (Easter etc.) would need to be taken into concideration too!
Hvis du ikke synes, at ANTAL.ARBEJDSDAGE er god nok, og hvis ALDRIG medregner helligdage og du ALTID skal beregne fra 15 dennes til 14 næstes, vil jeg påstå at du må kunne udnytte at hver 7.dag er lørdag eller søndag...Der vil altid være 28-31 dage ialt, herunder 4-5 lørdage/søndage - take that, hvis du altså er ude på ekstrem sub-optimering!
En grim, nogle vil sige kinky, variant af 'Arbejdsdag' er iøvrigt: Public Function Arbejdsdag(Dato As Date) As Boolean Arbejsdag = Weekday(Dato) <> 7 And Weekday(Dato) <> 1 End Function
Jeg kan ikke lige gennemskue, om du kunne optimere mere ved at lave en .. Dim a as integer a=Weekday(dato) Arbejsdag = a <> 7 And a <> 1 .. herved sparer du jo et kald af Weekday...men det må du næsten selv teste.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.