Gegevenstypen komen niet overeen in criteriumexpressie

Status
Niet open voor verdere reacties.

Ruudh59

Gebruiker
Lid geworden
30 nov 2013
Berichten
56
Ik zie deze vraag vaker staan, maar ik heb nog niet het antwoord gezien op mijn versie van dit probleem.

Ik heb een formulier waarop ik een periode invul d.m.v. de velden 'Datum_van' en 'Datum_tot'.
Deze velden gebruik in in de query van het subformulier om records te selecteren.
De Datum is in de database opgeslagen met een Korte datumnotatie en de velden op het formulier hebben die ook.

De eerste poging:
Code:
WHERE (((Datum) Between [Forms]![Formulier1]![Datum_van] And [Forms]![Formulier1]![Datum_tot] ))
Hierop krijg ik de foutmelding: geen geldige veldnaam of expressie.

Dus:
Code:
WHERE (((Datum) Between ' & [Forms]![Formulier1]![Datum_van] & ' And ' & [Forms]![Formulier1]![Datum_tot] & '))
Hierop krijg ik de foutmelding: Gegevenstypen komen niet overeen in criteriumexpressie.

Blijkbaar is voor datums nog iets extra's nodig voor de juiste vertaling, maar wat?

Verschillende mogelijkheden geprobeerd:

hekje #:


Code:
WHERE (((Datum) Between ' & #[Forms]![Formulier1]![Datum_van]# & ' And ' & #[Forms]![Formulier1]![Datum_tot]# & '))

CDate:

Code:
WHERE (((Datum) Between CDate(' & [Forms]![Formulier1]![Datum_van] & ') And CDate(' & [Forms]![Formulier1]![Datum_tot] & ')))

Double:

Code:
WHERE (((Datum) Between ' & CDbl([Forms]![Formulier1]![Datum_van]) & ' And ' & CDbl([Forms]![Formulier1]![Datum_tot]) & '))

Cdate EN Double:

Code:
WHERE (((Datum) Between CDate(' & CDbl([Forms]![Formulier1]![Datum_van]) & ') And CDate(' & CDbl([Forms]![Formulier1]![Datum_tot]) & ')))
Allemaal leveren ze hetzelfde op, foutmelding: Gegevenstypen komen niet overeen in criteriumexpressie.

Ik weet eigenlijk niet meer waar ik mee bezig ben. Het is gewoon op basis van Trial and Error.
Kan iemand mij de juiste syntax leveren en een verklaring?
 
Laatst bewerkt door een moderator:
In alle varianten die je hebt geprobeerd zit dezelfde fout, en dan kun je natuurlijk nog lang doorgaan :).
Code:
WHERE ([Datum] Between [Forms]![Formulier1]![Datum_van] And [Forms]![Formulier1]![Datum_tot])
Zou zeker moeten werken. Verder experimenteer je overal met quootjes (') maar die zijn bedoeld voor tekstfilters, niet voor datumfilters. Daarvoor gebruik je het hekje (#). Gek genoeg probeer je die wel, maar dan consequent in combinatie met een tekstfilter, wat uiteraard niet kan: een veld is ofwel tekst, ofwel numeriek of een datum. Dus dan zou het zo moeten:
Code:
WHERE ([Datum] Between #1-10-2013# And #1-1-2014#)
Maar omdat je met formuliervelden werkt, kan de eerste variant dus al prima. Zelf omzeil ik het probleem van de Amerikaanse datumnotatie het liefst door de datum om te zetten naar een getal, en op basis daarvan te filteren.
 
Bedankt. Dit maakt al weer veel duidelijk over welke fouten ik maak.

Jouw oplossing was echter ook mijn eerste oplossing en daarbij kreeg ik de fout 'geen geldige veldnaam of expressie'.
Zou dat slaan op '(datum)' i.p.v. '[datum]', want dat is het enige verschil?
'(datum)' is overigens zelf in de SQL ingevuld door Access en niet door mij.
Ik zal het vanavond is proberen.

Ik gebruik zelf liever ook het filter, maar dat kon in dit geval niet omdat het een draaitabel-query is en ik kreeg een foutmelding bij het gebruik van een filter bij dat type query.
 
Zoals ik al zei: je maakt een fout (syntax namelijk) doordat je de veldnaam niet goed initieert. Dat moet toch echt met rechte haken, zoals in mijn voorbeeld.
Jouw oplossing was echter ook mijn eerste oplossing...
Niet dus :)
 
Het ligt toch niet aan de syntax van het veld datum.
Bij de voorgestelde oplossing krijg ik weer dezelfde foutmelding als ik de eerste keer kreeg.
Om precies te zijn:
"De Microsoft Access-database-engine kan [Forms]![Formulier1]![Datum_van] niet herkennen als geldige veldnaam of expressie."
Er wordt dus ook specifiek naar het Datum-veld verwezen.
Ik moet blijkbaar toch iets met het datum-veld doen voordat de access-motor het begrijpt.
 
Ik heb het zelf opgelost.
Het probleem zit 'm in de kruistabelquery.
Deze is blijkbaar kritischer bij het herkennen van de veldnamen.
Je moet eerst de velden in de query als parameters vastleggen.
De kruistabel query vond daarna de selectie toch te complex (bijna letterlijke melding).

Uiteindelijk heb ik eerst een selectiequery gemaakt waarmee de selectie op de periode werd uitgevoerd.
In deze selectiequery kon ik gewoon gebruik maken van [Forms]![Formulier1]![Datum_van] en [Forms]![Formulier1]![Datum_tot].
Wel als parameters van het soort datum/tijd definiëren, omdat ik deze query als input ga gebruiken voor de kruistabelquery.

De selectiequery heb ik vervolgens dus als input gebruikt voor de kruistabelquery in het subformulier.
Daar kwam nog een probleem om het hoekje.
In de kruistabelquery zijn de waarden van de kolomkoppen variabel.
Alle mogelijke waarden moest ik eerst als kolomkopteksten (eigenschap kruistabelquery) opgeven, gescheiden door een puntkomma.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan