Weekenddagen niet meerekenen in allerlei berekeningen

Status
Niet open voor verdere reacties.

xantium

Gebruiker
Lid geworden
20 jun 2009
Berichten
14
Ik moet voor de database ervoor zorgen dat zaterdagen en zondagen niet meegerekend worden in allerlei berekeningen voor mijn database. Zo heb ik 4 werkdagen om een bepaalde pc-configuratie in mekaar te stoppen. Is er een algemene manier om dit te doen in Access 2010? of moet je dat in elke query apart intypen? Als er geen algemene manier is, dan gaan we dit niet meer interpreteren wegens tijdgebrek voor de deadline.

Mvg en bedankt voor vroegere hulp,
 
Wie wat bewaart, die heeft wat :D

Code:
Public Function WerkDagen(Datum1 As Date, Datum2 As Date) As Integer
Dim iDatum1 As Integer, iDatum2 As Integer, iDatumVerschil As Integer, iPlus As Integer

    iDatum1 = Weekday(Datum1, vbMonday)
    iDatum2 = Weekday(Datum2, vbMonday)
    If Nz(WerkWeek, 0) = 0 Or WerkWeek > 7 Then WerkWeek = 5
    iDatumVerschil = Int((DateDiff("d", Datum1, Datum2)) / 7) * WerkWeek

    If iDatum1 > 5 Then
        iPlus = iDatum2
    Else
        If iDatum1 > iDatum2 Then
            iPlus = 5 - (iDatum1 - iDatum2)
        Else
            iPlus = iDatum2 - iDatum1
        End If
    End If
    WerkDagen = iDatumVerschil + iPlus

End Function

Deze functie kun je in een query gebruiken. Wel eerst opslaan in een Module, want anders heb je er niks aan. In een query krijg je dan iets als:
Code:
Expr1: WerkDagen([Datum eerste werkdag]; [Datum laatste werkdag])
 
Laatst bewerkt:
De vorige functie berekent het aantal werkdagen tussen twee dagen; ik bedacht mij iets later dat je eigenlijk het omgekeerde resultaat wilt: je hebt een startdatum, en je weet al hoeveel werkdagen je mag besteden, en wilt de einddatum berekenen. Daarvoor heb je uiteraard een andere functie nodig. Da's deze:

Code:
Public Function DatumKlaar(Datum As Date, Werkdagen As Integer, Optional WerkWeek As Integer) As Date
Dim iWeekDag As Integer, iWerkWeek As Integer, iWeek As Integer, iPlus As Integer

If Nz(WerkWeek, 0) = 0 Or WerkWeek > 7 Then WerkWeek = 5
iPlus = 7 - WerkWeek
iWeekDag = Weekday(Datum, vbMonday)
iWeek = Int(Werkdagen / WerkWeek)
iWerkWeek = Werkdagen + iWeekDag

Select Case iWerkWeek
    Case (WerkWeek + 1) To 7
        DatumKlaar = DateAdd("d", Werkdagen + iPlus, Datum)
    Case Is > 7
        DatumKlaar = DateAdd("d", Werkdagen + (iPlus * iWeek), Datum)
    Case Else
        DatumKlaar = DateAdd("d", Werkdagen, Datum)
End Select

End Function
En je gebruikt hem zo:
Code:
Datum klaar: DatumKlaar([Datum_Binnenkomst];[Doorlooptijd];5)
Hierbij is de waarde voor het aantal werkdagen optioneel; vul je dat niet in, dan gaat de functie uit van een werkweek van 5 dagen. Vul je wel wat in, dan wordt het resultaat berekend op basis van het aantal
dat je invult.
 
Laatst bewerkt:
Kleine opmerking over de code hierboven:
als Werkweek wordt gedeclareerd als integer dan kan Nz(WerkWeek, "") = "" nooit waar worden. Immers alleen een variant kan een null-waarde hebben. dus of werkweek als variant declareren of code iets aanpassen b.v. If WerkWeek<=0 Or WerkWeek > 7 Then WerkWeek = 5
 
Helemaal mee eens; had ik in mijn eigen code al aangepast. Thanx voor de tip!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan