Criteria leeftijd geeft foutmelding in query

Status
Niet open voor verdere reacties.

JKU12

Nieuwe gebruiker
Lid geworden
9 okt 2021
Berichten
4
Beste forummers,

ik heb een tabel met gegevens van leden. Eén van de velden is de geboortedatum van de leden.
In een query heb ik een veld 'Leeftijd' aangemaakt: DateDiff("yyyy";[Geboortedatum];Date())+(DateSerial(Year(Date());Month([Geboortedatum]);Day([Geboortedatum]))>Date())
Tot zover werkt het prima.
Nu wil ik graag in dit veld een criteria invullen om bijvoorbeeld alle leden van 65 jaar te kunnen filteren.
Access geeft echter de melding 'Gegevenstypen komen niet overeen in criteriumexpressie'.

Het veld 'Geboortedatum' in de tabel leden heeft het gegevenstype 'Datum/tijd'.

Heeft iemand een idee wat ik in het veld 'Leeftijd' aan moet passen om een criteria in te kunnen vullen? Blijkbaar ziet Access het veld leeftijd als een gegevenstype 'Datum/tijd', maar wanneer ik de notatie aanpas naar Standaardgetalnotatie, blijft de foutmelding bestaan.

Alvast bedankt.
 
Waarom denk je dat Access denkt dat het veld Leeftijd een datumveld is? In dat geval zou er niets aan de hand zijn, want datums zijn gewoon getallen, opgemaakt als een datum. Het probleem is denk ik eerder dat je ofwel het criterium verkeerd gebruikt, ofwel dat de output Tekst is. In dat laatste geval moet je er eerst een. Getal van maken. Aangezien je het gebruikte criterium er niet bij hebt gezet, kan ik er nog niet veel meer van zeggen.

Het veld Geboortedatum heeft er overigens niets mee te maken.
 
de functie datediff geeft een getal terug type Long.
 
Wat de functie teruggeeft boeit niet, zolang we niet weten hoe TS het criterium heeft opgezet :). Dát bepaalt namelijk het juiste antwoord.
 
Het veld Leeftijd wordt berekend met de functie datediff, die een long als resultaat geeft, dus het criterium moet een long zijn.
 
Dat weet ik, en het zou mij niets verbazen als TS dat óók weet. Zolang we niet weten welk criterium gebruikt wordt, zijn we geen steek verder. Gewoon een keer afwachten met antwoorden tot TS dus een keer reageert :).
 
Bedankt voor de reacties. Het criteria is een bepaalde leeftijd, bijvoorbeeld 65.
Deze leeftijd voer ik in in de ontwerpweergaven van de query, zie 1 van de bijlagen.
Zoals aangegeven berekent Access de leeftijd van de leden wel (zie 1 van de bijlagen), maar wanneer ik wil filteren op een bepaalde leeftijd, komt de foutmelding over de criteriumexpressie.
 

Bijlagen

  • printscreen1.png
    printscreen1.png
    6,2 KB · Weergaven: 29
  • printscreen2.png
    printscreen2.png
    1,9 KB · Weergaven: 22
Als ik naar de screen print kijk zie ik '65' als criterium en niet 65. Een getal mag niet tussen aanhalingstekens staan.
 
Je moet hier 65 invoeren, en niet '65'. Zoals al een aantal keren is gezegd, heb je te maken met getallen en niet met tekst. Alleen tekst zet je tussen (enkele of dubbele) quootjes.
 
EN het criterium van pletter filtert alle mensen die 65 of ouder zijn. Wil je dat niet, dan volstaat dus alleen het getal. En kun je ook met een teken minder af: >64 doet hetzelfde.
 
Het probleem is inmiddels opgelost.
Er stonden 2 leden zonder geboortedatum in de tabel. Deze zijn namelijk onbekend.
In de query wordt het veld 'Geboortedatum' leeg gelaten.
Het veld 'Leeftijd' geeft bij deze 2 leden een foutmelding: #Fout
Filteren op een veld waarin een foutmelding staat, lukte daarom niet.

Je moet hier 65 invoeren, en niet '65'. Zoals al een aantal keren is gezegd, heb je te maken met getallen en niet met tekst. Alleen tekst zet je tussen (enkele of dubbele) quootjes.

Net even getest: dit maakt niet uit. 65 en '65' worden beide geaccepteerd.

Iedereen bedankt voor het meedenken.

Aanvulling: deze 2 leden maken me het nu wel lastig: ik moet bij beiden wel een datum invullen om een werkende query te krijgen. M.a.w.: wat doe ik met leden waarvan de geboortedatum onbekend is?
 
Laatst bewerkt:
Dan heb je mazzel dat Access met je meedenkt :). Ik zou op die aannames geen database bouwen, want deze werkwijze gaat je geheid een keer in de voet bijten. Dat je denkt: waarom doet-ie het niet? Gebruik altijd de juiste syntax bij de juiste gegevens, dan kan het nooit fout gaan.
 
Er zijn verschillende mogelijkheden: je kan in je functie de NZ functie inbouwen en die leden dan als geboortedatum de fictieve datum 1-1-1900 geven: NZ([Geboortedatum],#1-1-1900#), of de datum van vandaag zodat ze als uitkomst 0 jaar zijn..
Properder misschien: in je query een bijkomend criterium voor geboortedatum: is not null. Het hangt af van de logica die je zelf wil toepassen.
 
JKU12


Code:
IIf([Geboortedatum] Is Not Null;DateDiff("yyyy";[Geboortedatum];Date())+(DateSerial(Year(Date());Month([Geboortedatum]);Day([Geboortedatum]))>Date());0)

Gr. Cor
 
JKU12


Code:
IIf([Geboortedatum] Is Not Null;DateDiff("yyyy";[Geboortedatum];Date())+(DateSerial(Year(Date());Month([Geboortedatum]);Day([Geboortedatum]))>Date());0)

Gr. Cor


Bedankt Cor. De leden zonder geboortedatum krijgen nu de leeftijd 0, maar die zijn er eenvoudig uit te filteren door 'Is Not Null' als criteria bij de geboortedatum in te geven.
I.p.v. 0 uit jouw code is het ook nog mogelijk om " " in te geven, dan krijg je een lege cel als resultaat.
 
Laatst bewerkt:
En dan blijf je dus weer tekst (“ ”) en getallen en tekst door elkaar husselen. Doe dat nou niet :), je bent met een database bezig; een programma om gestructureerd met data om te gaan. Dus: een getalveld bevat alleen getallen, een alfanumeriek veld (waar je dus niet mee rekent) kan tekst en/of getallen bevatten. Denk aan telefoonnummers etc.
 
Nooit gedacht dat ik dit zou zeggen :D, maar hier ben ik het eens met Octafish. Als je een tekstcriterium gebruikt voor een getal dan vertrouw je erop dat Microsoft dir impliciet van tekst naar nummer gaat omzetten. Hierdoor:
* vertraag je de query: niet alleen kan er geen enkele index gebruikt worden, maar de engine moet 2 berekeningen met elkaar vergelijken
* als de expressie wat ingewikkelder wordt dan krijg je alsnog een foutmelding
Maar, zoals mijn dochter ooit zei: waarom gemakkelijk doen als het ook moeilijk kan. :rolleyes:
 
JKU12,

Een kleine proef om te laten zien dat het criterium in dit geval een getal moet zijn.

Vul maar eens bij het criterium in '60 + 5'

U zal zien dat access hier een foutmelding op geeft.

Gr. Cor
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan