Gegevenstypen kom niet overeen met criteriumexpressie

Status
Niet open voor verdere reacties.

DaFuzz

Gebruiker
Lid geworden
12 dec 2013
Berichten
27
Goedemiddag allen

Voor mijn werk heb ik een database gemaakt waarin ik nu bezig ben om een aanpassing in te maken.
De aanpassing zou geen invloed moeten hebben op mijn query waar ik nu een vraag over ga stellen, en de desbetreffende query heeft het tot dusverre altijd goed gedaan, tot vandaag aan toe.

De query bekijkt aleen maar wie er de aankomende 7 dagen jarig zullen zijn en luidt als volgt

SELECT Agent.Voornaam & ' ' & Agent.Achternaam AS Agentnaam, DateSerial(Year(Date()),Month([Geboortedatum]),Day([Geboortedatum])) AS Verjaardag, Year(Now())-Year([Geboortedatum]) AS Leeftijd
FROM Agent
WHERE (((DateSerial(Year(Date()),Month([Geboortedatum]),Day([Geboortedatum]))) Between Date() And Date()+7) AND ((Agent.[Uit dienst]) Is Null) AND ((Agent.AgentID)>10))
ORDER BY DateSerial(Year(Date()),Month([Geboortedatum]),Day([Geboortedatum]));

Ik ben er al achter dat de foutmelding verdwijnt als ik het criterium verwijder Between Date() And Date()+7), maar daar gaat het nou juist om.

Kan iemand mij vertellen wat er hierin fout gaat?

Alvast bedankt
 
De reden dat je dit soort problemen kan krijgen, zeker als alles altijd gewerkt heeft, ligt vaak in een upgrade van het een of ander, zoals een nieuwe Office versie of Windows versie. Dat kun je checken door de bibliotheken te controleren en te kijken of daar foutmeldingen staan. Als je daar toch zit (VBA venster) kun je gelijk de db compileren om te kijken of er nog andere problemen zijn. Als alle in orde is, ligt het ergens anders.

In dat geval zou je de BETWEEN eens zo kunnen proberen:
Code:
Between DateAdd("d";-7;Date()) And DateAdd("d";7;Date())
Ik heb met opzet de begindatum niet op Date() gehouden, om te laten zien dat je met DateAdd ook negatieve waarden kunt berekenen. Dus ter lering ende vermaeck.

Verder klopt je leeftijdberekening niet helemaal, omdat die geen rekening houdt met de huidige datum. Mensen zijn dus, ongeacht hun geboortedatum van een bepaalde leeftijd, en dat klopt natuurlijk niet. Beter is deze variant:
Code:
DateDiff("yyyy";[Geboortedatum];Date())+(Date()<DateSerial(Year(Date());Month([Geboortedatum]);Day([Geboortedatum]))) AS Leeftijd
Deze trekt een jaar van de geboortedatum af als de uitkomst False is. En levert daarmee dus een correcte leeftijd, want bij True is de uitkomst 0.
 
Dank je wel Octafish

Ik wilde net melden dat ik het probleem al had gevonden, sommige mensen in de lijst hadden nog geen geboortedatum ingevuld, waardoor de query dus over zijn nek ging.
Bij iedereen heb ik een fictieve datum ingevuld en dit loste het probleem al op.

Ik ga mijn leeftijd berekenining zeker aanpassen naar hoe jij de code hebt opgegeven, dus dank voor je geweldige inzicht en advies.
 
Gebruik eventueel ook een check op lege datumvelden; dan voorkom je het probleem ook. Dus iets als: IIF([Geboortedatum] Is Null;0;[Geboortedatum]) is al genoeg.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan