Qry maken met uren in tijdsblokken

Status
Niet open voor verdere reacties.

rebirth

Gebruiker
Lid geworden
17 jun 2008
Berichten
170
Hallo,

Ik probeer een query te maken van een tabel met uren. Hierbij wil ik per persoon het aantal dagen waarbij de uren <4u, tussen 4u en 5u59, tussen 6u en 7u59 en > 8u. Ik heb dit proberen te doen met group by, en dan aantal te kiezen bij de uren, met de nodige criteria, maar hij geeft dit dan altijd weer als 00:00 uur, en niet als een gewoon cijfer. Is er iemand die me hierbij kan helpen?
Voorbeeldje van wat ik nu slechts krijg, in bijlage.

Groeten, Bjorn
 

Bijlagen

  • vb.zip
    vb.zip
    35,6 KB · Weergaven: 36
Is dit wat je bedoelt?

SELECT Kind, Format([datum],"m") AS maand, Format([datum],"yyyy") AS jaar, IIf((([Einduur]-[Beginuur])*24)<4,1,IIf((([Einduur]-[Beginuur])*24)>6,IIf((([Einduur]-[Beginuur])*24)>8,4,3),2)) AS Cat, Count([Opvang ID]) AS Aantal
FROM Opvang
GROUP BY Kind, Format([datum],"m"), Format([datum],"yyyy"), IIf((([Einduur]-[Beginuur])*24)<4,1,IIf((([Einduur]-[Beginuur])*24)>6,IIf((([Einduur]-[Beginuur])*24)>8,4,3),2));

Deze query deelt het verschil tussen begintijd en eindtijd op in 4 categorieën, waar je dan vervolgens op groepeert. Het tijdverschil wordt met 24 vermenigvuldigd, om er een fatsoenlijk getal van te maken, maar je kunt uiteraard ook het normale verschil nemen. Alleen zijn decimalen wat minder makkelijk terug te vertalen naar tijd, vandaar de omrekening.
Overigens zaten er een paar vervelende verwijzigingen in je verwijzingen in het VBA scherm. Daardoor deed de db het eerst niet. Als je die verwijzingen niet nodig hebt, zou ik ze er zeker uitgooien, dat kan een hoop ellende later voorkomen.

Michel
 
Hey Michel,

Dit is exact wat ik wou! Ik moet eerlijk bekennen dat ik er nooit op zou gekomen zijn, het ziet er net ietsje te ingewikkeld uit voor mij :o Maar in ieder geval hartelijk dank om me de oplossing aan te bieden.

Wat betreft die verwijzingen in mijn vba scherm, welke bedoel je dan precies? Het is namelijk wel zo dat ik een aantal andere schermen had, die ik in dit voorbeeld weggelaten heb, en die code zal daar hoogstwaarschijnlijk mee verbonden geweest zijn. Maar is er dan iets mis met die code?

Groeten, Bjorn

*edit* Nog even een aanvullend vraagje, als ik mag: is het ook mogelijk om de verschillende categorieën per kind naast elkaar te tonen? Zoiets als:
| kind | maand | jaar | Cat1 | Cat2 | Cat3 | Cat4 |
| 1 | 7 | 2009 | 2 | 4 | 1 | 7

Dus geen verschillende rijen, maar slechts 1 rij per kind/maand/jaar
Als je begrijpt wat ik bedoel :)
 
Laatst bewerkt:
De verwijzingen in de database hebben op zich niks met je formulieren te maken, maar wel dus met de VBA code die achter formulieren en knoppen hangt.
Access maakt gebruik van bepaalde bibliotheken met functies, zodat je formules en zo kunt maken. Die bibliotheken moeten geladen zijn, zoals dat heet, anders werkt Access niet goed. Als je nu bibliotheken gebruikt die iemand anders niet heeft, kan je dus problemen krijgen.
In jouw voorbeeld zaten dus een paar rare bibliotheken die ik zef niet ken, laat staan dat ik ze gebruik. Daardoor kon ik de query die je zelf had gemaakt niet draaien, want Access kende bij mij daardoor de functie Format niet meer....
Vandaar mijn opmerking om rare bibliotheken te verwijderen.

Je kunt van de query die ik heb gemaakt wel een Kruistabel query maken, waarbij je het veld Categorie als kolomkop gebruikt. Ik zal hem straks nog wel posten, als ik tijd heb.
Je mag hem uiteraard ook zelf proberen...

Michel
 
En hier is de code voor de kruistabel:

TRANSFORM Count(Opvang.[Opvang ID]) AS Aantal
SELECT Opvang.Kind, Format([datum],"m") AS maand, Format([datum],"yyyy") AS jaar
FROM Opvang
GROUP BY Opvang.Kind, Format([datum],"m"), Format([datum],"yyyy")
PIVOT IIf((([Einduur]-[Beginuur])*24)<4,1,IIf((([Einduur]-[Beginuur])*24)>6,IIf((([Einduur]-[Beginuur])*24)>8,4,3),2));

Ik zal nog een variant maken waarbij je niet de categorieën ziet, maar de tijdsblokken.

Michel
 
Met deze twee queries ziet het er wat netter uit:

SELECT Opvang.[Opvang ID], Opvang.Kind, Format([datum],"yyyy") AS jaar, Format([datum],"m") AS maand, IIf((([Einduur]-[Beginuur])*24)<4,1,IIf((([Einduur]-[Beginuur])*24)>6,IIf((([Einduur]-[Beginuur])*24)>8,4,3),2)) AS Cat, Switch([Cat]=1,"<4",[Cat]=2,"4-6",[Cat]=3,"6-8",[Cat]=4,">8") AS Categorie
FROM Opvang
ORDER BY Opvang.Kind, Format([datum],"yyyy"), Format([datum],"m"), IIf((([Einduur]-[Beginuur])*24)<4,1,IIf((([Einduur]-[Beginuur])*24)>6,IIf((([Einduur]-[Beginuur])*24)>8,4,3),2));

Deze query sla je op onder de naam [Qry voorbereiding indiening uren]

De kruistabel ziet er als volgt uit:

TRANSFORM Count([Qry voorbereiding indiening uren].[Opvang ID]) AS [AantalVanOpvang ID]
SELECT [Qry voorbereiding indiening uren].Kind, [Qry voorbereiding indiening uren].jaar, [Qry voorbereiding indiening uren].maand
FROM [Qry voorbereiding indiening uren]
GROUP BY [Qry voorbereiding indiening uren].Kind, [Qry voorbereiding indiening uren].jaar, [Qry voorbereiding indiening uren].maand
PIVOT [Qry voorbereiding indiening uren].Categorie;

Die mag elke naam hebben die je handig vindt.

Michel
 
Prachtig, dit was helemaal wat ik wou!!!
Hartelijk dank voor al je wijsheid Michel :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan