Tijds berekening

Status
Niet open voor verdere reacties.

snelledre

Gebruiker
Lid geworden
1 dec 2013
Berichten
40
Ik heb op dit moment een tijds berekening in mijn formulier storingsregistratie die werkt eigenlijk goed tenzij de ingevoerde tijden zich op dezelfde dag bevinden.
Ik heb gekozen voor aparte velden voor de tijden en datum velden, dit omdat voor 95% het tijdsvak toch binnen dezelfde dag bevinden en dus het datum veld voor 95% alvast automatisch is ingevuld.
Hoe kan ik de berekening ook correct laten verlopen als de eindtijd pas de volgende dag is.

Tabel storingen heeft de volgende veldnamen:
Datum_aanvang (korte datumnotatie) (=date() wat te wijzigen is in het formulier)
Tijd_aanvang (korte tijds notatie)
Datum_klaar (korte datumnotatie) (=date() wat te wijzigen is in het formulier)
Tijd_klaar (korte tijdsnotatie)
Tijdsduur (korte tijdsnotatie) dit is dus het huidige berekende veld (Tijdsduur = Tijd_klaar - Tijd_aanvang)

Hoe kan ik ervoor zorgen dat als de storing om 22:30 begint en eindigt om 02:15 de juiste tijd wordt berkend?

André
 
In Access ziet de formule er inderdaad iets anders uit :).
Code:
Expr1: (([Datum_klaar]-[Datum_aanvang])+([Tijd_klaar]-[Tijd_aanvang]))
Werkt ook als het verschil groter is als 1 dag.
 
Geloof me, het kan veel ingewikkelder :)
 
Iets te vroeg gejuigd

Ben bang dat ik de ingewikkelde manier toch nodig heb.
Op zich werkt het het maar als 3 monteurs bijvoorbeeld van 22:00 t/m 03:00 aan een storing hebben gewerkt.
Ik bereken dan de tijd en dat is 5 uur dat klopt perfect maar de totaal tijd is dus hoger dan 24 uur en dan gaat het mis hij laat dan 01:00 zien in het formulier.

Moet je dan op een één of andere manier de uren en minuten scheiden en appart optellen?
Let op ik wil later ook alle stoorings tijden optellen en in een rapport laten zien.

André
 
De methode is goed, je verwerking niet helemaal. Als je de berekening in een nieuw veld maakt, zie je de uitkomst als een getal. Daarvan zet je de notatie op "Korte tijdnotatie" en je ziet het aantal uren. Gebruik je de juiste notatie, dan zie je ook het aantal dagen. Maar eigenlijk klopt dat niet, want de echte waarde is nog steeds iets als: 1,53257. Dus om de uitkomst te vertalen, moet je de formule nog vermenigvuldigen met 24. En dan zie je, ongeacht het aantal dagen, het echte aantal uren.
 
Helaas vat ik het nog even niet en wat ik probeer komt er niet de goede totaal tijd uit.
Tijdsduur is zowel in de tabel als in het formulier een kortetijdsnotatie.
De velden K-monteur controleer ik of deze zijn ingevuld zo ja dat tel ik de tijdsduur er nogmaals bij op.

Hier onder een gedeelte van de code:

Code:
Private Sub CmdSave_Click()
Dim duur As Date
duur = (([Datum_klaar] - [Datum_aanvang]) + ([Tijd_klaar] - [Tijd_aanvang]))
If IsNull(Me.K_Monteur2) = True Then
Tijdsduur = duur
ElseIf IsNull(Me.K_Monteur3) = True Then
Tijdsduur = duur + duur
ElseIf IsNull(Me.K_Monteur4) = True Then
Tijdsduur = duur + duur + duur
ElseIf IsNull(Me.K_Monteur5) = True Then
Tijdsduur = duur + duur + duur + duur
ElseIf IsNull(Me.K_Monteur5) = False Then
Tijdsduur = duur + duur + duur + duur + duur
End If

If Gegevenscontrole Then
DoCmd.RunCommand acCmdSaveRecord
DoCmd.RunCommand acCmdRecordsGoToNew
End If
End Sub
 
Notatie heeft niets te maken met inhoud. Al maak je het veld Tijdsduur op als Percentage, dan nog zal er een correcte waarde worden opgeslagen. Een denkfout die vaker gemaakt wordt :).
De berekening kan netter, maar dat is het punt verder niet. Je moet het resultaat dus vermenigvuldigen met 24, en een gewone getal notatie gebruiken.
 
Het is me nu gelukt om alles in minuten te laten weergeven dus maal 1440.

Ik heb ook nog een methode gevonden om alles in normale uren en minuten weer te geven.
Maar hoe roep ik nu de functie elapsed aan om de uitkomst bij voorbeeld in een textveld test weer te geven op het formulier.

Zie code:
Code:
Public Function elapsed(Datum_a As Date, Tijd_a As Date, Datum_k As Date, Tijd_k 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 = Datum_a + Tijd_a
    eind = Datum_k + Tijd_k

    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
 
De functie heeft een aantal gegevens nodig, die je mee moet geven. Dat zijn de parameters Datum_a, Tijd_a, Datum_k en Tijd_k. Als je de functie Opbouwen gebruikt, zie je vanzelf hoe je die moet vullen. Maar het zijn verplichte velden, dus je moet ze meegeven. Dus in een query ziet het er zo uit:
Code:
Expr1:Elapsed([Startdatum], [StartTijd], [EindDatum], [EindTijd])
 
Inmiddels was ik ook zover, alleen ik krijg met het uitvoeren van de query de volgende foutmelding 'de expressie bevat een ongedefinieerde functie elapsed'
De functie elapsed is al een public module opgeslagen. (Acces 2013)
Zelf zie ik geen fouten en met google en mijn boeken wordt ik er ook niet wijzer van.

Heb je nog een tip Octafish

Code:
Duur: elapsed([Datum_aanvang];[Tijd_aanvang];[Datum_klaar];[Tijd_klaar])

Ik heb ook dit geprobeerd maar zonder resultaat
Code:
Duur: elapsed([Storingen]![Datum_aanvang];[Storingen]![Tijd_aanvang];[Storingen]![Datum_klaar];[Storingen]![Tijd_klaar])
 
Laatst bewerkt:
Nee sorry de functie is nog steeds elapsed.
Is inmiddels aangepast in de vraag

Code:
Public Function elapsed(Begindatum As Date, Begintijd 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 = Begindatum + Begintijd
    eind = Einddatum + Begintijd

    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
 
Laatst bewerkt:
Als de velden kloppen, dan moet de functie werken. Zo niet, dan wil ik de db wel zien, want anders wordt het een erg lang gokfestijn.
 
Toch lijkt het erop dat er iets niet lekker loopt in de functie.
Als ik namelijk de onderstaan functie gebruik van Microsoft met de onderstaande expressie in een query werkt het wel.
Rara politiepet dan de optie van Microsoft maar gebruiken.
Bedankt iedereen voor het meedenken, op naar de volgende uitdaging die ik ga tegenkomen.

Code:
duur: GetElapsedTime(([Storingen]![Datum_klaar]+[Storingen]![Tijd_klaar])-([Storingen]![Datum_aanvang]+[Storingen]![Tijd_aanvang]))

Code:
 Function GetElapsedTime(interval)

 Dim totaaluren, totaalminuten As Long, totaalseconden As _
     Long
 Dim dagen As Long, uren As Long, minuten As Long, seconden As Long

 dagen = Int(CSng(interval))
 totaaluren = Int(CSng(interval * 24))
 totaalminuten = Int(CSng(interval * 1440))
 totaalseconden = Int(CSng(interval * 86400))
 uren = totaaluren Mod 24
 minuten = totaalminuten Mod 60
 seconden = totaalseconden Mod 60

 GetElapsedTime = dagen & " Dagen " & uren & " Uren " & minuten & _
 " Minuten " & seconden & " Seconden "

 End Function
 
Dit werkt toch ook?? Kleinere module...:confused:

Function werktijd(Starttijd, Eindtijd)

TijdInSec = DateDiff("s", Starttijd, Eindtijd)


U = Int((TijdInSec / 3600))
M = Int(((TijdInSec / 3600) - U) * 60)
S = Round(((((TijdInSec / 3600) - U) * 60) - M) * 60)


werktijd = TimeSerial(U, M, S)


End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan