Lastige (?) query

  • Onderwerp starter Onderwerp starter scw
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

scw

Gebruiker
Lid geworden
5 jun 2009
Berichten
530
Goedendag beste forumleden,

Ik heb de volgende query opgesteld, maar hij werkt nog niet helemaal naar behoren.

SELECT tblPersonen.Active, tblPersonen.Aanname, tblPersonen.Naam, Count(tblPersonen.RecordID) AS AantalVanRecordID
FROM tblPersonen LEFT JOIN tblRecords ON tblPersonen.Naam = tblRecords.Aanname
WHERE (((Year([Datum])) Is Null Or (Year([Datum]))=Year(Now())))
GROUP BY tblPersonen.Active, tblPersonen.Aanname, tblPersonen.Naam
HAVING (((tblPersonen.Active)=-1) AND ((tblPersonen.Aanname)=-1))
ORDER BY Count(tblRecords.RecordID) DESC;

Hij doet het in principe goed, maar wat ik wil bereiken is dat wanneer ik vooruit in de tijd ga (zet m'n pc instellingen, Windows op 2010) dan wil ik zien dat alle Personen weer op 0 records uit komen. Dus:

[Van het huidige jaar]
Medewerker A
0
Medewerker B
0
Medewerker C
0
Medewerker D
2
etc.

Maar dat werkt nog niet... Ook heb ik geprobeerd:

SELECT tblPersonen.Active, tblPersonen.Aanname, tblPersonen.Naam, Count(tblRecords.RecordID) AS AantalVanRecordID
FROM tblPersonen LEFT JOIN tblRecords ON tblPersonen.Naam = tblRecords.Aanname
WHERE (((Year([Datum])) Is Null Or Year([Datum])<=Year(Now())))
GROUP BY tblPersonen.Active, tblPersonen.Aanname, tblPersonen.Naam
HAVING (((tblPersonen.Active)=-1) AND ((tblPersonen.Aanname)=-1))
ORDER BY Count(tblRecords.RecordID) DESC;


Maar dan laat telt Access alle records van alle jaren op. Wat ik dus wil bereiken is weergeven van het huidige jaar: welke personen hebben 0 records en welke hebben >0 records. Vrij simpel eigenlijk, maar lastig uit te drukken in een query??

Ik ben erg benieuwd hoe ik het kan oplossen, omdat ik nog een query wil samenstellen met eigenlijk hetzelfde erin :)

Bij voorbaat dank voor jullie meedenken hierin :thumb:
 
Om te beginnen moet je voorzichtig zijn met het aanpassen van je systeemdatum omdat sommige programma's die tijdgebonden zijn detecteren of er met de systeemdatum is geknoeid. Vervolgens schakelt dat programma zichzelf uit en kan je het niet meer gebruiken.

Je kan testen of een datum null is maar je kan ook in het geval dat dat zo is een default instellen met de NZ functie.
Code:
SELECT tblPersonen.Active, tblPersonen.Aanname, tblPersonen.Naam, Count(tblPersonen.RecordID) AS AantalVanRecordID
FROM tblPersonen LEFT JOIN tblRecords ON tblPersonen.Naam = tblRecords.Aanname
WHERE [COLOR="Red"]((Nz([Datum],Year(Date())>=Year(Date()))))[/COLOR]
GROUP BY tblPersonen.Active, tblPersonen.Aanname, tblPersonen.Naam
HAVING (((tblPersonen.Active)=-1) AND ((tblPersonen.Aanname)=-1))
ORDER BY Count(tblRecords.RecordID) DESC;
Als je hier niet uitkomt dan moet je even een voorbeeldje zippen.

HTH:D
 
nog niet, hier een voorbeeldje

Ha Guus,

Dank voor je bericht. Ik heb je oplossing geprobeerd, maar het is hem nog niet helemaal. Wat Access nu doet is: hij zet achter iedere medewerker standaard een 1 wanneer deze geen records 'bezit'. Ook geeft die in '2010' nog steeds dezelfde records door, terwijl ik graag zou hebben dat alle medewerkers met (-1) aanname op 0 records worden weergegeven.

Nou goed, ik zal maar even het voorbeeld bijvoegen: hopelijk verduidelijkt het e.e.a. voor je/jullie.

Bedankt!
 

Bijlagen

Ik weet niet over welke query je het nu hebt. De tabellen in je query bestaan niet in je voorbeeld database.

In query qryVerbeterpuntenPerBetrokkene snap ik niet waarom Naam aan Aanname is gekoppeld

FROM tblPersonen LEFT JOIN tblRecords ON tblPersonen.Naam = tblRecords.Aanname

Volgens mij moet je tblMedewerkers.MedewerkerID = tblVerbeterpunten.Betrokkene koppelen.


???
 
excuses

Ah excuses Guus,

Ik had alleen ff de namen veranderd voor posting op dit forum, maar in het bestandje gaat het om de qryVerbeterpuntenPerAanname.

Ik wil graag tellen hoeveel personen "Aannemen", dus het moet wel over de telling Aanname gaan ;) Mocht er nog iets onduidelijk zijn dan hoor ik dat natuurlijk!
 
Code:
SELECT tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam, Count(tblMedewerkers.MedewerkerID) AS AantalVanVerbeterpuntID
FROM tblMedewerkers INNER JOIN tblVerbeterpunten ON tblMedewerkers.MedewerkerID = tblVerbeterpunten.Betrokkene
WHERE (((Nz([Datum],Year(Date())>=Year(Date())))<>False))
GROUP BY tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam
HAVING (((tblMedewerkers.Active)=-1) AND ((tblMedewerkers.Aanname)=-1))
ORDER BY Count(tblVerbeterpunten.VerbeterpuntID) DESC;
Lees mijn eerdere commentaar. @14:29
 
bijna?

Ik waardeer je (vlugge) hulp Guus, helaas werkt het nog niet...

Ik heb de code geplakt in de query en:

- de query 'onthoudt' nog de verbeterpunten van het voorgaande jaar en telt deze mee
- de query zet voor 0 records standaard een 1 neer?

:( Welke expressie('s) kunnen we nog gebruiken om het gewenste resultaat te bereiken??
 
Oke.
Dan moet je wat meer informatie geven.
Wil je records tellen of aantallen bij elkaar optellen?

In tblVerbeterpunten zitten maar drie records dus als je 1 op 1 linkt zal je nooit meer dan drie records krijgen.

Wat is Aanname voor een veld? Is dat inderdaad een MedewerkerID?

Ik weet niet precies wat je wilt dus ik gok maar wat.
Code:
SELECT tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam, Count(tblMedewerkers.MedewerkerID) AS AantalVanVerbeterpuntIDCount, Sum(IIf(IsNull([VerbeterpuntID]),0,1)) AS AantalVanVerbeterpuntID
FROM tblMedewerkers LEFT JOIN tblVerbeterpunten ON tblMedewerkers.MedewerkerID = tblVerbeterpunten.Betrokkene
WHERE (((Nz([Datum],Year(Date())>=Year(Date())))<>False))
GROUP BY tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam
HAVING (((tblMedewerkers.Active)=True) AND ((tblMedewerkers.Aanname)=True))
ORDER BY Sum(IIf(IsNull([VerbeterpuntID]),0,1)) DESC;
HTH:D
 
Ja Guus, dus ik zal even helemaal terug naar de basis gaan :cool:

Voor het jaar 2009 wil ik weten:

Jantje
hoeveel x VerbeterpuntID?
Pietje
hoeveel x VerbeterpuntID?
etc.

Wanneer iemand heeft 0 x VerbeterpuntID dan ook de Naam weergeven in de query.

Aanname is gelijk aan MedewerkerID (bevoegd met -1 aanname).

Op 1 januari 2010, 0:01 uur staat iedereen weer op 0x VerbeterpuntID in de query, door de Year Now functie.

Dus ik wil niet bij elkaar optellen, maar alle VerbeterpuntID per persoon (vermeld in het vak aanname) tellen :p

Die laatste toegestuurde query werkte niet goed Guus, dan kwamen die eerdere dichter in de buurt :o
 
Levert dit wat bruikbaars op?

PARAMETERS TestDatum DateTime;
SELECT tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam, Count(tblVerbeterpunten.VerbeterpuntID) AS Verbeterpunten, tblVerbeterpunten.Datum
FROM tblMedewerkers LEFT JOIN tblVerbeterpunten ON tblMedewerkers.MedewerkerID = tblVerbeterpunten.Aanname
WHERE (((Year([Datum])) Is Null Or (Year([Datum]))=Year([TestDatum])))
GROUP BY tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam, tblVerbeterpunten.Datum, tblVerbeterpunten.VerbeterpuntID, tblMedewerkers.Active, tblMedewerkers.Aanname
HAVING (((tblMedewerkers.Active)=-1) AND ((tblMedewerkers.Aanname)=-1))
ORDER BY tblVerbeterpunten.VerbeterpuntID DESC;

Gaat weer terug naar de basis,maar dan met een parameter zodat je wat verschillende jaren kunt uittesten.
 
:( Michel, ik krijg een type mismatch in expression... ik kan hem niet achterhalen...
Kan het in de expressie TestDatum zitten??
 
De Parameter Testdatum kun je instellen/controleren in het menu <Query>, <Parameters>. Daar staat hij in, met als gegevenstype Datum/Tijd. Ik heb daar eigenlijk nooit problemen mee gehad, dus ik snap niet helemaal welke fout je krijgt.
Haal hem eventueel weg, en kijk dan wat er in de query gebeurt. Je kunt de parameter wel laten staan in de Criteriumregel, want je wilt wel een datum kunnen invoeren.
 
OK dat lijkt goed ingevuld te staan bij Parameters.

Ik heb nu dus overgenomen:

PARAMETERS TestDatum DateTime;
SELECT tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam, Count(tblVerbeterpunten.VerbeterpuntID) AS Verbeterpunten, tblVerbeterpunten.Datum
FROM tblMedewerkers, tblVerbeterpunten
WHERE (((Year([Datum])) Is Null Or (Year([Datum]))=Year([TestDatum])))
GROUP BY tblMedewerkers.Active, tblMedewerkers.Aanname, tblMedewerkers.Naam, tblVerbeterpunten.Datum, tblVerbeterpunten.VerbeterpuntID, tblMedewerkers.Active, tblMedewerkers.Aanname
HAVING (((tblMedewerkers.Active)=-1) AND ((tblMedewerkers.Aanname)=-1))
ORDER BY tblVerbeterpunten.VerbeterpuntID DESC;

Maar nu moet ik een parameterwaarde geven voor TestDatum?? :confused:
 
Dat klopt; as je wilt testen met verschillende datums, dan wil je niet knoeien met je systeemdatum, zoals Guus volkomen terecht al memoreerde. Door dus een datumvariabele te declareren in je query, kun je testen met verschillende datums, zonder dat je systeem door de war raakt. Omdat een normale variabele zoals [Typ hier de datum] als een tekstveld wordt beschouwd, heb je de mogelijkheid in Access om het type van de variabele in te stellen.
En dat is dus wat je doet met de regel "PARAMETERS TestDatum DateTime".
Het is nog steeds een variabele die je in moet vullen, maar het is wel een echt datumveld, dus je hoeft verder niet te rommelen om de parameter te valideren als datum.
 
Ah! Dat is inderdaad een duidelijk verhaal voor een handigheidje om te weten+gebruiken!

OK, maar nu voer ik de datum in bijv. 23/10/2009 en dan krijg ik allemaal dubbele personen met allemaal één record. De query lijkt het dus nog niet goed te doen. Ik vraag me nu af wat het nu is dat het lastig maakt? Want ik kan me voorstellen dat er toch veel meer queries zijn die gewoon optellen en tevens weergeven wanneer er niks op te tellen valt (=0)? Tjah, het enige specifieke wat ik er nog aan toevoeg is dat het in een bepaald jaar is.... :confused:
 
In je voorbeeldbestand zitten denk ik te weinig records voor ons om e.e.a. correct te testen. Op 3 testrecords zie ik natuurlijk niet zo snel wat er allemaal fout zou kunnen gaan.... Je kunt er nog een SELECT DISTINCT van maken, kijken of dat de situatie verbetert. Ik heb er zelf nog wat veldjes bijgezet, om te kijken wat er gebeurt met de verschillende gegevens, maar je hebt denk ik alleen de namen nodig?
 
Hoi Michel (+overige forummers),

Inderdaad zitten er mogelijk te weinig records in het voorbeeldbestandje om goed te kunnen testen. Ik zal proberen z.s.m. even een nieuw voorbeeldbestandje te plaatsen met wat meer records (inhoud).

Inderdaad hoef ik alleen maar de namen nodig te hebben...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan