Filter recordset

Status
Niet open voor verdere reacties.

Sytse1

Gebruiker
Lid geworden
9 aug 2007
Berichten
584
Office versie
miDer
In een db wil ik na opgave van een jaartal b.v. 2027 in de tabel 1 januari 2027 vinden.
De procedure geeft een fout bij: rstKalenderjaar.Filter = "Datum = '" & DatumNotatie & "'"
De melding is: Dit bewerking is niet geldig voor dit type object.
Geen idee wat er fout is.
Code:
Private Sub Knop18_Click()

' Haal het jaartal uit het veld Jaar b.v. 2023
Dim Jaar As Integer
Jaar = Forms!Frm_KalenderJaar!Jaar

' Voeg 1 januari toe aan het jaartal
Dim Datum As Date
Datum = DateSerial(Jaar, 1, 1)

' Formatteer de datum naar een lange datumnotatie
Dim DatumNotatie As String
DatumNotatie = Format(Datum, "dd MMMM yyyy")

' Zoek de datum in de tabel Tbl_Kalenderjaar
Dim rstKalenderjaar As DAO.Recordset
Set rstKalenderjaar = CurrentDb.OpenRecordset("Tbl_Kalenderjaar")

rstKalenderjaar.Filter = "Datum = '" & DatumNotatie & "'"

' Controleer of de datum is gevonden
If rstKalenderjaar.RecordCount = 0 Then
' De datum is niet gevonden
MsgBox "Datum niet gevonden", vbInformation, "Kalenderjaar"
Else
' De datum is gevonden
MsgBox "Datum gevonden", vbInformation, "Kalenderjaar"
End If
End Sub


Wat doe ik fout?
 

Bijlagen

Ik kan de db nu even niet openen, maar laten we het even over de fouten hebben die er nu open en bloot liggen :)
Om te beginnen: een variabele gebruiken die dezelfde naam heeft als een veld, is niet slim. Hoe kan Access het verschil weten tussen de variabele Jaar en het veld Jaar? Maak daar op zijn minst iJaar van, zodat je gelijk weet dat het een Integer is. Maar dan nog kan de hele omzetting simpeler zonder variabele:
Code:
DatumNotatie = Format(DateSerial(Me.Jaar, 1, 1), "dd MMMM yyyy")
Maar dat is niet de grootste fout, denk ik. Je wilt deze variabele (die je niet eens declareert) gebruiken om een datumveld te filteren. In een datumveld staan, als het goed is, datums opgeslagen. En dat zijn getallen, geen tekst, ook al zie je dus tekst in je tabel/formulier. Dus de hele omzetting is nergens voor nodig. Komen we bij de volgende fout: Datums filter je met een #, niet met een '. Sowieso raad je iedereen aan om tekst te filteren met een ", en nooit met een '. Maar dat is een ander topic.

En iets wat ook een fout kan opleveren, maar in jouw geval niet omdat elke datum die met 1-1 begint altijd zal werken, is het gegeven dat je met Amerikaanse datums moet filteren. En dat doe jij dus ook al niet.

Ik zal vanmiddag eens kijken of ik je db kan bekijken of het inderdaad zo erg is als dat ik nu denk, en dan komen we er nog wel op terug!
 
Octafish vast bedankt.
De volgende stap ( die bij mij werkt) is dat als het jaar niet is gevonden er een nieuw kalenderjaar vanaf 1 januari t/m 31 december wordt gemaakt en dit jaar dan aan de tabel wordt toegevoegd.
 
Ik snap eerlijk gezegd niets van je tabel. Dat je een tabel maakt en die op voorhand vult met datums vind ik al discutabel, dat je daar velden inmaakt voor Dag, Maand en Jaar zo mogelijk nog discutabeler. Waar het écht fout gaat, is dat je die velden niet als (Lange) Integer vastlegt, maar als Datum/Tijd. Dat is natuurlijk onzin, want een dag is per definitie een getal dat niet groter kan worden dan 31, en een maand stopt bij 12. Wat je dan dus op slaat, is 31-1-1901 voor een dag, en 12-1-1901 voor de maand. Leg mij eens uit wat daar het nut van is :).

Maar die velden zijn volkomen af te leiden van het eerste veld Datum, dus je zondigt al tegen de eerste regel van normaliseren. Nog even afgezien van de onzinnige situatie dat je de datum 6-10-2023 kan opslaan, en in hetzelfde record Dag 14, Maand 6 en Jaar 2021. Onzininformatie? Natuurlijk :).

Maar het antwoord op je vraag, en dan mag je zelf bepalen of je op deze weg verder wil, is deze code:

Code:
Dim strSQL As StringDim rst As DAO.Recordset
    
    strSQL = "Select Datum From Tbl_Kalenderjaar WHERE Datum = #" & DateSerial(Me.Jaar, 1, 1) & "#"
    Set rst = CurrentDb.OpenRecordset(strSQL)
    If rst.RecordCount = 0 Then
        MsgBox "Datum niet gevonden", vbInformation, "Kalenderjaar"
    Else
        MsgBox "Datum gevonden", vbInformation, "Kalenderjaar"
    End If
 
Octafish bedankt.
Het is alleen de wijze van communicatie die mij er van gaat weerhouden om ooit nog eens een vraag te stellen.
 
Bang voor (een beetje) kritiek? Wat heb ik nou weer verkeerd gezegd? Ik heb, dacht ik, duidelijk gemaakt waarom je in beginsel in een Datumtabel alleen het datumveld nodig hebt, en de overige velden niet. En (ok, dat kun je als kritiek bestempelen) gezegd dat je daarvoor de verkeerde veldtypes gebruikt. Maar ik zou dus écht niet weten hoe ik jou anders moet vertellen dat die velden niet kloppen. Die velden moeten namelijk numeriek zijn, en geen datumveld. Daar valt echt niet tegenaan te sugarcoaten.

De reden dat ik die tabel nutteloos vind is ook een simpele: op het moment dat je in een tabel een datum nodig hebt, vul je die in het betreffende record in, al dan niet als standaardwaarde, dan wel met de popup Kalender. Op basis van de ingevoerd waarden heb je dan automatisch alle datums die je nodig hebt. Ik heb daar dus nooit een aparte tabel voor hoeven maken. En ik snap dus niet waarom jij zo'n tabel nodig hebt. En daarom vroeg ik dus alleen maar om de uitleg over jouw opzet. Tja, als je dáár al niet tegen kan....

Overigens wil ik jouw vragen best met rust laten, er zijn meer mensen die antwoord kunnen geven.
 
Octafish, zoals je wellicht weet is het de toon die de muziek maakt.

Je bent natuurlijk uitermate deskundig. Ik twijfel daar moment over.
Hoe goed bedoeld ook, ik proef bijna altijd uit je antwoord dat je het maar allemaal geklungel vindt.
Ik krijg dan direct ook het liedje in mijn hoofd "t Is Moeilijk Bescheiden Te Blijven" :d

En waarom een heel kalenderjaar: een 7 x 24 uurs bedrijf wil graag een totaal jaar in beeld hebben.
Het ging in de proef versie er mij alleen om op basis van een (jaar)getal een totaal jaar in de tabel op te slaan.
De vraag van mij ging dan ook alleen over het vba gedeelte.

(Maar als je vba oplossing zie was het van mij ook geklungel):evil:
 
Laatst bewerkt:
… ik proef bijna altijd uit je antwoord dat je het maar allemaal geklungel vindt. Ik krijg dan direct ook het liedje in mijn hoofd "t Is Moeilijk Bescheiden Te Blijven" :d
Peter Blanker…. Er gaat geen week voorbij of ik zing dat lied wel een keer :). Nee, geklungel vind ik het niet; sowieso kun je het mensen nooit kwalijk weten dat ze iets (nog) niet weten. Kennis komt nu eenmaal met de tijd en ervaring. Je wilt niet weten hoe mijn eerste databases er uit zagen! Dus ik heb zeker de wijsheid niet in pacht.

Maar ik verzet me wél tegen de trend van het ‘pamperen’ van mensen. Teveel mensen gaan tegenwoordig huilen als je iets naars tegen ze zegt :). Daar hadden we vroeger (althans: in mijn geheugen) toch minder last van. Mijn opvatting is dus dat je beter op een directe manier uit kunt leggen wat er fout is. En dat doe ik dus met enige regelmaat :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan