Records tussen 2 datums

Status
Niet open voor verdere reacties.

wacco

Gebruiker
Lid geworden
9 mrt 2006
Berichten
229
Hallo,

Ik heb een query waarin ik mijn records filter.
Hier wil ik ook een filter op plaatsen, tussen 2 datum.
Beide datum velden worden gekozen op een form, en heten VanMelding en TotMelding.
Dit gaat goed, behalve als er geen datum wordt gekozen.
Mijn vraag is dus, hoe kan ik er voor zorgen dat als er geen datum is gekozen, dat dan alle record worden getoond.
Of als alleen een begin datum (VanMelding) wordt gekozen, dat de records vanaf die datum worden geselecteerd
Ik zoek dus eigenlijk een combinatie tussen IsNull en Between (als dat al mogelijk is)

Mv.g.
 
Ik bouw zo'n filter altijd met VBA op en gebruik dan alleen >= en <= als criteria voorwaarden. Werkt veel beter. Bovendien voorkom je datumproblemen. Kortom: doe er een voorbeeldje bij, zou ik zeggen.
 
Werkt inderdaad ook met <= en >=, maar hoe ga ik dan met dit om als er geen datums zijn ingevoerd.
Kan dit in 1 regel uitgevoerd worden in een query.

De filters van de query worden n.l via een form bepaalt.
Tevens kan op dit form dus een Startdatum (VanMelding) en een einddatum (TotMelding) ingevuld worden, om de zoek opdracht te beperken tussen beide ingevoerde datums.
Dit werkt prima, met de aangedragen optie, maar werkte ook met de Between functie.
Het gaat echter fout als er geen datum wordt ingevoerd, er worden dan geen record getoond.

Een voorbeeldje zal ik eerst moeten maken, omdat dit probleem uit een veel groter geheel komt.
Maar misschien heb je aan bovenstaande info genoeg om mij een oplossing aan te dragen.

M.v.g

P.S.
Beide datumvelden (VanMelding en TotMelding) zijn geen onderdeel van de bovenliggende tabel, maar zijn onafhankelijke velden op het form
 
Laatst bewerkt:
Tevens kan op dit formulier dus een Startdatum (VanMelding) en een einddatum (TotMelding) ingevuld worden, om de zoek opdracht te beperken tussen beide ingevoerde datums.
Tenzij je compleet in het Engels verder wil, stel ik voor dat we gewoon Nederlands gebruiken ;).
De oplossing is, al heb je wat extra code nodig, niet zo moeilijk. Juist omdat je dus variabelen hebt die je wel of niet hebt ingevuld, moet je altijd controleren of die waarden zijn ingevuld of niet. Dat kan wel met een query zelf, maar dan ben je nogal wat IIF functies aan het nesten, en dat is behoorlijk onoverzichtelijk. Ik doe dat dus met een functie op het formulier, dat je toch al in gebruik hebt. De knop waarmee je het rapport (of formulier, dat maakt natuurlijk niet uit) opent krijgt dan wat extra regels. Iets als:

Code:
Private Sub cmdDatumFilter_Click()
Const strcJetDate = "\#mm\/dd\/yyyy\#"  'Do NOT change it to match your local settings.
Dim strWhere As String, strReport As String, strField As String
Dim lngView As Variant
    
    strReport = "rptVerkoop"        'Put your report name in these quotes.
    strField = "[VerkoopDatum]"     'Put your field name in the square brackets.
    lngView = acViewPreview         'Use acViewNormal to print instead of preview.
    'Build the filter string.
    If IsDate(Me.Startdatum) Then
        strWhere = "(" & strField & " >= " & Format(Me.Startdatum, strcJetDate) & ")"
    End If
    If IsDate(Me.Einddatum) Then
        If strWhere <> vbNullString Then strWhere = strWhere & " AND "
        strWhere = strWhere & "(" & strField & " < " & Format(Me.Einddatum + 1, strcJetDate) & ")"
    End If
    'Close the report if already open: otherwise it won't filter properly.
    If CurrentProject.AllReports(strReport).IsLoaded Then
        DoCmd.Close acReport, strReport
    End If
    'Open the report.
    DoCmd.OpenReport strReport, lngView, , strWhere
    Exit Sub

Err_Handler:
    If Err.Number <> 2501 Then
        MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, "Cannot open report"
    End If
End Sub
Hierbij gebruik je een constante om de datum in het juiste format te krijgen; VBA vertaalt jouw Nederlandse datum naar een Amerikaanse datum en dat gaat wel eens fout: 4-7-2016 is nu eenmaal niet hetzelfde als 7-4-2016. De constante zet de datum om naar de juiste (Amerikaanse) opmaak. Zelf gebruik ik een andere techniek: ik zet de datum eerst om naar een getal, en vertaal dat in de query terug naar een datum. Vind ik wat veiliger in het gebruik. De specifieke code ziet er dan zo uit:

Code:
    'Build the filter string.
    If IsDate(Me.Startdatum) Then
        strWhere = "(" & strField & " >= CDate(" & CDbl(Me.Startdatum) & ")"
    End If
    If IsDate(Me.Einddatum) Then
        If strWhere <> vbNullString Then strWhere = strWhere & " AND "
        strWhere = strWhere & "(" & strField & " < CDate(" & CDbl(Me.Einddatum) & ")"
    End If

Take your pick!
 
@Octafish
Bedankt voor de snelle reactie.
Ben zelf ook nog verder gegaan, en heb wel een oplossing gevonden.
Deze gaat wel via een omweg.
Ik heb een extra query aangemaakt, waar ik de records uit de bestaande query filter op datum.
En op het formulier geef ik aan dat bij een ingevulde datum op dit formulier de nieuw aangemaakte query gebruikt moet worden.
Maar als de datum velden leeg zijn, de bestaande query gebruikt dient te worden.
Nog niet helemaal door getest, maar werkt volgens mij ook.

Ga zeker proberen jouw code toe te passen, zodat het geheel niet gaat overlopen van query's en reporten welke erg veel op elkaar gaan lijken.
Nogmaals bedankt.
Zet deze op opgelost.
 
Mijn oplossing is 100% beter.
 
Ga hem zeker toepassen.
En gezien eerdere oplossingen die je hebt aangedragen, en met jou ervaring, zal ook deze beter werken dan wat ik zelf in elkaar knutsel.

Bedankt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan