Query leeftijdberekening op peildatum (1-11)

Status
Niet open voor verdere reacties.

Noortd

Gebruiker
Lid geworden
21 jan 2013
Berichten
14
Hallo,

Ik probeer al een paar dagen twee problemen op te lossen.

Voor de categorie waarin jeugdleden vallen geldt een peildatum van 1 november van het vorige kalenderjaar.
Voor 2013 is de categorie en contributie dus afhankelijk van de leeftijd op 1-11-2012
In de query gebruik ik de formule:
lftd1nov: Year(1)-Year([leden].[GeboorteDatum]-#1-11-2012#+1
Dan krijg ik keurig de op een heel jaar naar beneden afgeronde leeftijd vorig jaar op 1 november.
Kan ik dit automatiseren zodat ik dit volgend jaar niet hoef te wijzigen in 1-11-20-13?
Mij lukt het niet om het zodanig te formuleren dat het werkt

Hetzelfde geldt voor nog te betalen contributie als men halverwege het jaar lid wordt.
Nu gebruik ik:

Contributie: IIf([Aanmj]=2013;[Bedrag]/365*(DateDiff("d";[TCB]![Aanmelddatum];#31-12-2013#+11,45));[Bedrag])
Kan ik dit ik zodanig aanpassen dat ik de datum niet jaarlijks hoef aan te passen?
Ik kom er niet uit.

Alvast bedankt!
 
Ik heb even geen vba, maar zoiets:

dateserial(31,12,year(now())) kun je 31-12-<dit jaar> mee creeren ipv je #31-12-2013#

edit:

datesrial is y,m,d dus andersom:

dateserial(year(now()),12,31)
 
Laatst bewerkt:
Daarmee kom ik in ieder geval een stuk verder: Goede tip! Bedankt
Met: DateDiff("d";[TCB]![Aanmelddatum];DateSerial(Year(Now());12;31)) heb ik de dagen vanaf de aanmelddatum tot 31 december 2013.

Ik probeer dat nu om te zetten naar alleen de aanmeldingen van dit jaar, maar krijg er steeds foutmeldingen op:
IIf([Aanmj]=(Year(Now());[Bedrag]/365*(DateDiff("d";[TCB]![Aanmelddatum];DateSerial(Year(Now());12;31))+11,45));[Bedrag])
Heb al met haakjes etc geschoven maar tot nu toe krijg ik dat stukje nog niet werkend.
 
Met: DateDiff("d";[TCB]![Aanmelddatum];DateSerial(Year(Now());12;31)) heb ik de dagen vanaf de aanmelddatum tot 31 december 2013.
Waarom zo ingewikkeld?
Een datum is een getal; [Aanmelddatum] is dus een getal, en DateSerial maakt een datum = een getal. En getallen kun je van elkaar aftrekken.
Code:
DateSerial(Year(Date());12;31) - [Aanmelddatum]
is dus een prima formule voor jouw berekening. In je contributieformule zie ik een veld [Aanmj] gebruikt worden. Ik hoop dat dit een berekend veld is in de query, en geen tabelveld, want dat zou een beetje onzinnig zijn; aanmeldingsjaar bereken je natuurlijk heel simpel vanuit de Aanmelddatum.
Wat is er overigens gebeurd met de peildatum van 1 november? Je rekent nu ineens met 31 december... Zal wel een logische verklaring voor zijn :)
Ik zou zowel voor de contributie als voor de peildatum een functie gebruiken, dan ben je van alle sores af. Bovendien kun je de berekening dan veel beter laten uitvoeren.

Code:
Function Leeftijd(ControleDatum As Variant, Optional PeilDatum As Variant) As Integer
'****************************************************************
' INVOERPARAMETERS:
'    ControleDatum: De begindatum (bijvoorbeeld een geboortedatum)
'    PeilDatum: De controledatum (bijvoorbeeld vandaag)
'****************************************************************
Dim varAge As Variant
Dim HuidigeVerjaardag As Date

    If IsNull(ControleDatum) Then Leeftijd = 0: Exit Function
    If IsMissing(PeilDatum) Then PeilDatum = Date
    HuidigeVerjaardag = DateSerial(Year(PeilDatum), Month(ControleDatum), Day(ControleDatum))
    varAge = DateDiff("yyyy", ControleDatum, PeilDatum)
    If PeilDatum < HuidigeVerjaardag Then varAge = varAge - 1
    Leeftijd = CInt(varAge)

End Function

Deze functie vraagt een (geboorte)datum, en een peildatum. Je roept hem zo aan in een query: Leeftijd_Peildatum: Leeftijd([geboortedatum];DateSerial(Year(Date());11;1)).
Of je legt de peildatum vast in de functie. Dan krijg je dit:

Code:
Function LeeftijdPeildatum(ControleDatum As Variant) As Integer
'****************************************************************
' INVOERPARAMETERS:
'    ControleDatum: De begindatum (bijvoorbeeld een geboortedatum)
'****************************************************************
Dim varAge As Integer
Dim PeilDatum As Date, HuidigeVerjaardag As Date

    If IsNull(ControleDatum) Then LeeftijdPeildatum = 0: Exit Function
    If IsMissing(ControleDatum) Then LeeftijdPeildatum = 0: Exit Function
    If IsMissing(PeilDatum) Then PeilDatum = Date
    PeilDatum = DateSerial(Year(Date), 11, 1)
    HuidigeVerjaardag = DateSerial(Year(PeilDatum), Month(ControleDatum), Day(ControleDatum))
    varAge = DateDiff("yyyy", ControleDatum, PeilDatum)
    If PeilDatum < HuidigeVerjaardag Then varAge = varAge - 1
    LeeftijdPeildatum = CInt(varAge)

End Function
In de query wordt dat: Leeftijd_Peildatum: LeeftijdPeildatum([geboortedatum]) In beide gevallen heb je een correcte leeftijd t.o.v. de peildatum.
En voor de contributie dus ook een functie:

Code:
Function ContributieBedrag(ControleDatum As Variant, Contributie As Currency) As Currency
Dim EindeJaar As Date, BeginJaar As Date
Dim AantalDagen As Integer
    
    If IsNull(ControleDatum) Then ControleDatum = DateSerial(Year(Date), 1, 1)
    EindeJaar = DateSerial(Year(Date), 12, 31)
    BeginJaar = DateSerial(Year(Date), 1, 1)
    AantalDagen = (EindeJaar + 1) - BeginJaar
    If Year(ControleDatum) = Year(Date) Then
        ContributieBedrag = (Contributie / (AantalDagen) * (EindeJaar - ControleDatum))
    Else
        ContributieBedrag = Contributie
    End If
End Function
En die zet je zo in een query: Te betalen: ContributieBedrag([Aanmelddatum];[Bedrag])
De functies overigens zet je in een module. Niet op een formulier, want dan werken ze alleen op dat formulier.
 
Ik ben niet helemaal bekend met de verschillende formules. maar is die optelling (11,45) een optelling in datum? Heb je al geprobeerd om die direct op te tellen in "dateserial"? of datediff hier ook te gebruiken? mogelijk slikt hij de optelling niet?

Zet eventueel ook een vereenvoudigde versie in elkaar en zet een breakpoint op dit punt om te zien of je de juiste waarden krijgt.

*edit*

Zie uitgebreide en nuttigere toevoeging van octafish :P
 
Laatst bewerkt:
Query leeftijd op peildatum

Wat fijn dat jullie zo behulpzaam zijn! Dank daarvoor

Die: DateSerial(Year(Date());12;31) - [Aanmelddatum] is idd veel handiger om te gebruiken.
Ik ben nog maar een beginner;)

Ik heb idd met twee data te maken:
1. De peildatum is voor de categorie (mini-pupil, pupil A, B, junior A, B etc) waarin men valt: dat is 1 november vorig jaar. De leeftijd op 1 november vorig jaar moet dus berekend worden. Dus eigenlijk het huidige jaar – 1

Als ik het volgende gebruik dan heb ik ook de leeftijd, maar heb ik een afrondprobleem.
Expr2: (DateSerial(Year(Date())-1;11;1)-[GeboorteDatum])/365


2. Voor nieuwe leden de nog resterende contributiedagen vanaf datum aanmelding huidig jaar tot einde jaar. (Die 11,45 zijn inschrijfgelden AU en club).
Die contributie heb ik nu werkend op deze manier. Dat is NU opgelost!
Aanmeldjaar is idd een berekend jaar in de query


Die functies heb ik nog niet eerder mee gewerkt. Ziet er goed uit. Ik kan het wel volgen maar weet niet hoe ik ze kan oproepen in de query. Zover ben ik nog niet. Daar moet ik op mijn gemak eens voor gaan zitten om te onderzoeken hoe ik dat voor elkaar moet krijgen. Daar ga ik dus eens voor puzzelen
Zo blijven we bezig!
 
Ik ben eruit:

Met Expr2: Int((DateSerial(Year(Date())-1;11;1)-[TCB]![GeboorteDatum])/365)

Heb ik alleen de geboortejaren zonder komma vorig jaar 1 november
 
Ik heb precies uitgelegd hoe de functies werken. Kopieer ze en plak ze in een nieuwe module. Da's stap één. Stap 2 staat er ook: hoe je ze gebruikt in een query. Probeer maar eens uit, je hoeft er niks voor aan te passen, hooguit de veldnamen.
 
Laatst bewerkt:
Ik heb ze geplakt in een nieuwe module en het lijkt te werken. Ik ga kijken wat er allemaal gebeurt.
Hartstikke top! Bedankt !
 
Kan de vraag op <Opgelost>. Tenzij het alsnog niet werkt natuurlijk :)
 
Hallo,
Ik ben ruim een week op vakantie. Daarna kan ik kijken of het allemaal goed loopt. Dat laat ik nog weten.
Bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan