Berekenen overuren

Status
Niet open voor verdere reacties.

Hvdl70

Gebruiker
Lid geworden
4 jan 2009
Berichten
36
Ik heb op dit forum al één en ander gevonden voor het berekenen van overwerk, maar kan er niet zo goed aan uit.
PROBLEEM 1: Ik heb een database gemaakt om de werkprestaties van het technisch personeel in te geven, maar zit nu vast in de QRY overuren DAG/WACHT. Een normale werkdag bevat 8 uren Ik wil die 8 uur dus gewoon van de geprestuurde uren aftrekken, met een positief (overuren) of een negatief (minuren) tot gevolg.
Zoals je kan zien in de QRY probeer ik dat heel eenvoudig op te lossen als volgt :
Overuren: Format([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tijd];"hh:mm") waarvan [tijd] overeenkomt met 8:00 uren, deze geeft echter een error-melding. Hoe kan ik dit oplossen?

PROBLEEM 2 : Bijgevolg zou de QRY mij een totaalsom moeten geven van het aantal gepresteerde uren en de som van alle OVER- en MIN uren.

Wie kan me helpen,ben er zelf al een aantal uren mee bezig geweest.:confused:

Een beginnend acces leerling
Hans

Proberen is leren
 

Bijlagen

Voor probleem 1 is een (niet overdreven simpel, geef ik gelijk toe..) oplossing.
Eerst maar eens uitleggen waarom je een foutmelding kreeg. Je had een veld in je query toegevoegd met de tijdwaarde "08:00", en vervolgens een ander veld dat verwees naar dit tijdveld, met een datu'/tijdopmaak. Jammer genoeg is dat niet de juiste manier om een tijd te definiëren. Je kunt dat zelfs met één veld af:

Code:
Tijd=TimeValue("8:00")

De rest is wat moeilijker, omdat je de werktijd wilt vergelijken met die 8 uur. Dat betekent, dat je ook negatieve waarden uit je berekening kunt krijgen. Negatieve datums en tijden bestaan echter niet, daarom wordt je uitkomst van je oorspronkelijke berekening altijd positief.
Dus moet je met een IIF een check doen o de mogelijke uitkomst, en afhankelijk daarvan een minteken toevoegen aan de berekening. Dat wordt dus in onderstaande formule gedaan.

Code:
Expr1: IIf(([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tijd])<0;"-" & Format(([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tijd]);"Korte tijdnotatie");Format(([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tijd]);"Korte tijdnotatie"))

Nadeel hiervan is, dat je geen uitkomst krijgt waar je mee door kan rekenen, dus misschien dat je de berekening los moet laten, en een apart ja/nee veldje toevoegen, waarin je aangeeft of er langer of korter is gewerkt.

Ziet er dan zo uit:

Code:
IIF(([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-TimeValue("8:00"))<0;0;-1)

Kun je hopelijk weer verder mee...

Michel
 
Dank je wel, Michel, voor de mogelijke oplossingen:
Voor Probleem 1 had ik ondertussen al een work arround gevonden, Ik heb in de tabel van Techniekers een veld bijgemaakt [tech Werkuren], met hierin de [8:00].
Ik maakte een QRY met hierin :
Verschil_tov_werkdag: Format([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[Tech werkuren];"hh:mm")

Overwerk: IIf([Totaal gewerkt]>[Tech werkuren];[Verschil_tov_werkdag];Timevalue("00:00"))

Minwerk: IIf([Totaal gewerkt]<[Tech werkuren];[Verschil_tov_werkdag];Timevalue("00:00"))

Ik hoopte op die manier de waarden van Overwerk en Minwerk te kunnen optellen.

Ik heb een voorbeelddatabase gevonden met de customfunctie HoursAndMinutes, die zelf kan aangemaakt worden en waarin je tijden kan optellen:

http://office.microsoft.com/en-us/access/HA011102181033.aspx

Ik heb de HoursandMinutes functie aangemaakt, maar slaag er niet in dit op een juiste plaats te integreren. (had al geprobeerd in een rapportje, maar het lukt niet:confused::confused:)

Zoek ik het te ver? (of had ik het beter in excel gemaakt...:confused:)
 
Ik heb de functie eens bekeken, en volgens mij zit daar een jofele fout in; volgens mij berekent hij negatieve waarden niet goed. Dus hierbij een aangepaste functie die dat net wat beter doet:

Code:
Public Function HoursAndMinutes(interval As Variant) As String
'*************************************************************
' Function HoursAndMinutes(interval As Variant) As String
' Returns time interval formatted as a hours:minutes string
'*************************************************************
  Dim totalminutes As Long, totalseconds As Long
  Dim hours As Long, minutes As Long, seconds As Long
  Dim bNeg As Boolean
  

    If IsNull(interval) = True Then Exit Function
    If interval < 0 Then
        bNeg = True
        interval = Abs(interval)
    End If
    hours = Int(CSng(interval * 24))
  
    ' 1440 = 24 hrs * 60 mins
    totalminutes = Int(CSng(interval * 1440))
    minutes = totalminutes Mod 60
  
    ' 86400 = 1440 * 60 secs
    totalseconds = Int(CSng(interval * 86400))
    seconds = totalseconds Mod 60

    ' Round up the minutes and adjust hours
    If seconds > 30 Then minutes = minutes + 1
    If minutes > 59 Then hours = hours + 1: minutes = 0
    HoursAndMinutes = hours & ":" & Format(minutes, "00")
    If bNeg = True Then HoursAndMinutes = "-" & HoursAndMinutes

End Function

Je gebruikt 'm overigens als volgt:

Code:
Overuren: HoursAndMinutes([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tijd])

In deze variant hoef je dus geen rekening te houden met positieve of negatieve waarden, die worden in de functie afgevangen.

Normaals: om met negatieve tijdwaarden te kunnen rekenen, moet je eerst ergens vastleggen dat je een negatief getal hebt, en dat dan positief maken. Ik doe dat dus in de functie met een boolean, en de functie ABS. Vervolgens maak je dan de vervolgberekeningen.

Het belangrijkste punt van de (al dan niet oorspronkelijke) functie is, dat je hem een getal moet voeren. De functie maakt daar dan een tijdnotatie van.

Michel
 
Ik probeer deze functie in de QRY "overuren DAG " te zetten maar hij geeft mij een foutmelding : " de expresie bevat een ongedefinieerde functie HoursAndMinutes"

Wanneer ik die functie in een rapport op basis van de QRY "overuren dag" zet krijg ik dezelfde melding ofwel vraag hij mij de waardes zoals hij bij aanvang ook doet voor "geef initialen technieker:"
Snap het niet goed.
Ik dacht wel dat ik de functie juist opgeslagen had in modules....
Waar loopt het mis?:(
 

Bijlagen

Soms kun je ook iets te enthousiast zijn, zoals in dit geval.... ;)
Je hebt de module dezelfde naam gegeven als de functie, en dat gaat dus niet werken! Als je de module hernoemt naar bijvoorbeeld Tijdfuncties, dan moet-iet het weer doen!

Michel
 
Geweldig...dat werkt! :thumb::thumb::thumb::thumb:
Ik heb nu een rapport gemaakt met :
Datum, technieker, aantal uren gewerkt, overuren
Onderaan het rapport wil ik de som maken van alle overuren door in de page-footer een text vak te inplementeren met formule =sum([overuren]) , doch weeral een error (#error)
:confused:
 
Dat verbaast mij niet echt, omdat de waarde van het veld Overuren nu als een tekstveld wordt beschouwd. Je kunt proberen de formule te veranderen in Som(Val([Overuren]); kijken wat-ie dan zegt... Goeie kans dat er dan een getal uitkomt en geen tijd, maar dat is het volgende probleem.

Michel
 
Michel,
= sum(val[overuren]) contains invalid syntax :(

Hans:o
 
Ik zal er vanavond eens induiken....

Michel
 
... En de oplossing is als volgt:

Op een rapport kun je wel totalen maken, maar die moeten zijn gebaseerd op een groep. Je kunt niet (zonder programmeren althans) totalen berekenen op een pagina, zoals je had gedaan. Je moet dus eerst, bijvoorbeeeld op het veld Technaam, een groepering en een voettekst maken, en daar kan je dan een totaalveld op maken. Ook kun je een totaal maken op rapportniveau, als je de rapportvoettekst aanzet. Dan krijg je uiteraard een totaal over alle records.

Omdat je totaalberekening Overuren een positieve of negatieve 'tijd' is, kun je dat veld niet optellen, en ook Val werkt hier niet goed. Je kunt dus het beste onderstaande formule gebruiken, die het totaal in minuten uitrekent. De uitkomst hiervan kan uiteraard zonder problemen positief of negatief zijn.

Code:
=Som(([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tech werkuren]))*24*60

Succes verder!

Michel
 
nu de minuten naar uren boven 24u

Bedankt michel, dit blijkt te werken. :thumb:
Nog 1 klein vraagje vooraleer ik dit onderwerp afsluit:
Ik heb in mijn rapport nu een aantal possiieve of negatieve minuten als resultaat, welke ik wil omzetten in een aantal uren en minuten zoals : hh:mm, dit werkt tot 23:59.

=Format(Sum([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tech werkuren]);"hh:nn")

hierdoor komt 1822 minuten te staan als 06:22 ipv 30:22.
Ik las ergens op het forum dat je als formaat :mm moet ingeven, doch ik weet niet of deze dezelfde is in 't engels en waar ik dit formaat met invoeren.

Ander idee?:o
 
oplossing gedeeltelijk gevonden

Michel, heb hier de oplossing gevonden :
http://www.femda.com/vragen/antwoord.asp?CD=0&ID=vp0980084998
en het werkt, behalve bij het negatieve resultaat.

Stel dat een technieker op maandbasis een negatief saldo overuren heeft, in mijn geval
-45 min dan is het resultaat van
=fdTotaalTijd(Sum([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tech werkuren])) het volgende : -1d--1u--45min-0s

Kan er iets aangepast worden in de code?
(Dit gaat voor mij net iets te ver...)
Dank bij voorbaat
Groeten, Hans
 
Hoi Hans,

De link die je hebt neergezet doet het bij mij (al dan niet tijdelijk) niet, dus ik weet niet precies welke oplossing je nu hebt ingebouwd. Misschien kun je weer een testbestandje posten?

Michel
 
Ok Michel
Maar mijn file is ondertussen >100 KB, ik krijg hem niet toegevoegd.
Heb al een deel rapporten en formulier ge-deleted, tevergeefs.

Dit is de functie : =fdTotaalTijd(Som([dtmUren]))

Function fdTotaalTijd(interval) As String

Dim totalhours As Long, totalminutes As Long, totalseconds As Long
Dim days As Long
Dim hours As Long, minutes As Long, seconds As Long

days = Int(CSng(interval))
totalhours = Int(CSng(interval * 24))
totalminutes = Int(CSng(interval * 1440))
totalseconds = Int(CSng(interval * 86400))
hours = totalhours Mod 24
minutes = totalminutes Mod 60
seconds = totalseconds Mod 60

fdTotaalTijd = _
days & "d-" & hours & "u-" & minutes & "m-" & seconds & "s."

End Function
 
Op deze manier klopt het niet helemaal in mijn rapport, ik heb eveneens een notatie in aantal uren en minuten nodig bv: 126:27 (126u en 27min).
:confused:
 
Hoi Hans,

Ik heb de functie een beetje aangepast, zodat hij ook beter omgaat met negatieve waarden. Wat vind je hiervan?


Code:
Function fdTotaalTijd(interval As Double) As String

Dim totalhours As Long, totalminutes As Long, totalseconds As Long
Dim days As Long, hours As Long, minutes As Long, seconds As Long
Dim bNeg As Boolean

If interval < 0 Then
    interval = Abs(interval)
    bNeg = True
End If

days = Int(CSng(interval))
totalhours = Int(CSng(interval * 24))
totalminutes = Int(CSng(interval * 1440))
totalseconds = Int(CSng(interval * 86400))
hours = totalhours Mod 24
minutes = totalminutes Mod 60
seconds = totalseconds Mod 60
If bNeg = True Then
    If days > 0 Then days = -days
    If hours > 0 Then hours = -hours
    If minutes > 0 Then minutes = -minutes
    If seconds > 0 Then seconds = -seconds
End If

fdTotaalTijd = days & "d; " & hours & "u; " & minutes & "m"     ' & seconds & "s."

End Function

Wat er nu gebeurt, is dat een negatieve waarde eerst positief gemaakt wordt, om de berekening juist uit te kunnen voeren. Uiteraard wil je wel vasthouden dat het oorspronkelijke getal negatief was, en dat doe je met een Boolean.

Na het berekenen zet je de positieve getallen weer om naar een negatief getal, als de boolean bNeg positief is. Dat hoeft uiteraard niet bij getallen die nul zijn, hoewel technisch gezien -nul gelijk is aan nul. Het staat alleen minder fraai.

Lost dit het probleem op?

Michel
 
Ok, zal dat eens poberen.

Om van aantal minuten naar uurnotatie over te schakelen heb ik het volgende gevonden:

=TIJD(INTEGER(D1/60);REST(D1;60);0) waarvan D1 het aantal minuten is.
Maar hoe integreer ik dit in access, ik ga er van uit dat de formule uit excel komt.
+ ik zit met een engelstalige access... hoe ziet ze er dan uit.
tijd zal Time zijn, wat is REST?

Thanks op voorhand
Hans
 
Ik had in de functie ook nog een tijdconversie staan, maar die had ik er weer uitgehaald bij het posten... Daar hoef je niet te moeilijk over te doen, gewoon met een Format op je berekening. Daar komt namelijk een getal uit, dat je dan alleen maar als tijd hoeft weer te geven.

Enige probleem daarbij is uiteraard weer, dat datums/tijden niet negatief kunnen zijn, dus ook hiervoor zou je een simpele functie kunnen maken, die met Abs de berekening positief maakt, waarna je de opmaak toepast, en het eindresultaat met een -teken teruglevert als bNeg True is.

In de functie ddTotaalTijd zet je zo'n Format dus nà de If Interval <0.

De Tijdfunctie komt zo te zien inderdaad uit Excel, en die bestaat als zodanig niet in Access. Vertalen heeft dan ook niet zoveel zin.... De functie REST overigens is in het Engels MOD. En je gebruikt hem zoals in de functie.

Michel
 
Beste Michel,

Ik denk dat dit een beetje te diep gaat, heb helemaal geen programmer-achtergrond. :confused:

Als ik bij één van de vorige stappen in mijn rapport het aantal minuten kan omzetten naar uu:mm (waarbij aantal uren >24u) dan kan ik wel verder : (bv: 137:26)

Vorige Code:

=Som(([Eindtijd]-[Begintijd]-[Pauze]-([Aantal Woonwerk]*[Tech WWV])-[tech werkuren]))*24*60

Thx
Hans
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan