formulier met datumkeuzelijst en zoekknop

Status
Niet open voor verdere reacties.

StudentDennis

Gebruiker
Lid geworden
13 nov 2013
Berichten
34
Beste mensen,

Even een aantal vragen ter oriëntatie, voordat ik een verkeerde weg insla, waar ik de antwoorden niet op google, youtube of het forum kan vinden (dat kan aan mijn zoektermen liggen natuurlijk).

De vraag: Wat is de simpelste aanpak om een formulier te maken, waarop je 2 data (meervoud datum) kunt invoeren (bijvoorbeeld met een keuzelijst of kalender), met een zoekknop en dat er dan bij het drukken op de zoekknop een bepaalde uitkomst van een query op het scherm komt, met de records tussen die 2 data (meervoud datum)?

Dus bijvoorbeeld een standaard query, zoals:

SELECT * FROM tomtom WHERE start_time BETWEEN #06-01-2013# AND #06-07-2013#;

, maar dan in (een) formulier(en).

Wat is een goed startpunt en aanpak? Heeft iemand hier een goede handleiding of advies voor?

Het liefst ontwijk ik VBA, omdat ik er nog niet mee bekend ben. Al ben ik bang dat ik dit er wel voor nodig heb, of anders in de toekomst wel. Vooral hoe je er mee start en hoe het zich verhoudt met de databases begrijp ik niet. Scripten zou ik wel kunnen leren denk ik, omdat ik ook al een aardige basis kennis in Qbasic en PHP heb.

Ik heb een formulier gemaakt met 3 keuzelijsten: dagnummer, maand en jaar. Verder heb ik een knop geplaatst maar hoe ik verder moet weet ik niet.

MvG,

Dennis
 
Laatst bewerkt:
Meervoud van datum is dacht ik datums in deze context :).
Je kunt in je query i.p.v. de datums typen zoals in je queryvoorbeeld ook verwijzen naar de datumvelden op je formulier. Gebruik daarvoor de knop <Functie plakken>, zodat je geen typefout maakt. Bovendien is het sneller :)
Ga je het programmeren in VBA dan krijg je conversieproblemen, omdat VBA met amerikaanse datumnotatie werkt, en die moet je dus omzetten. Dus daar zit een extra vertaalslag bij.
 
Bedankt voor de snelle reactie!

Ja, je hebt gelijk datums had ook gemogen en was duidelijker geweest: ( http://taaladvies.net/taal/advies/vraag/190/ )

De knop "Functie plakken" kan ik helaas niet vinden. Handmatig heb ik de volgende query gemaakt (voorlopig even met 1 datum om te oefenen) genaamd qryUserShowAll:

SELECT * FROM tomtom WHERE start_time = Forms!TEST_DATE_FORM!Keuzelijst12 (het los uitvoeren van deze query geeft geen errors, maar natuurlijk ook geen resultaten, als hij niet vanaf het formulier wordt aangeroepen. )

In het formulier heb ik Keuzelijst12 gemaakt met (bij wijze van test) de volgende waarden: 06-01-2013, 06-02-2013, 06-03-2013, 06-04-2013, 06-05-2013, 06-06-2013, 06-07-2013. (Dit is dus 1 keuzelijst in plaats van 3, om te testen).

De opmaak van mijn datums ziet er als volgt uit: mm-dd-yyyy hh:nn:ss (volgens mij is dat al Amerikaans, als ik je vorige keer goed begrepen heb)

Ook heb ik een knop genaamd ZoekKnopTest. Bij de eigenschappen hiervan, bij "Bij klikken" heb ik op de knop "..." gedrukt en dan kom ik in VBA. Daar heb ik nu het volgende staan:

Private Sub ZoekKnopTest_Click()
DoCmd.OpenQuery (qryUserShowAll)
End Sub

Echter krijg ik de foutmelding:

Fout 2496 tijdens uitvoering: U moet een querynaam opgeven als argument bij de actie of methode.

Volgens mij heb ik de querynaam opgegeven en opgeslagen, dus ik loop even vast.

Nog een extra duwtje in de rug zou op prijs gesteld worden.




UPDATE:

Ik heb de VBA code aangepast naar:

Private Sub ZoekKnopTest_Click()
DoCmd.OpenQuery "qryUserShowAll"
End Sub

Dit opent wel de query, maar helaas geen resultaten (terwijl die er wel zouden moeten zijn)

Ook als ik de query aanpas naar:

SELECT * FROM tomtom WHERE start_time = Forms!TEST_DATE_FORM!Keuzelijst12.Value; (dus met Value erachter)

wordt de query wel uitgevoerd, maar helaas geen resultaten (terwijl die er wel zouden moeten zijn)


MvG,

Dennis
 
Laatst bewerkt:
De knop heet ook anders. Als je rechtsklikt in het Criteriumveld heet hij <Opbouwen>, en de knop in de knoppenbalk heet <Opbouwfunctie>.
Je probleem is vermoedelijk wel verklaarbaar, dat hangt een beetje van de instelling van je datum/tijd veld af. Ik vermoed dat je die vult met de functie NOW() gezien dat je het format hebt ingesteld op Datum+Tijd. Overigens heeft de notatie weinig te maken met de inhoud van het veld; als in de tabel 12-1-2014 is opgeslagen, dan kun je dat wel als 01-12-2014 laten zien, maar hij rekent toch echt met 12-1-2014. Maar heb je dus zowel Datum als Tijd ingevoerd, dan staat daar eigenlijk iets als '41652,6351'. Je keuzelijst bevat alleen datums, dus in het criterium geef je mee: 41652. En 41652,6351 is niet hetzelfde 41652. Dus vind je niks.
 
Beste OctaFish, bedankt voor je reactie.

Ah, je bedoeld die met dat icoontje van dat toverstafje. Dat ga ik zo nog even onderzoeken.

De data komt uit CSV bestanden die ik via hhtprequest download. Vervolgens importeer ik ze. In de importeerwizard stel ik de datum tijd velden in als: DMY en scheidingsteken - . Als ik de tabel bekijk geeft hij echter mm/dd/yyyy hh:nn:ss weer. Daarmee heb je me vorige week geholpen ( http://www.helpmij.nl/forum/showthread.php/803519-Access-TEXT-data-naar-DATETIME-data ). Hiermee kan gewoon querys uitvoeren zoals:

SELECT * FROM tomtom WHERE start_time BETWEEN #06-01-2013# AND #06-07-2013#;

Daar geef ik ook datums zonder tijd op en krijg ik gewoon resultaten. Ik ging er vanuit dat hij dan gewoon 00:00:00 t/m 23:59:59 neemt. Ik heb hierbij ook gelet op het verschil tussen mm/dd en dd-mm en dat bleek na testen gewoon goed weergegeven te worden (zij het met de Amerikaanse notatie, maar dat maakt me niet zoveel uit. Als het maar werkt).




UPDATE: ik heb ook waarden met tijd geprobeerd in de keuzelijst, maar dan krijg ik nogsteeds geen resultaten.

De Opbouw functie werkt inderdaad goed, ik heb alweer een fout eruit gehaald. [Formulieren]! in plaats van [Forms]!

Inmiddels heb ik ook geprobeerd de #-tekens bij de datums in de keuzelijst te zetten, maar dat gaf ook geen resultaten.

Gr Dennis
 
Laatst bewerkt:
Between doet alles tussen twee datums dus dit:
SELECT * FROM tomtom WHERE start_time BETWEEN #06-01-2013# AND #06-07-2013#
werkt prima, omdat je nu zoekt op datums tussen 06-01-2013 O:00 en 06-07-2013 0:00.

Dit:
SELECT * FROM tomtom WHERE start_time = #06-07-2013#
is filteren op datums die gelijk zijn aan 06-07-2013: 0:00. En daar heb je er vermoedelijk geen een van. Je zou dus moeten filteren met Between, en de volgende dag als tweede dag moeten gebruiken. Dan filter je op #06-07-2013# van 0:00 tot 23:59. Je keuzelijst kortom is hier niet bruikbaar voor. Sowieso is een keuzelijst maken met Datum+Tijd een crime. Zou ik zelf nooit aan beginnen. En als je toch een import bestand moet verwerken, dan zou ik twee velden maken; één voor de datum en één voor de tijd. Ben je van alle ellende af.
 
Laatst bewerkt:
Bedankt voor je reactie,

Dat zou betekenen dat als ik een record zou toevoegen met start_time 06-06-2013 (en de tabel zou opslaan) en in het form zou kiezen voor 6-6-2013 dat hij het record zou moeten weergeven. Echter als ik dit probeer krijg ik nog steeds 0 resultaten.

Ik heb het vermoeden dat ik nog iets anders fout doen. Ik blijf proberen en laat het weten als ik weer verder ben. Als jij nog suggesties hebt hoor ik ze graag.

PS: ik heb het vermoeden dat je je laatste zin niet afgemaakt hebt?

Gr Dennis
 
Laatst bewerkt:
Je zou een hoop tijd kunnen besparen als je een voorbeeldje meestuurt, zodat we zelf ook kunnen kijken.
 
OK, fijn dat je wilt helpen :)

Alle velden met persoonsgegevens heb ik verwijderd. Ik heb ook een voorbeeld geupload van hoe ik de data via httprequest als csv bestand binnen krijg (zonder de csv extentie).

Gr Dennis

Bekijk bijlage extern.zip Bekijk bijlage DB.zip



UPDATE:

Datum en tijd splitsen is gelukt. Je bedoeld splitsen in een query toch? Of bedoelde je aparte kolommen?

Query:
SELECT tomtom.start_time, DateValue([start_time]) AS Datumwaarde, TimeValue([start_time]) AS Tijdwaarde
FROM tomtom;

Ik vraag me nog steeds af wat je in de laatse zin wou zeggen in post #6, daar staat alleen het woord "Daarentegen".


Ik zal proberen om het met deze query aan de praat te krijgen
 
Laatst bewerkt:
Nu niet meer :). Zal wel een briljante gedachte zijn geweest die mij net zo hard weer ontschoten is.
Ik zou het zo oplossen (zie voorbeeldje)
 

Bijlagen

Geweldig! Bedankt.

Als ijverige student probeer ik het meteen na te doen. Echter krijg ik nu 1 resultaat per datum als ik op de knop druk in mijn database. In jouw database werky het wel. Ik mis dus nog een stap denk ik:

Ik zie dat je de query heb aangepast naar:
SELECT tomtom.tripid, tomtom.tripmode, tomtom.start_time, tomtom.start_odometer, tomtom.end_time, tomtom.end_odometer, tomtom.duration, tomtom.idle_time, tomtom.distance, tomtom.avg_speed, tomtom.max_speed, tomtom.fuel_usage, *
FROM tomtom
WHERE (((DateValue([start_time]))=[Formulieren]![TEST_DATE_FORM]![Keuzelijst12]));

In de keuzelijst heb je (heel slim) de losse datums vervangen voor een query die alle unieke datums opzoekt:

SELECT DISTINCT DateSerial(Year([start_time]),Month([start_time]),Day([start_time])) AS Expr1, DateValue([start_time]) AS Expr2
FROM tomtom;

Daarvoor heb je type rijbron veranderd van "lijst met waarden" naar "Tabel/query"




Heb je toevallig ook nog een aanwijzing over hoe ik dit nu ga splitsen in 3 keuzelijsten met dag maand en jaar? Of misschien met zo'n kalendertje?

Als ik te veel van je tijd vraag moet je het zeggen hoor, dan ga ik zelf puzzelen.

In iedergeval hartelijk dank :)
 
Is het mogelijk om DateValue en DateSerial te combineren?

Bijvoorbeeld uit 3 keuzelijsten?

SELECT *
FROM tomtom
WHERE (((DateValue([start_time]))=DateSerial(Year([Formulieren]![TEST_DATE_FORM2]![KeuzelijstJaar])),(Month([Formulieren]![TEST_DATE_FORM2]![KeuzelijstMaand])),(Day([Formulieren]![TEST_DATE_FORM2]![KeuzelijstDag])));

Dit geeft namelijk een error: Syntaxfout In query-expressie




Ik heb het ook geprobeerd in VBA, maar dat snap ik nog niet echt:

Private Sub KnopSearch_Click()
Dim MyDate As String
Dim MyDay As String
Dim MyMonth As String
Dim MyYear As String
Dim CombinedDate As String

MyDay = Formulieren!TEST_DATE_FORM2!KeuzelijstDag.Value
MyMonth = Formulieren!TEST_DATE_FORM2!KeuzelijstMaand.Value
MyYear = Formulieren!TEST_DATE_FORM2!KeuzelijstJaar.Value

CombinedDate = DateSerial(Year(MyYear), Month(MyMonth), Day(MyDay))

MyDate = DateValue(CombinedDate)

End Sub


Dit geeft error: 424 object vereist
 
Laatst bewerkt:
Als je in je keuzelijsten jaren, resp. maanden resp. dagen hebt staan, dan kun je met Dateserial een datum opbouwen met die getallen. Dus zo:
Code:
SELECT *
FROM tomtom
WHERE (DateValue([start_time])=DateSerial([Formulieren]![TEST_DATE_FORM2]![KeuzelijstJaar]),
[Formulieren]![TEST_DATE_FORM2]![KeuzelijstMaand],[Formulieren]![TEST_DATE_FORM2]![KeuzelijstDag])
 
Bedankt voor je reactie,

Als ik deze query uitvoer krijg ik: syntaxfout (komma) in de query-expressie
 
Haakje stond verkeerd.
Code:
SELECT *
FROM tomtom
WHERE (DateValue([start_time])=DateSerial([Formulieren]![TEST_DATE_FORM2]![KeuzelijstJaar],
[Formulieren]![TEST_DATE_FORM2]![KeuzelijstMaand],[Formulieren]![TEST_DATE_FORM2]![KeuzelijstDag]));
Je had er ook zoveel staan :).
 
Bedankt voor de reactie,

Ik krijg weer een andere foutmelding: Deze expressie is niet correct getypt of te complex voor evaluatie.

Maar ja morgen weer een dag, fijne avond!

Bedankt voor alle hulp!
 
Ik heb besloten het mooiere systeem met dag, maand en jaar keuzenlijsten voorlopig even niet uit te voeren, aangezien het best tijdrovend is voor mij. Ik wil eerst een prototype bouwen, met 1 keuzelijst.

Daarom ben ik nu bezig met een formulier waar 2 keuzelijsten instaan, een begindatum en een einddatum. Deze query zou dan toch moeten werken?
SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE (((DateValue([start_time])) BETWEEN (Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33) AND (Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst35)));

Toen ik het op de volgende wijze probeerde werkte het eerste wel en later weer niet:
SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE (((DateValue([start_time])) BETWEEN (Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33) AND #10-12-2013#));

Ook dit werkt niet:
SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE ((DateValue([start_time])) >= (Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33) AND (DateValue([start_time])) <= (Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst35));

Ik begin bijna aan een instabiele Access te denken, ook omdat bij mij als ik een query maak in de ontwerpweergave, Access automatisch ,* aan het select gedeelte toevoegd. Ook als er al andere velden staan. Bij mijn collega's is dat niet, terwijl die de zelfde laptops hebben. Soms krijg ik wel een resultaat maar dan is het er maar 1 terwijl er meer zouden moeten komen.

Doe ik iets fout in mijn eerste query of jullie zien?

Gr Dennis
 
Ik begin bijna aan een instabiele Access te denken, ook omdat bij mij als ik een query maak in de ontwerpweergave, Access automatisch ,* aan het select gedeelte toevoegd.
Dat is een instelling in <Opties> waar je meer last dan plezier van hebt. Die zou ik dus uitzetten als ik jou was.
Filteren op datums blijft altijd lastig, omdat Access dus soms de Amerikaanse notatie pakt. Als je CDATE voor je keuzelijsten zet, gaat het misschien wel.
 
Allereerst weer hartelijk bedankt en sorry dat ik het forum blijf vervuilen met mijn vragen :)

Ik heb het volgende geprobeerd:

CDATE ervoor:

[SQL]SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE ((DateValue([start_time])) >= CDATE(Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33) AND (DateValue([start_time])) <= CDATE(Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst35));[/SQL]

[SQL]SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE (((DateValue([start_time])) BETWEEN CDATE(Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33) AND CDATE(Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst35)));[/SQL]


CDATE met extra haakjes om de formulierdatum:

[SQL]SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE (((DateValue([start_time])) BETWEEN CDATE((Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33)) AND CDATE((Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst35))));[/SQL]

[SQL]SELECT COUNT(tripid) AS [Number Of Trips]
FROM tomtom
WHERE ((DateValue([start_time])) >= CDATE((Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst33)) AND (DateValue([start_time])) <= CDATE((Formulieren!MENU_USER_DEFINED_2_DATES!Keuzelijst35)));[/SQL]

Als ik deze query uitvoer krijg ik de volgende foutmelding:

"Deze expresssie is niet correct getypt of te complex voor evaluatie. Een numerieke expressie kan bijvoorbeeld te veel gecompliceerde elementen bevatten. Probeer de expressie te vereenvoudigen door verschillende delen van de expressie toe te wijzen aan variablen."

Als ik het uitvoer vanaf het formulier krijg ik een Visual Basic error (3071) met de zelfde tekst. Als ik vervolgens op Foutopsporing klik, wordt er aangegeven dat er een fout zit in de middelste regel:

Code:
Private Sub Knop29_Click()
DoCmd.OpenQuery "qryUser2NumberOfTrips"
End Sub

Dit is gecontroleerd op spelling.

In het formulier met 1 datum en dus 1 keuzelijst heb ik dit geprobeerd:

[SQL]SELECT Count(tripid) AS [Number Of Trips]
FROM tomtom
WHERE (((DateValue([start_time]))=CDATE([Formulieren]![MENU_USER_DEFINED_1_DAY]![Keuzelijst22])));[/SQL]

Die query geeft geen foutmelding.

Die vorige query heb ik nog eens opnieuw proberen uit te breiden naar 2 formulieren:

[SQL]SELECT Count(tripid) AS [Number_Of_Trips]
FROM tomtom
WHERE (((DateValue([start_time])) BETWEEN CDATE([Formulieren]![MENU_USER_DEFINED_2_DATES]![Keuzelijst33]) AND CDATE([Formulieren]![MENU_USER_DEFINED_2_DATES]![Keuzelijst35])));[/SQL]

Maar die geeft ook weer dezelfde error.

Ook als je de dubbele haakjes om het geheel heen weghaalt (subquery?) werkt het niet:

[SQL]SELECT Count(tripid) AS [Number_Of_Trips]
FROM tomtom
WHERE ((DateValue([start_time])) BETWEEN CDATE([Formulieren]![MENU_USER_DEFINED_2_DATES]![Keuzelijst33]) AND CDATE([Formulieren]![MENU_USER_DEFINED_2_DATES]![Keuzelijst35]));[/SQL]

Best lastig dus, maar ik geef niet op :)

Zijn er trouwens nog tips of methodes om de haakjes goed te controleren? Zelf gebruik ik Notepad++ (language > SQL). En als je dan op een haakje klikt zie je duidelijk welke openingshaakjes en sluitingshaakjes bij elkaar horen.

Zijn er nog hele andere aanpakken om een formulier met 2 zoekdatums te maken? Dan begin ik desnoods opnieuw op die manier. Misschien zijn er goed tuttorials of video's over dit specifieke onderwerp of iemand weet?

Gr Dennis
 
Laatst bewerkt:
Ik gebruik ook Notepad++ om code te bekijken. Werkt prima. De hoeveelheid haakjes die Microsoft om hun parameters zet is mij eerlijk gezegd ook een raadsel. Ik vermoed dat een inkoper zich bij het inkopen van de haakjes een paar nullen heeft vergist, en dat ze nog steeds bezig zijn om die voorraad op te maken :)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan