Datum vinden in subform

Status
Niet open voor verdere reacties.

Sytse1

Gebruiker
Lid geworden
9 aug 2007
Berichten
584
Office versie
miDer
In mijn subform is een veld DatumEnDag. het veld heeft een Lange datumnotatie.
De datum wordt dan ook getoond als bv: woensdag 9 mei 2018
Er kunnen meerdere records zijn met dezelde datum. Deze records zijn dan nader ingevuld.
Er is altijd een leeg record met een en dezelfde datum als de nader ingevulde records.
In het subvenster kan het ingevulde record middels een knop verwijderd worden.
De verwijdering is geen probleem. Wat ik wil is dat het lege record met dezelfde datum in de tabel wordt gevonden en getoond. De datum wordt voor de verwijdering in een variabele vast gelegd.
De variabele is gedeclareerd: Public VarDatum As Date
In de variabele is de datum dan te zien als 9-5-2018
Bij VarDatum = Format(VarDatum, "dddddd") krijg ik de foutmelding Typen komen niet overeen.
Dus deze formatering overgeslagen.
Voor het terugvinden dan de opgeslagen datum gebruik ik onderstaande code.
De foutmelding komt bij regel: If IsDate(Forms!F_1!S_MJ1.Form.FindRec)
Ik krijg daar de foutmelding Door de toepassing of door object gedefinieerde fout.
Heeft dit nu te maken met het verschil in de datum zoals vermeld in het record en de vermelding in de variabele?
Sytse

Code:
Public Function datumvinden()
'De datum van het gewiste record in subform S_MJ1 tonen
'Bewaarde datum in de variabele VarDatum om naar deze datum terug te gaan
Forms!F_1!S_MJ1.Form.RecordSource = "QSmj1" 'Subform S_MJ1
Dim rst As Recordset
Dim frm As Form
    Set frm = Forms!F_1!S_MJ1.Form
     If IsDate(Forms!F_1!S_MJ1.Form.FindRec) Then 'hier de foutmelding
        Set rst = frm.RecordsetClone
        With rst
            .FindFirst "DatumEnDag = Cdate(" & CDbl(Forms!F_1!S_MJ1.Form.FindRec) & ")"
            If Not .NoMatch Then
                frm.Bookmark = .Bookmark
            Else
                MsgBox "Niet gevonden!" & Chr(13) & " Kies Ok ", 0, "Attentie"
            End If
            .Close
        End With
    End If
Set rst = Nothing
End Function
 
Eerst maar even een aantal misverstanden uit de weg ruimen, want er zitten er wel een paar in jouw verhaal. Om te beginnen: een datum is een getal, en opmaak verandert daar helemaal niets aan. Je kunt elk getal als een dag weergeven, een maand, een jaar... Maakt allemaal niet uit. Dit: VarDatum = Format(VarDatum, "dddddd") kan nooit. Al was het maar omdat dit geen datumopmaak is. "dddd" kan nog wel (krijg je op Date() Woensdag als uitkomst) maar zoveel d-tjes, dat kan niet. Of je krijgt 090909 als uitkomst. Maar dan nog: een FORMAT opdracht geeft altijd een tekst als uitkomst, geen getal. En ik heb net verteld dat een datum altijd een getal is.
Dit: VarDatum = CDate(Format(VarDatum, "d-m-yyyy")) levert de door jou gewenste opmaak op.

Misverstand nummer 2. FindRec zoekt een record voor je op. Geen datum. IsDate op een FindRec object, gaat dus altijd fout. Maar waarom zou je dat zo doen? Met DLOOKUP gaat het veel makkelijker. Maar je houdt van moeilijk, want je declareert een Form object (frm) en gebruikt dat vervolgens nergens :).

Waarom zou je trouwens elke keer opnieuw dezelfde recordset toewijzen aan je formulier? Beetje onzinnig, als je het mij vraagt. Net dus als het gebruik van een leeg record, puur om daar een datum (de laatste datum?) in te zetten. Je maakt de db alleen nodeloos veel groter, tenzij je regelmatig comprimeert kan dat een probleem gaan vormen.
Persoonlijk zou ik deze hele constructie zo dus niet maken, maar een functie maken die de standaardwaarde van het veld steeds aanpast op basis van de door jou gewenste datum. Die je dus makkelijk met DLOOKUP uit je tabel kunt ophalen met één regel code. Dan hoef je ook geen records meer te wissen.
 
Om het een beetje te begrijpen heb ik je reactie een paar keer overgelezen.
Ik ben niet helemaal duidelijk geweest.
Ik heb een tabel met 365 ingevulde datums, een jaaroverzicht.
Begint op 1 januari en eindigt op 31 december.
In elk record staat naast het id een datum.
Het record kan door een medewerker op de door hem gewenste datum nader worden ingevuld.
Na de invulling wordt er nieuw record gemaakt met alleen (dezelfde) datum.
Dit omdat een andere medewerker ook op deze datum iets kan invullen.
Bij een verkeerde invulling moet het verkeerd ingevulde record gewist worden.
Na het wissen moet het aanwezige record met alleen de dezelfde ingevulde datum als het gewiste record getoond worden.
Bij het wissen van het record wordt de datum van het te wissen record in een variabele gezet.
Met deze variabele wil ik de record pointer plaatsen bij het gevonden record.
Ik probeer dit wellicht op een totaal verkeerde vba manier op te lossen.
Maar vandaar mijn hulpvraag.
 
Ook ik heb je antwoord een paar keer overgelezen, maar ik snap er nu helemaal niks van. Dat gaat dus downhill, want na je eerste berichtje snapte ik er niets van. Ben benieuwd waar dit gaat eindigen. Één ding weet ik wel: ik heb nog nooit een tabel nodig gehad waarin alle dagen van een jaar staan. Daar zal ik straks nog wel een paar nachtmerries van krijgen, van dat idee :)
 
Kan er ook amper een touw aan vastknopen.... zet eens een stroomschema neer wat je er mee wilt, das handiger dan in woorden.
En post iig eerst een voorbeeld database.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan