Vreemde uitkomst SUM

Status
Niet open voor verdere reacties.

Shevhenco

Nieuwe gebruiker
Lid geworden
21 nov 2008
Berichten
2
Hallo kenners!

Ik ben iets aan het bouwen in het kader van voorraadbeheer van Fusten. Ik heb daarom een tabel waarin alle uitgaande fusten worden bijgehouden (TblFustData). Daarnaast heb ik een tabel waar allerlei informatie over de fusten in staat (TblFustGegevens). En tenslotte heb ik een tabel aangemaakt waarin ik in kan zetten hoeveel fusten retour zijn (TblFustDataRet).

Ik heb een formulier gebouwd op basis van de onderstaande query. Dit formulier laat het aantal fusten zien dat uitstaat bij een bepaalde klant, in een bepaald weeknummer per fustcode. In dat formulier heb ik een invulveld bij het betreffende record waarop je kan invullen hoeveel er terug zijn. Deze waarde wordt samen met het klantnummer, fustcode en weeknummer opgeslagen in de retour tabel.

Dit gaat allemaal goed. Maar nu komt mijn probleem. Als ik een requery doe wil ik dus dat hij het aantal dat reeds terug is al af trekt van het aantal dat in de tabel van de uitstaande staat. Stel dat er 10 uit stonden en er gisteren 4 retour zijn gekomen, dan moet er vandaag 6 staan. Maar als ik de query uitvoer komt er bij de sum van TblFustData.aantal een niet kloppende waarde uit. Als ik bijvoorbeeld in eerste instantie 3 fusten hebt en ik laat er 1 retour komen. Dan geeft de sum van TblFustData.aantal een 6 aan. De andere sums gaan wel goed. Want bij TblFustDataRet.aantal staat netjes 1, en als deze van elkaar worden afgetrokken in de volgende expressie komt er 6-1 = 5 uit. Maar die 6 klopt dus niet! Ik zit me suf te staren op de query maar ik kom er niet uit, vandaar dat ik aan jullie wil vragen of er iemand een idee heeft!

Hieronder de query:


SELECT TblFustData.weeknummer, TblFustData.klantnummer, TblFustData.fustcode, TblFustGegevens.Omschrijving, sum(TblFustData.aantal) AS FustenUIT, sum(TblFustDataRet.aantal) AS FustenRETOUR, sum(TblFustData.aantal-TblFustDataRet.aantal AS HuidigAANTAL, sum(TblFustData.huur) AS [Totale huur]

FROM TblFustData, TblFustGegevens, TblFustDataRet

WHERE TblFustData.fustcode=TblFustGegevens.Fustcode And TblFustData.Fustcode=TblFustDataRet.Fustcode And tblfustdata.weeknummer=TblFustDataRet.weeknummer And TblFustData.Klantnummer=TblFustDataRet.klantnummer

GROUP BY TblFustData.fustcode, TblFustGegevens.Omschrijving, TblFustData.weeknummer, TblFustData.klantnummer;


Als ik de volgende query uitvoer komt er wel een goede waarde uit:

SELECT TblFustData.weeknummer, TblFustData.klantnummer, TblFustData.fustcode, sum(TblFustData.aantal) AS FustenUIT

FROM TblFustData

GROUP BY TblFustData.fustcode, TblFustData.weeknummer, TblFustData.klantnummer;



Bij voorbaat dank!! Henco
 
Hmmm, ik zie het zo niet en zonder de gehele tabelstructuur kan ik er ook moeilijk aan gaan knutselen, maar ik heb wel een stukje advies :)

Probeer eens om alle SUM() en groupby operaties weg te halen, en de velden die geSUMd worden gewoon weer te geven.

Dan krijg je een heel duidelijk overzicht van wat precies opgeteld wordt, en dan zie je meestal ook al vrij snel waar die extra getallen vandaan komen.

Hoop dat het helpt.
 
Omdat je meerdere tabellen selecteert in een cartsisch product is het risico groot dat je in twee van je tabellen een 1 op N relatie krijgt. 1 record in de ene tabel levert N records op in de andere tabel. In jouw geval worden dat dus N records in meerdere tabellen omdat jij er drie gebruikt.
Wat je dus moet doen is een 1 op 1 relatie afdwingen zodat ieder record in TblFustData 1 record oplevert in de andere twee tabellen. Als je dat niet doet dan krijg je dat er records uit een tabel N keer worden getoond en dus ook N keer worden meegeteld in je som.

FYI: Het gebruik van JOINs zorgen ervoor dat je query sneller wordt omdat er geen cartesisch product wordt gegenereerd. Ik stel voor dat je die gebruikt in plaats van
Code:
FROM TblFustData, TblFustGegevens, TblFustDataRet
WHERE TblFustData.fustcode=TblFustGegevens.Fustcode And TblFustData.Fustcode=TblFustDataRet.Fustcode And tblfustdata.weeknummer=TblFustDataRet.weeknummer And TblFustData.Klantnummer=TblFustDataRet.klantnummer
maar:
Code:
FROM TblFustData inner join TblFustGegevens
on TblFustData.fustcode=TblFustGegevens.Fustcode
inner join TblFustDataRet on TblFustData.Fustcode=TblFustDataRet.Fustcode And tblfustdata.weeknummer=TblFustDataRet.weeknummer And TblFustData.Klantnummer=TblFustDataRet.klantnummer
Enjoy!
 
Heren, bedankt. Uiteindelijk heb ik het opgelost via 2 toevoegquery's die een tabel vullen. Deze tabel is vervolgens de bron voor de uiteindelijke query.

Groetn, Henco
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan