Rapportformule in tekstvak - berekening van gewerkte uren

Status
Niet open voor verdere reacties.
Ok, hier is dan het beloofde voorbeeld... Ik heb het toch op mijn manier aangepakt, dus ik raad je aan de voorbeelden goed te bekijken, en indien mogelijk over te nemen (dat laatste is zeker te doen...).

Ik heb twee tabellen gemaakt met daarin bloktijden. Een tabel bevat blokken van een uur, waarbij dus niet in elk blok een pauze voorkomt (tabel [tBloktijden]), en een tabel bevat bloktijden van 3 uur, waarbij in elk blok dus wel een pauzetijd is opgenomen (tabel [tBloktijden_lang]). Ik heb een functie gemaakt in het moduleblad [Werktijden], en daarin staat de functie <Werktijd>. Deze functie wordt in twee queries gebruikt. De query [qBloktijden] maakt gebruik van de tabel [tBloktijden], en de query [qBloktijden_lang] maakt gebruik van de tabel [tBloktijden_lang]. In beide queries wordt de functie <Werktijd> gebruikt om de werktijden te berekenen. Die werktijden zijn ingevuld in de tabel [tblWerktijden].

Door de werkbloktijden in een tabel te zetten, heb je veel makkelijker toegang tot de pauzetijden; een aanpassing van die tijden heeft verder geen consequenties voor de berekeningen, want die worden gedaan op basis van de tabel met Bloktijden. Dus die waanzinnige manier van tijden omrekenen (0:12 minuten (oftewel 0,00833333333333333) ) kun je dus helemaal vergeten.

Als toetje zit er ook nog een rapport bij dat een overzicht van de uren per medewerker geeft.
 

Bijlagen

Waarvoor dient die [PauzeBegin] en [PauzeEind] eigenlijk?

Want het is wel de bedoeling dat de pauze vast staat.
Dus van 15u30 tot 15u42

En de middag staat ook vast.
Dus van 12u00 tot 12u36
 
Kijk eens in de tabellen; daar zie je echt wel vaste pauzetijden staan!
 
Is zoiets ook geen oplossing?

'BEREKEN GEWERKTE UREN
Dim count As Integer

Dim middag As Date
Dim rust As Date
Dim middagtijd As Date
Dim rusttijd As Date

Dim result As Date

count = 0
middag = Me.middag 'zit in textbox in rapport met waarde 00:36
rust = Me.rust 'zit in textbox in rapport met waarde 00:12
middagtijd = Me.middagtijd 'zit in textbox in rapport met waarde 12:00
rusttijd = Me.rusttijd 'zit in textbox in rapport met waarde 15:30

If [BeginTijdcalc] < middagtijd And [EindTijdcalc] > rusttijd Then

result = [EindTijdcalc] - [BeginTijdcalc] - middag - rust


ElseIf [BeginTijdcalc] < middagtijd And [EindTijdcalc] < rusttijd Then

result = [EindTijdcalc] - [BeginTijdcalc] - middag
MsgBox (result)

ElseIf [BeginTijdcalc] > middagtijd And [EindTijdcalc] > rusttijd Then

result = [EindTijdcalc] - [BeginTijdcalc] - rust
MsgBox (result)

ElseIf [BeginTijdcalc] < middagtijd And [EindTijdcalc] < rusttijd Then

result = [EindTijdcalc] - [BeginTijdcalc]
MsgBox (result)

Else

MsgBox ("foutieve formule")

End If
 
pff ik kom er hier zot van :evil:

ik denk dat ik teveel in excel termen denk met mijn geneste ALS functie
 
Jouw functie vind ik een beetje kort door de bocht, qua rekengeweld... Je houdt bijvoorbeeld geen rekening met mensen die in een pauze beginnen met werken. Maar als hij werkt, dan werkt hij. Zelf zou ik de pauzetijden dus niet in het rapport opslaan, want als je meer rapporten maakt, moet je steeds hetzelfde opnieuw doen. Ik zou de bloktijden dus in de functie zetten, en niet op het rapport of formulier. Dus zo:

Code:
Function Werktijd2(Begintijd As Date, Eindtijd As Date)
Dim Middag As Date, Rust As Date, MiddagTijd As Date, Rusttijd As Date

Middag = TimeSerial(0, 36, 0)
Rust = TimeSerial(0, 12, 0)
MiddagTijd = TimeSerial(12, 0, 0)
Rusttijd = TimeSerial(15, 30, 0)

If Begintijd < MiddagTijd And Eindtijd > Rusttijd Then
    Werktijd2 = Eindtijd - Begintijd - Middag - Rust
ElseIf Begintijd < MiddagTijd And Eindtijd < Rusttijd Then
    Werktijd2 = Eindtijd - Begintijd - Middag
ElseIf Begintijd > MiddagTijd And Eindtijd > Rusttijd Then
    Werktijd2 = Eindtijd - Begintijd - Rust
ElseIf Begintijd < MiddagTijd And Eindtijd < Rusttijd Then
    Werktijd2 = Eindtijd - Begintijd
End If

End Function

Maar die van mij rekent nauwkeuriger :D
 
en hoe kan ik dan die functie aanroepen zodat hij dit voor iedere record in mijn tabel berekent?

Ik had gedacht aan in de query zelf een nieuw veld te plaatsen
bv

time: Werktijd2([BeginTijd];[EindTijd])

maar dit werkt niet echt
 
Laatst bewerkt:
Hij zou het daarmee moeten doen; ik heb 'm zelf ook zo getest.
 
Ja, nu krijg ik het zoals ik wil
bedankt;

ik ga misschien er hier en daar nog >= van maken
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan