Opnieuw tijd en dagen berekenen

  • Onderwerp starter Onderwerp starter Risk
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Risk

Gebruiker
Lid geworden
5 jul 2010
Berichten
275
Forum,

Tijd en datum berekenen blijft knokken.

In mijn enthousiasme vond ik een module die ik in mijn database heb geplaatst om de dagen te berekenen. Zie ook mijn eerdere vraag.

Code:
Option Explicit

Function GetElapsedDays(interval)
    Dim dagen As Long

    dagen = Int(CSng(interval))
    GetElapsedDays = dagen & " Dag(en) "
 End Function

In het veld:
Code:
=GetElapsedDays([wpldaguit]-[wpldagin])

Helaas geeft de uitkomst #Fout aan als er nog niets is ingevuld. Kan voorkomen, ikweet soms nog niet wanneer een voertuig ter reparatie gaat.

Nogmaals mijn hulplvraag. Hoe voorkom ik een #FOUT.

Dank

Risk
 
Bijzonder vreemde functie; doorgaans gebruik je een functie om een berekening voor je te maken, maar deze doet niks anders dan de tekst (Dag(en) er achter te zetten. En dan ook nog niet eens dynamisch, dus Dag bij de waarde 1 en Dagen bij grotere getallen...
Ik zou zeggen: maak de functie wat flexibeler, door de datums als parameters mee te geven (en niet de berekening) en de datum die eventueel leeg is, en die het probleem veroorzaakt, Optional te maken zodat je hem kan vervangen door Date. Dan heb je een vaste datum als er twee datums zijn ingevuld, en een dynamische berekening op basis van de actieve datum als de eindwaarde leeg is.
En maak dan gelijk een check of er 1 uit komt of een hoger getal; staat een stuk netter.
 
Michel,

Ik al blij dat ik bij een post van Microsoft dit had gevonden. Hoe verder met jou verhaal, geen idee. Heb je een opzetje?

Dank als altijd.

Risk
 
Wat moet je functie doen? Het verschil tussen twee dagen berekenen, of het verschil in werkdagen (in een eventueel zelf in te geven aantal werkdagen/week)? Dat maakt nogal verschil. Het 1e (2 datums van elkaar aftrekken) kan heel simpel met de ingebouwde functie DateDiff. Al geeft Expr2: DateDiff("d";[Datum_Binnenkomst];Date();1;2) hetzelfde resultaat als Expr1: Date()-[Datum_Binnenkomst], dus waarom zou je daar moeilijk over doen?
Met een IIF kun je dan controleren of [wpldaguit] en/of [wpldagin] leeg zijn of niet.

Maar je wilt een functie: dan dus zoiets.
Code:
Public Function DagenVerschil(Datum1 As Date, Datum2 As Date, Optional WerkWeek As Integer) As String
Dim iDatum1 As Integer, iDatum2 As Integer, iDatumVerschil As Integer, iPlus As Integer
Dim sO As String

    If Nz(WerkWeek, 0) = 0 Or WerkWeek > 7 Then WerkWeek = 7
    iDatum1 = WeekDay(Datum1, vbMonday)
    iDatum2 = WeekDay(Datum2, vbMonday)
    
    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
    iPlus = iPlus + 1
    iDatumVerschil = iDatumVerschil + iPlus
    If iDatumVerschil = 1 Then sO = " dag" Else: sO = " dagen"
    DagenVerschil = iDatumVerschil + iPlus & sO

End Function
En je gebruikt hem zo:
Code:
Expr1: DagenVerschil([Datum_Binnenkomst];IIf([Datum_Opgelost] Is Null;Date();[Datum_Opgelost]))
of zo, als je werkdagen in een 5-daagse werkweek wilt berekenen:
Code:
Expr2: DagenVerschil([Datum_Binnenkomst];IIf([Datum_Opgelost] Is Null;Date();[Datum_Opgelost]);5)
Zoals je ziet, zit in de aanroep een check op de tweede datum. Die kan namelijk leeg zijn, en dat zou een foutmelding opleveren. Met een IIF vang je dat af, en vervang je de datum door de huidige datum.
 
MIchel,

En ik dacht het even simpel te doen. Dank voor je codes, ga op mijn gemak kijken of en hoe het werkt.

Keep you informed.

Risk
 
Simpel kan ook; heb ik als eerste uitgelegd ;)
 
Is waar, maar het is een studieobject aan het worden en een ontzettend leuk en leerzaam tijdverdrijf (Met dat laatste niet altijd blij overigens.)
 
Michel,

Aanvullend. Als je de werkelijke uren in de garage wilt berekenen en die weer terug wilt rekenen naar werkelijke dagen met als uitkomst xx dagen en yyy uren?

Even resumerend naar jou aangedragen oplossing.

Public Funtion dagen is de code voor een module en de exprs.1 of 2 zet ik in het desbetreffende veld, gelijk ik deed bij de Microsoft oplossing?

Ik hoor graag.

Risk
 
De twee gebruiksvoorbeelden komen uit een query. Vandaar dat er Expr# voor staat, want dat doet Access nu eenmaal bij formules in een query.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan