Berekenen totale tijd in rapport

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

RB85

Gebruiker
Lid geworden
4 jun 2010
Berichten
55
Hallo,

Ik heb een probleempje met het berekenen van de totale tijd in een rapport. Ik heb een query waarmee ik datum en tijd ophaal. Vervolgens heb ik een functie gemaakt waarmee ik het verschil tussen deze 2 tijden kan berekenen. Ik heb 2 functies. Een die laat zien hoeveel tijd er tussen de start en het eind zit in de normale tijdweergave, en een die het aantal minuten laat zien. Nu zou ik graag de totale tijd (liefst in tijdsnotatie) willen laten zien in een grafiek. Dus de tijden optellen van alle records en die gesorteerd op een bepaalde manier.

2e2ilnr.jpg


De grafiek komt er hetzelfde uit te zien als de onderstaande, maar dan met de totale tijden. Ik hoop dat iemand me kan helpen..
 
Ik weet niet wat er geschreven moet worden aan een functie die al in Access zit:
Tussenliggend aantal minuten:
Code:
DateDiff("n",startdatumentijd,einddatumentijd)
Daar kan je natuurlijk nog wel de weekenden en eventuele feestdagen vanaf trekken.

Voor de tijdsnotatie gebruik je het format commando:
Code:
format(aantalminuten/(24*60), "hh:nn:ss")

Enjoy!
 
Guus,

Bedankt voor je informatie.

De functie datediff heb ik inderdaad ook geprobeerd. Echter had ik hier wat problemen mee. grootste probleem als ik me niet vergis was dat ik niet alleen een starttijd en eindtijd heb, maar ook een startdatum en einddatum. In de functie die ik geschreven heb maak ik echter wel gebruik van DateDiff en Format.

Code:
Public Function Elapsed(startdatum As Date, starttijd As Date, einddatum As Date, eindtijd As Date) As String
On Error GoTo Err_Elapsed
    Dim start As Date
    Dim eind As Date
    Dim intRetValHours As Long
    Dim intRetValMinutes As Long

    start = startdatum + starttijd
    eind = einddatum + eindtijd

    If start < eind Then
        intRetValHours = Fix(DateDiff("n", start, eind) / 60)
        intRetValMinutes = DateDiff("n", start, eind) Mod 60
    Else
        intRetValHours = Fix(DateDiff("n", start, eind - 1) / 60)
        intRetValMinutes = DateDiff("n", start, eind - 1) Mod 60
    End If

    If intRetValMinutes = 0 Then
        Elapsed = intRetValHours & ":00"
    Else
        Elapsed = intRetValHours & ":" & intRetValMinutes
    End If

Exit_Elapsed:
    Exit Function

Err_Elapsed:
    MsgBox Err.Number & ": " & Err.Description
    Resume Exit_Elapsed
End Function

Code:
Public Function ElapsedMinutes(startdatum As Date, starttijd As Date, einddatum As Date, eindtijd As Date) As Integer
On Error GoTo Err_ElapsedMinutes
    Dim start As Date
    Dim eind As Date
    Dim intRetValMinutes As Long
    
    start = startdatum + starttijd
    eind = einddatum + eindtijd
    If Not IsNull(eind) Then
        If start < eind Then
            intRetValMinutes = DateDiff("n", start, eind)
        Else
            intRetValMinutes = DateDiff("n", start, eind - 1)
        End If
    Else
        intRetValMinutes = 0
    End If
    
    ElapsedMinutes = intRetValMinutes
    
Exit_ElapsedMinutes:
    Exit Function
    
Err_ElapsedMinutes:
    MsgBox Err.Number & ": " & Err.Description
    Resume Exit_ElapsedMinutes
End Function
 
Als je kijkt hoe een datum+tijd er in werkelijkheid uitziet dan is het werken ermee een stuk eenvoudiger.

In je immediate window:
Code:
?cdbl(now)
 40414,6686574074
40414 is het aantal dagen sinds 30-12-1899
Code:
?cdate(1)
31-12-1899
Achter de komma staat de tijdnotatie.
Code:
?cdate(1.5)
31-12-1899 12:00:00
Dus als je datum en tijd bij elkaar optelt dan krijg je een double die het juiste tijdstip aangeeft.

Misschien heb je hier wat aan.

HTH:D
 
Bedankt, misschien heb ik hier wel iets aan, zodra ik het snap ;)

Hoe ga ik hiermee te werk. Is het de bedoeling dat ik mijn bestaande functies aanpas, want die werken in principe al goed. Hoe helpt de opbouw van de date me een totaal te krijgen van de volledige recordset.

Volgens mij maakt het voor mij niet zoveel uit of ik werk met het aantal verstreken minuten (krijg ik uit de functie) of rechtstreeks met de gegevens uit het date format.


Ik gebruik de functies nu als volgt in een query:

ojh56f.jpg



Resultaat dat dat oplevert ziet er als volgt uit:

2cmnddc.jpg
 
Laatst bewerkt:
Als de gevraagde functionaliteit werkt dan zou ik niets meer veranderen. Dat zou je pas hoeven doen als je het geheel wat sneller of leesbaarder wilt hebben. Je query opbouw wordt dan sneller omdat het berekende veld sneller is.

Ik zie dat je startdatum en starttijd al met elkaar optelt dus mijn vorige post had niet gehoeven.

Voordat je de datum en tijd opslaat moet je afdwingen dat de einde n� de start komt, dan hoef je er in de elapsed functie niet meer op te testen. Testen op de waarde NULL op een parameter van het type date is zinloos omdat dat type NULL niet accepteert als geldige waarde.

HTH:D
 
Nou, de gevraagde functionaliteit werkt nog niet geheel, alleen de huidige functies zoals in de screenshots te zien is. Mijn probleem/vraag op dit moment is het volgende:

Zoals in de resultaten te zien is krijg ik reeds een kolom met de (berekende) duur van storingen in minuten. Alleen wil ik deze waarden nu optellen voor gebruik in een rapport zodat ik de totale stilstandduur kan laten zien. Echter wanneer ik in de query voor de grafiek de functie Som(minuten) aanroep, krijg ik een foutmelding dat er een fout in zit. Aantal(minuten) werkt wel maar dan telt hij gewoon alleen het aantal records. Ik verwacht dat het fout gaat bij het type in de kolom. Hoewel ik met de functie een integer return, krijg ik in de kolom als resultaat toch op de een of andere manier een string te zien. Maar dit is een vermoeden.

Ik hoop dat mijn probleem zo duidelijk is.
 
In geval van het aantal minuten (integer) moet je in de query niet "" opnemen maar 0. Je krijgt dan in je query als resultaat wel een 0 voor het aantal minuten maar dat denk ik wel je probleem op. NULL zou trouwens ook kunnen.

Dus aanpassen in de regel

minuten: IIF(IsNull([eindtijd]),0,ElapsedMinutes(...

HTH:D
 
In geval van het aantal minuten (integer) moet je in de query niet "" opnemen maar 0. Je krijgt dan in je query als resultaat wel een 0 voor het aantal minuten maar dat denk ik wel je probleem op. NULL zou trouwens ook kunnen.

Dus aanpassen in de regel

minuten: IIF(IsNull([eindtijd]),0,ElapsedMinutes(...

HTH:D

Hartelijk dank voor deze oplossing Guus.

Ik heb de "" vervangen door NULL en nu kan ik inderdaad ook de functie SOM() gebruiken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan