Query op datums

Status
Niet open voor verdere reacties.

rvdsch

Gebruiker
Lid geworden
18 jun 2009
Berichten
170
Beste forummers,

Ik ben bezig een query te bouwen. Hij is helemaal af op 1 punt na. Ik heb een formulier en daarin moet de gebruiker een begin datum en een einddatum opgeven. Ik wil dus dat vervolgens mijn query loopt startend aan de begindatum tot en met de einddatum. Hoe kan ik dit bouwen?
 
Als je de query vanaf een formulier start, zou ik 2 tekstvakken maken voor de begin- en einddatum, en aan de query een WHERE toevoegen met daarin de datumstring. Daarbij moet je wel een conversie doen op het datumveld, omdat Access anders de datum naar amerikaans voorbeeld vertaalt, zodat je dan 7-5 en 5-7 bijvoorbeeld verwisseld kan krijgen. En dat is uiteraard niet de bedoeling...

Ik zal een voorbeeldje maken en straks neerzetten.

Michel
 
Hopelijk is de spanning niet te groot geworden....

Hier het voorbeeld. Op het formuleir frmDatumselectie zitten wat trucen, waarmee je op verschillende manieren een datum kunt kiezen.

Met de knop <Query maken> wordt een tijdelijke query gemaakt met de datumselectie.

Kijk maar eens achter de knop en keuzelijsten hoe e.e.a. werkt. Ik heb geprobeerd zoveel mogelijk in de code uit te leggen. Heb je nog vragen? je weet nu de weg...

Michel
 

Bijlagen

  • DatumCheck.rar
    60,7 KB · Weergaven: 39
Bedankt Michel,

De datumzoeker was erg mooi, ik kon alleen je query niet aan de praat krijgen:(. Ik heb inmiddels ook iets gemaakt met een knop OpenQuery, dit loopt goed. Het probleem wat ik eigenlijk nog heb is dat mijn query in de queryview wordt geopend. Ik wil dus graag dat mijn Query in hetzelfde formulier blijft. In mijn formulier is daar ook ruimte voor, de tekstvakken voor de query staan erin. Ik heb de code van jouw query bekeken maar kon daar niet goed uit wijs worden:eek: en omdat ik hem niet werkend kreeg heb ik het resultaat ook niet gezien...
De code die ik heb is
Code:
Private Sub Knop30_Click()
On Error GoTo Err_Knop30_Click

    Dim stDocName As String

    stDocName = "VoorraadQueryRoermond"
    DoCmd.OpenQuery stDocName, acNormal, acEdit

Exit_Knop30_Click:
    Exit Sub

Err_Knop30_Click:
    MsgBox Err.Description
    Resume Exit_Knop30_Click
    
End Sub
Wat moet ik toevoegen om ervoor te zorgen dat de query gewoon in het formulier komt??
 
Eerst maar eens kijken waarom je de query op mijn formulier niet aan de praat krijgt: Als je de code van het formulier bekijkt, dan zie je helemaal bovenin de variabelen gedeclareerd staan. Hierbij wordt voor de db en rs variabelen een ADO recordset aangemaakt. Soms werkt dat niet, omdat bijvoorbeeld de ADO bibliotheek niet is geladen, of, wat erger is, er is ook een DAO bibliotheek actief, die vóór de ADO bibliotheek wordt ingeladen.
Je kunt dat controleren door in het VBA scherm naar <Extra>, <Verwijzingen> te gaan. Daar zou je op zijn minst een verwijzing moeten zien naar <Active Data Objects Library 2.1>, maar dat mag ook een hoger nummer zijn. Als je ook een verwijzing actief hebt naar <Microsoft DAO 3.6>, en deze staat boven de ADO verwijzing, dan moet je die naar beneden verplaatsen met de pijltjesknoppen rechts. Daarna zou het toch moeten werken.
Alternatief is, om de db variabele en rs variabele op de volgende manier te declareren:

Dim db , qTemp As QueryDef, rs , strSQL As String

Daarmee laat je het Access zelf uitzoeken.

Het kan overigens een simpeler probleem zijn: het checkboxje bij de vraag <Zijn de datums gecontroleerd?> activeert de knop <Query maken> . Dus die moet je op zijn minst een keer aanklikken...

Terug naar je vraag: Ik begrijp hem vrees ik niet helemaal.... Je hebt de tekstvakken voor de query op je formulier, schrijf je. Betekent dat, dat je de query als gegevensbron voor het formulier gebruikt? Anders gezegd: heb je het formulier gebaseerd op de query?
En wil je, als de query is aangepast, de geselecteerde records op het formulier zien?
In dat geval zou je de RecordSource van het formulier opnieuw moeten laten draaien op de achtergrond. Momenteel open je met de knop een query, en die wordt uiteraard in gegevensweergave getoond.
Als de query als bron onder het formulier ligt, en je hebt de datumselectie aan de query toegevoegd, dan zou het commando er zo uit kunnen zien:

Code:
strTabel = Me.RecordSource
strSQL = "Select * From " & strTabel & vbCrLf
strSQL = strSQL & "Where " & strDatumFilter
Me.RecordSource = strSQL
Me.Requery

Hierbij is de waarde in strTabel dan: "VoorraadQueryRoermond"
en de filtering in strDatumFilter de datumselectie die je hebt gemaakt.
in de vierde regel wordt de complete SQL als bron voor het formulier gebruikt,
en de vijfde regel zorgt ervoor dat de records getoond worden.

Kom je er niet uit, geef dan een voorbeeldje mee, dat kijkt toch wat makkelijker...

Michel
 
Hoi,

Sorry dat ik binnenval op deze vraag maar ik zit met een probleem wat in dezelfde richting ligt. Leek me een beetje onzin om een nieuw topic te openen.

Ik heb een database met gegevens. Hier wil ik een query op draaien die bepaalde informatie weergeeft. De informatie die ik wil zien kan ik op een formulier aanklikken en dan draait de query. Dit werkt op zich allemaal prima alleen nu probeer ik ook iets met de datum te doen (in dezelfde query) en dan werkt de bekende weg ineens niet meer.

Mijn expressie voor de query is als volgt:

IIf(IsNull([Forms]![Formulier1]![Beginjaar]);[Masterdata]![StartingDate];Year([StartingDate])=[Forms]![Formulier1]![Beginjaar])

Als ik deze expressie gebruik voor een andere variabelen in het formulier werkt die wel. Ik gebruik dan echter geen Year() (In de Masterdata staan precieze datums, maar daar heb ik geen intresse in. Alleen het jaar is van belang.) of iets dergelijks dus dacht dat het misschien daar aan lag. Maar als ik alleen het laatste stuk pak "Year([StartingDate])=[Forms]![Formulier1]![Beginjaar]" dan werkt die wel. Voor mijn database is het echter ook van belang dat er ook de mogelijkheid is om geen beginjaar aan te klikken. Maar dat kan op deze manier dus niet.

Kan iemand mij hiermee helpen? Bij voorbaat dank.

Ejot
 
Het probleem zit hem in het laatste deel van je IIF:

Year([StartingDate])=[Forms]![Formulier1]![Beginjaar]

Dit is een rekenkundige vergelijking waar True of False de uitkomst van is. Je vraagt hier dus geen jaartal mee op, maar True of False. En dat wil je uiteraard niet. je zou het kunnen vervangen door een DLookup, ongeveer zoals dit:

DLookUp("[StartingDate]";"[Masterdata]";"[StartingDate];Year([StartingDate])=" & [Forms]![Formulier1]![Beginjaar])

Je krijgt dan:

IIf(IsNull([Forms]![Formulier1]![Beginjaar]);[Masterdata]![StartingDate];DLookUp("[StartingDate]";"[Masterdata]";"[StartingDate];Year([StartingDate])=" & [Forms]![Formulier1]![Beginjaar]))

Het kan zijn, dat het laatste deel van de DLookup ook binnen de quootjes moet staan, ik gebruik die functie eigenlijk nooit. Maar zoiets moet het wel zijn.

Michel
 
Hey Michel,

Ik heb een formulier gemaakt om daarin de query weer te geven. De bron van het formulier is dus de query. Ik vind het dus vervelend dat de query nu in gegevensbladweergave wordt weer gegeven. Ik ga met jouw oplossing aan de slag, ik laat je weten of het geluk is:)
 
Ik kom er niet uit:mad:

Ik heb de code gecopypaste Michel maar het lukt niet. Moet ik nou nog steeds de variablelen declareren. En wat moet ik dan doen. Ik post de code die zou moeten lopen als de knop wordt ingedrukt.
Code:
Dim strTabel As String
strTabel = VoorraadQueryRoermond
strTabel = Me.RecordSource
strSQL = "Select * From " & strTabel & vbCrLf
strSQL = strSQL & "Where " & strDatumFilter
Me.RecordSource = strSQL
Me.Requery

Dit is de SQL van de query VoorraadQueryRoermond, ik heb deze getest en het loopt, het enige probleem is dus dat de query wordt weergegeven in gegevensbladweergave...
Code:
SELECT DISTINCTROW AlleOrders.Leverancier, AlleOrders.Product, AlleOrders.Hoeveelheid, AlleOrders.Datum
FROM AlleOrders
WHERE (((AlleOrders.Bedrijfsonderdeel)<>"BCNW") AND ((AlleOrders.Doorgeleverd)<>True))
GROUP BY AlleOrders.Leverancier, AlleOrders.Product, AlleOrders.Hoeveelheid, AlleOrders.Datum
HAVING (((AlleOrders.Datum) Between [forms]![VoorraadQueryRoermond].[Begindatum] And [forms]![VoorraadQueryRoermond].[Einddatum]));
 
Nog wat extra info nodig, vrees ik....
De query loopt, zeg je. Ik neem aan dat je daarmee bedoelt, dat de query de juiste records geeft, als je hem zelfstandig draait? Of bedoel je ermee dat je de records kunt bekijken op het formulier?
En hoe heb je de formulierweergave geregeld? Want je kunt dus bij deformuliereigenschappen aangeven dat je de records in Gegevensblad wilt zien, en dan doet-ie dat uiteraard ook... Misschien moet die instelling worden aangepast? (Zou wel een hele simpele oplossing zijn....)
Volgend puntje: als je de quey als bron voor het formulier gebruikt, zal de datumfilteringscode die ik heb gepost niet werken, omdat je al een datumfiltering in de query hebt zitten, en je dan een dubbele select zou doen.

strTabel = VoorraadQueryRoermond
strTabel = Me.RecordSource

Met deze declaraties stel je twee keer de variabele strTabel in; de eerste keer pakt-ie zowiezo niet, omdat het commando fout is:
Moet zijn: strTabel = "VoorraadQueryRoermond"
Maar deze regel wordt dus overschreven door de volgende: strTabel = Me.RecordSource.
En nu komt het dus: als je de "SELECT ...." statement gebruikt als bron, dan kan de nieuwe querystring die je gebruikt nooit goed werken. Want daar zet je dus ook SELECT voor. Je kunt dat uittesten door onder de Me.RecordSource regel een messagebox te zeten: MsgBox strtabel bijvoorbeeld.
Dan zie je gauw genoeg wat hij als bron gebruikt. Je gebruikt verder dus ook twee datumfilteringen; de eerste zit in je bronquery, en de tweede zou je ophalen met de strDatumFilter. Ik ga er vanuit, dat je dezelfde datumvelden op het formulier gebruikt, dus dat zal weinig winst opleveren.... Ik zou, op basis van snelheid, de bronquery gebruiken zonder datumfilter, en de filtering dus aansturen vanuit de knop op het formulier, zoals mijn voorbeeld.

Michel
 
Hey Michel,

Dankjewel voor al je hulp. Ik heb het formulier aan de praat gekregen.:thumb:
Dit is de code die ik heb gebruikt.
Code:
Dim strTabel As String
strTabel = "VoorraadQueryRoermond"
strSQL = "Select * From " & strTabel & vbCrLf
Me.RecordSource = strSQL
Me.Requery

Ik moet eerlijk bekennen dat ik regel 3 en 4 helemaal niet snap, wat gebeurt daar eigenlijk?

Er zit nog 1 probleem in mijn querie(dit staat los van het formulier). Ik heb records die eigenlijk helemaal overeenkomen (dwz zelfde datum, leverancier, product en hoeveelheid). Aangezien ik bij de querie bij alle velden in de totalen 'Group By' heb gezet komen deze dus niet apart te staan. Heb je nog een tip om dat op te lossen? Zou ik bijvoorbeeld bij Hoeveelheid ipv Group By Som kunnen zetten? Of kan ik beter iets met de datums doen, aangezien die toch al geselecteerd worden? Zou ik bijvoorbeeld ipv Group By dat blanco kunnen laten? Inmiddels opgelost, ik querie ook gewoon op de orderID maar laat het resultaat niet zien
 
Laatst bewerkt:
Hey Michel,

Ik kwam er niet helemaal maar heb ondertussen al een andere oplossing bedacht. Namelijk gewoon een extra kolom aangemaakt in de query die alleen het jaar geeft van de ingangsdatum en deze gebruikt in het formulier.

toch bedankt.

ejot
 
Hey Michel,

Ik kwam er niet helemaal maar heb ondertussen al een andere oplossing bedacht. Namelijk gewoon een extra kolom aangemaakt in de query die alleen het jaar geeft van de ingangsdatum en deze gebruikt in het formulier.

toch bedankt.

ejot

Ik dacht dat alles nu goed werkten. Helaas, nog niet helemaal. In de data is in veel gevallen geen einddatum ingevuld, dit omdat ze in principe oneindig zijn (tot opzegging). Nu werkt mijn query nog niet helemaal omdat die alle lege cellen weglaat als ik hem nu draai. Hieronder een voorbeeld.

IIf(IsNull([Forms]![Formulier1]![Eindjaar]); [Data]![Eindjaar];[Forms]![Formulier1]![Eindjaar ]). Als ik nu op het formulier als eindjaar 2009 pak dan werkt die prima. Maar als ik nu andere variabelen wel aanklik maar er geen eindjaar bij kies dan pakt die alle records die voldoen aan de overige variabelen en waar er een eindjaar is ingevuld. Dus alle records zonder einddatum worden weggelaten.

Weet iemand hiervoor een oplossing?

ejot
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan