kruistabel query met parameter die uit formulier komt: formulering parameter??

Status
Niet open voor verdere reacties.

hoingkatleen

Gebruiker
Lid geworden
1 sep 2014
Berichten
87
Hallo,

Ik heb een eenvoudige database gemaakt met een kruistabelquery. Op basis daarvan wil ik een parameterquery maken die zijn (datum)parameters krijgt vanuit een invulformuliertje. Echter, de verwijzing naar de datumveldjes op het formulier krijg ik maar niet juist. Krijg telkens een error. Wie kan helpen aub? Hieronder een voorbeeld.

Alvast bedankt!

Bekijk bijlage Database11.zip
 
Ja dankjewel, dit werkt alvast voor bvb naam of voornaam.
Hoe formuleer ik dit nu als ik een range wil bepalen tussen 2 data? In het formulier geef je dus begin- en einddatum op.
Wat ook mag is enkel een begindatum invullen en dan bepalen dat je alle gegevens krijgt vanaf die datum. Lukt me evenmin.
 
Laatst bewerkt:
de code geeft 1 gegeven weer. Als je een range wil moet je twee data opgeven met AND bv: groter dan 1-1-2014 AND kleiner dan 1-4-2014
>forms!formuliernaam!data1 AND <forms!formuliernaam!data2

je kan ook OR gebruiken als je bv: iedereen uit amsterdam en rotterdam wilt hebben dan wordt het forms!formuliernaam!plaats1 OR forms!formuliernaam!plaats2 Als je in dit geval AND zou gebruiken dan zou je alleen records zien met de plaats AmsterdamRotterdam omdat AND plakt.
 
Je had het helemaal niet verkeerd gedaan, alleen doet je formulier het niet met het criterium. Overigens ligt dat niet aan jou, want als ik 'm nu maak doet hij het bij mij ook niet. En ik zal de laatste zijn die zegt dat ik niks van Access weet :).
Een datumreeks maak je op de manier zoals jij hem nu ook doet, of met Between. Dus zo:
Code:
Between [Formulieren]![Formulier1]![begindate] And [Formulieren]![Formulier1]![enddate]
Deze code, die bij mij altijd werkt, doet het niet in jouw db. En daar heb ik dus geen verklaring voor...
 
ja ik kan er ook geen touw aan vastknopen.
Het is wel een kruistabel en ik heb al geleerd dat dat soms iets minder vlot werkt met parameters enzo.
Die moeten gedeclareerd worden enzo. Dat heb ik toch juist gedaan?
Met een enkelvoudige parameter krijg ik het wel aan de praat, maar niet met een range...
Afin, en die enkelvoudige parameter ook alleen maar als er niets mee berekend moet worden dus.
 
Laatst bewerkt:
Net hetzelfde formulier gebruikt en de Between-parameter zoals OctaFish hem had neergezet, maar dan met een gewone selectiequery. Dat werkt perfect. Waarom dan niet met die kruistabel?

Wat wel werkt is met een tabelmaakquery die kruistabelquery kopiëren naar een nieuwe tabel en daar dan de parameterquery op uitvoeren via het formulier.
Is this the only way? Of krijgt iemand het aan de praat op die kruistabel?
 
Laatst bewerkt:
Ik zag ook dat je met een kruistabel werkte, en daar gaat het inderdaad mis. Blijkbaar is de veldeigenschap van een kruistabel niet goed in te stellen op deze manier. Ik filter overigens toch al nooit op deze manier (formulierverwijzingen in een criterium) want ik vind dat veel te onbetrouwbaar. Ik gebruik altijd de techniek die ik in je voorbeeld heb gemaakt.
 

Bijlagen

De conversietechniek die ik gebruik in het formulier doet het overigens ook in het criterium:
Code:
Between CDate(CDbl([Formulieren]![Formulier1]![begindate])) And CDate(CDbl([Formulieren]![Formulier1]![enddate]))
 
Bedankt OctaFish. Zou het mogelijk zijn om ipv een rar-file een zip op te laden ajb? Rar kan ik hier niet openen en ik heb geen bevoegdheid op deze pc om daar een progje oid op te installeren waarmee dat wel kan :-s.
 
OK, via een omweg heb ik het bestand toch te pakken gekregen. Wow! Werkt keigoed! Bedankt he!
Nog een vraagje: als ik dit wil toepassen op een andere (confidentiële) database, wat moet ik dan allemaal kopiëren?
 
Sorry voor de rar :). Mocht je alsnog een zipje willen, dan krijg je die natuurlijk wel.
De code die ik gebruik is eigenlijk redelijk simpel (daarom doe ik het natuurlijk ook zo ;) ). Ik gebruik in jouw db 2 stukken code:
De eerste is eigenlijk niet nodig, maar vind ik zelf wel handig. Ik heb je 2 tekstvakken voor de datums vervangen door 2 keuzelijsten die de datums ophalen uit je tabel. Met een query die er zo uitziet:
Code:
SELECT DISTINCT opnamedatum FROM Tabel1 ORDER BY opnamedatum;
voor de Begindatum en
Code:
SELECT DISTINCT Tabel1.opnamedatum FROM Tabel1 WHERE (((Tabel1.opnamedatum)>[Formulieren]![Formulier1]![begindate])) ORDER BY Tabel1.opnamedatum;
voor de laatste. De 2e keuzelijst filtert op de eerste keuzelijst, zoals je kunt zien. En met DISTINCT zorg je er voor dat elke datum maar één keer voorkomt in de lijst. Meer hoeft uiteraard niet. De 2e keuzelijst moet worden bijgewerkt als er in de eerste keuzelijst iets is gekozen:
Code:
Private Sub begindate_Click()
    Me.enddate.Requery
    Me.enddate = ""
End Sub
Ik maak 'm ook gelijk leeg, voor het geval je wat anders wilt kiezen. De knop doet dus het eigenlijke werk:
Code:
Private Sub Knop5_Click()
Dim strSQL As String
Dim iStartDate As Double, iEndDate As Double
Dim qDef As QueryDef

    iStartDate = CDbl(Me.begindate)
    iEndDate = CDbl(Me.enddate)
    strSQL = "SELECT persoon, opnamedatum, a, b, c, d, e, f, g, h, j FROM Query1 " _
        & "WHERE ([opnamedatum] Between CDate(" & iStartDate & ") And CDate(" & iEndDate & "));"

    Set qDef = CurrentDb.QueryDefs("query3")
    qDef.SQL = strSQL
    DoCmd.OpenQuery "query3"

End Sub
De truc is heel eenvoudig, en lost een heel groot probleem op dat je hebt als je met VBA op datums gaat filteren. Namelijk het probleem: is 8-5-2014 nu 8 mei, of 5 augustus? Oftwel: is de datum Amerikaans, of Europees? Als het beide kanten op kan, pakt VBA altijd de Amerikaanse variant, en dan filter je verkeerd. De oplossing is: vertaal de gekozen datum eerst naar een getal (met iStartDate = CDbl(Me.begindate) en vertaal het getal in de query terug naar een datum (met CDate(iStartDate)). En dat doe je natuurlijk ook voor de einddatum.
Wat ik verder graag doe, is de SQL van de query aanpassen door de selectie er 'hard' in te zetten. En dat doe je met de QueryDef collectie.
Dus als je de techniek verder wilt toepassen, dan kun je de code simpel kopieeëren en plakken.
Of, mooier nog, maak er een functie van die de WHERE string opbouwt, en vul die met de velden waar je mee wilt werken. Dan hoef je alleen de functie aan te roepen met de 2 parameters.
 
Merci! Dit overzichtje ga ik goed bewaren :-). Alleen die functie die de WHERE string opbouwt, dat begrijp ik maar dat kan ik zelf niet maken. Gaat m'n petje te boven :-).
Nog 1 vraagje: als ik nu gewoon alles wil selecteren vanaf 1 bepaalde datum, dus niet tussen 2 data, hoe kan ik dat dan aanpassen?
 
En dat is nu net het makkelijkste stukje; dan heb je een klein petje op nu :).
Je kunt het filter heel dynamisch maken, door het op te bouwen. Dat vereist dan ook een kleine aanpassing aan de keuzelijst (met name enddate). In de nieuwe versie kun je alles doen wat je wilt: laat je het filter leeg, dan zie je alles, pak je één van de 2 datumvelden, dan is het ofwel > begindatum, ofwel < einddatum, en vul je ze alletwee in, dan filter je op de reeks.
Mooier kan ik het niet maken :)

En nog een zip ook :D
 

Bijlagen

Met een klein petje heb ik nog veel groeipotentieel he :-).
Hartelijk dank voor je extra uitleg en de fantastische zip! :-)
Ik zal deze vraag op opgelost zetten.
 
Graag gedaan! Oh ja: nog welkom bij HelpMij ;).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan