Opgelost Filteren op datum/tijd veld

Dit topic is als opgelost gemarkeerd
Status
Niet open voor verdere reacties.

jbusser

Gebruiker
Lid geworden
23 feb 2007
Berichten
182
Het antwoord zal wel weer heel simpel zijn:
Waarom werkt dit niet?

In formulier "frm_Dozen_ontvangen" heb ik een veld: "Creation_date" (datum/tijd)
Veld heeft standaardwaarde Date() en wordt dus gevuld met 9-12-2024
nu wil ik een formulier openen met alleen de records die vandaag zijn aangemaakt:

stDocname = "frm_Dozen_ontvangen"
stLinkcriteria = "Creation_date = " & Date
DoCmd.OpenForm stDocname, , , stLinkcriteria
' de waarde van stLinkcriteria is nu Creation_date = 9-12-2024 (is dus het filter)

het is vandaag 9-12-2024 en er zijn 15 records met waarde 9-12-2024 maar ik krijg een leeg formulier.
 
Ik vermoed dat je in de 'val' van de Amerikaans-Europese notatie bent gevallen. Jij geeft een europese datum in, VBA leest dat als Amerikaans. Dus niet 9 december, maar 12 september. Andere datum, andere getallen :). Probeer hem eens zo:
Code:
stLinkcriteria = "Creation_date = CDate(" & CDbl(Date) & ")"
 
Dit werkt inderdaad, super bedankt!
Kun je me misschien verwijzen naar een uitleg hoe dit VBA-technisch precies zit?
Ik ben blij dat dit werkt maar heb vaker ge-emmer met datum/tijd en wil het graag zelf op kunnen lossen in de toekomst.
 
Er is niet echt een uitleg, anders dan die ik je gegeven heb. Een Nederlandse datlum is nu eenmaal dag-maand en een Amerikaanse maand-dag. Je voert in een tekstvak in essentie ook geen datum in, maar tekens die een datum representeren. Dus de 'datum' "11-9" bestaat uit 4 tekens, beginnend met een 1 en eindigend met een 9. VBA, wat alles interpreteert als Amerikaans, 'ziet' dus de maand 11, en de dag 9. Terwijl jij het dus andersom bedoelt.

Gek genoeg is de taal slim genoeg om te snappen dat de datum "24-8" niet maand 24 is, want die bestaat niet. Omdat 24-8 omgedraaid 8-24 een geldige datum oplevert, wordt de datum dan goed geïnterpreteerd. Geen enkele programmeertaal is natuurlijk in staat om het verschil te zien tussen 9-11 en 11-9. Of je moet kijken naar landinstellingen, en dus extra informatie mee kunnen geven. Iets als: "elke datum heeft de Nederlandse datumnotatie".

Dus wat is mijn oplossing? Eigenlijk heel simpel: elke dag, ongeacht de notatie (daarom heet het ook notatie) heeft dezelfde getalswaarde. Te beginnen vanaf 1-1-1900 (zelfs 0-1-1900 mag nog). Dus dag 100 is hetzelfde in Amerika of Nederland, het getal 10.000 ook, en uiteraard 42.450 ook.
Dus wat doe ik? Ik vertaal, voordat ik de query draai, de datum eerst naar een getal met de functie CDbl. En vervolgens gebruik ik in de query de functie CDate. In de query is dus het getal bepalend voor de datum, en niet meer de opmaak (en de interpretatie daarvan).
Als je de huidige formule dus vaker gebruikt, dan is de algemene syntax deze:

Code:
stLinkcriteria = "[|Tabelveld] = CDate(" CDbl([Datumveld formulier] of functie Date())  ")"
Hopelijk genoeg uitleg zo?
 
Laatst bewerkt:
Geweldig! Helemaal duidelijk.
Ga er eens lekker mee experimenteren/oefenen!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan