Avatar billede ferdinand.k Mester
06. august 2003 - 12:50 Der 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...
Avatar billede ferdinand.k Mester
06. august 2003 - 12:56 #1
kommer lige her for god ordens skyld:

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
Avatar billede Jørgen Kirkegaard Professor
06. august 2003 - 16:39 #2
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.
Avatar billede terry Ekspert
06. august 2003 - 21:22 #3
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
Avatar billede ferdinand.k Mester
07. august 2003 - 07:21 #4
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... :)
Avatar billede terry Ekspert
07. august 2003 - 09:15 #5
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!
Avatar billede ferdinand.k Mester
07. august 2003 - 09:21 #6
det er ikke nødvendigt med helligdage... jeg skal sådan set kun have antallet af hverdage ud mellem to datoer, oftest med en måneds mellemrum...
Avatar billede pecl Nybegynder
07. august 2003 - 11:01 #7
Hej Ferdinand K.
Se Terrys svar her
http://www.eksperten.dk/spm/296043
Avatar billede terry Ekspert
07. august 2003 - 15:53 #8
Hi Pecl>Gald you can find what I made, I never seem to be able to :o)
Even so there isnt a great difference in either method.
Avatar billede Jørgen Kirkegaard Professor
07. august 2003 - 18:00 #9
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!
Avatar billede Jørgen Kirkegaard Professor
07. august 2003 - 20:26 #10
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester