Wie vindt de fout in mijn urenberekening?

Status
Niet open voor verdere reacties.

Ewergreen

Gebruiker
Lid geworden
15 mrt 2008
Berichten
273
Ik krijg een aantal negatieve uren en de optelling eindigt ook te hoog!

Code:
SELECT *
FROM [select z.*, format(cstr(int(y.workedhours/1)), "00") +  ':' + format(cstr(cdbl(y.workedhours - int(y.workedhours/1))*60), "00") as workedhours
from (SELECT tblWerknemers.WerknemersID, tblWerknemers.WerknemersVoornaam, tblWerknemers.WerknemersAchternaam, tblWerkuren.WerkurenID, tblWerkuren.WerkurenDatum, tblWerkuren.WerkurenStart, tblWerkuren.WerkurenEinde, format(cstr(int((DateDiff("n", min(werkurenstart),max(werkureneinde))/60)/1)), "00") +  ':' + format(cstr(cdbl((DateDiff("n", min(werkurenstart),max(werkureneinde))/60) - int((DateDiff("n", min(werkurenstart),max(werkureneinde))/60)/1))*60), "00")        AS Gewerkt, tblWerkuren.WerkurenOpmerking
FROM tblWerknemers INNER JOIN tblWerkuren ON tblWerknemers.WerknemersID = tblWerkuren.WerknemersID
GROUP BY tblWerknemers.WerknemersID, tblWerknemers.WerknemersVoornaam, tblWerknemers.WerknemersAchternaam, tblWerkuren.WerkurenID, tblWerkuren.WerkurenDatum, tblWerkuren.WerkurenStart, tblWerkuren.WerkurenEinde, tblWerkuren.WerkurenOpmerking) as z, 


(select az.werkurendatum, sum(az.workedhours) as workedhours from 
(SELECT werkurendatum, nz((totalhours - sum(gaps)), totalhours) AS workedhours
FROM [SELECT p2.werkurendatum as datum, datediff("n", MAX(P1.WerkurenEinde),  P2.WerkurenStart)/60 as gaps, p2.werknemersid as werknemersid
FROM tblWerkuren AS P1
INNER JOIN
tblWerkuren AS P2
ON P1.WerkurenStart < P2.WerkurenStart and p1.werkurendatum = p2.werkurendatum and p1.werknemersid = p2.werknemersid
GROUP BY P2.WerkurenStart, p2.werkurendatum, p2.werknemersid
HAVING MAX(P1.WerkurenEinde) < P2.WerkurenStart]. AS a RIGHT JOIN [SELECT c.WerknemersID, c.WerkurenDatum,(DateDiff("n", min(c.werkurenstart),max(c.werkureneinde))/60) AS totalhours
FROM tblWerkuren AS c
group by c.werkurendatum, c.werknemersid]. AS d ON (a.datum + a.werknemersid)  = (d.werkurendatum + d.werknemersid)
GROUP BY datum,  werkurendatum, totalhours) as az
group by az.werkurendatum) as y

where (z.werkurendatum = y.werkurendatum)]. AS other, [select format(cstr(int(sum(az.workedhours)/1)), "00") +  ':' + format(cstr(cdbl(sum(az.workedhours) - int(sum(az.workedhours)/1))*60), "00") as total from 
(SELECT werkurendatum, nz((totalhours - sum(gaps)), totalhours) AS workedhours
FROM [SELECT p2.werkurendatum as datum, datediff("n", MAX(P1.WerkurenEinde),  P2.WerkurenStart)/60 as gaps, p2.werknemersid as werknemersid
FROM tblWerkuren AS P1
INNER JOIN
tblWerkuren AS P2
ON P1.WerkurenStart < P2.WerkurenStart and p1.werkurendatum = p2.werkurendatum and p1.werknemersid = p2.werknemersid
GROUP BY P2.WerkurenStart, p2.werkurendatum, p2.werknemersid
HAVING MAX(P1.WerkurenEinde) < P2.WerkurenStart]. AS a RIGHT JOIN [SELECT c.WerknemersID, c.WerkurenDatum,(DateDiff("n", min(c.werkurenstart),max(c.werkureneinde))/60) AS totalhours
FROM tblWerkuren AS c
group by c.werkurendatum, c.werknemersid]. AS d ON (a.datum + a.werknemersid)  = (d.werkurendatum + d.werknemersid)
GROUP BY datum,  werkurendatum, totalhours) as az]. AS total
WHERE 1=1;
 
Hak je probleem op in kleinere stukjes. Maak er subqueries van en zorg dat iedere subquery het resultaat geeft wat je verwacht. Daarna kan je je subqueries aan elkaar plakken. Het probleem is ineens veel leesbaarder en minder complex.
 
Guus,

Ik ben klein begonnen en heb ze uiteindelijk samengevoegd. Ik zie dat mijn gewerkte uren per opdracht al correct berekend worden (Gewerkt). De eindtotalen per periode worden ook correct berekend (total).

Het probleem stelt zich bij de dagtotalen (workedhours). Ik heb me echt al rot gezocht achter de oplossing, maar vind het niet. Ik zou het opnieuw kunnen gaan opsplitsen, maar deze fout moet toch te vinden zijn, zonder meer?
 
misschien kan je posten wat je nu hebt? liefst in de vorm van een database?
 
Ik haal straks even een aantal persoonlijke gegevens uit de db, dan post ik ze.

Alvast bedankt!
 
De query "new_source".

VB_rapport_fout.jpg
 
Laatst bewerkt:
Waarom kunnen er overlappende uren inzitten voor een medewerker?

volgens mij kan dat niet. Dus je moet afdwingen dat er geen overlap is. Daarna kan je de volgende query gebruiken.
Code:
SELECT tblWerknemers.WerknemersID, tblWerknemers.WerknemersVoornaam, tblWerknemers.WerknemersAchternaam, tblWerkuren.WerkurenDatum, tblWerkuren.WerkurenStart, tblWerkuren.WerkurenEinde, Format([werkureneinde]-[Werkurenstart],"Short Time") AS [Gewerkte Uren]
FROM tblWerknemers INNER JOIN tblWerkuren ON tblWerknemers.WerknemersID = tblWerkuren.WerknemersID
GROUP BY tblWerknemers.WerknemersID, tblWerknemers.WerknemersVoornaam, tblWerknemers.WerknemersAchternaam, tblWerkuren.WerkurenDatum, tblWerkuren.WerkurenStart, tblWerkuren.WerkurenEinde, Format([werkureneinde]-[Werkurenstart],"Short Time");
Dubbele records heb ik hier onderdrukt
 
Laatst bewerkt:
Het kan inderdaad niet dat er overlappende uren inzitten, maar helaas gebeurt het dagelijks... . De chauffeur combineert namelijk soms twee ritten, en schrijft op beide bonnen eenzelfde uur op, OF schrijft overlappende uren op voor zaken die samen op de wagen staan.
 
Het kan inderdaad niet dat er overlappende uren inzitten, maar helaas gebeurt het dagelijks... . De chauffeur combineert namelijk soms twee ritten, en schrijft op beide bonnen eenzelfde uur op, OF schrijft overlappende uren op voor zaken die samen op de wagen staan.
Je moet afdwingen dat er geen overlap meer is. Wat ook kan is dat je een query runt die alle dubbele verwijdert.
Nog een mogelijkheid is dat je mijn query gebruikt. Door de group by worden de dubbele records al onderdrukt. Maar alleen echt identieke records worden onderdrukt. Records waarbij de tijden wel overlappen maar niet hetzelfde zijn daar moet je iets anders voor verzinnen
 
Het is alvast WEER een stap in de goede richting... . Nu nog een manier vinden om uit uw query de overlappende uren te filteren. ZUCHT :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan