leeftijdscategorie

Status
Niet open voor verdere reacties.

Wimbuijs

Gebruiker
Lid geworden
23 aug 2020
Berichten
13
SELECT tblGezin.gezNaam, IIf(DateDiff("yyyy",[Contactpersonen]![Geboortedatum],Date())>12,"Volwassen","Kind") AS fldLeeftijdsCat, Count(Contactpersonen.ID) AS CountOfID
FROM tblGezin INNER JOIN Contactpersonen ON tblGezin.gezID = Contactpersonen.Gezin
GROUP BY tblGezin.gezNaam, IIf(DateDiff("yyyy",[Contactpersonen]![Geboortedatum],Date())>12,"Volwassen","Kind");


Deze code werkt perfect
Kan ik in deze code ook een derde leeftijdscategorie toevoegen ?
Dus jonger dan 7 is " Peuter" .
Heeft te maken met betaling, volwassenen betalen de volle prijs, kinderen halve prijs en peuters jonger dan 7 jaar zijn gratis.
 
De IIf in Access werkt net zoals de If functie in Excel. Een derde categorie maakt de iif iets complexer, maar dat lukt nog. Indien er nog meer categorieën bijkomen kan je beter een eigen functie creëren via VBA en die gebruiken.
Met Iif:
Code:
 IIf(DateDiff("yyyy",[Contactpersonen]![Geboortedatum],Date())>12,"Volwassen",Iif(DateDiff("yyyy",[Contactpersonen]![Geboortedatum],Date())<7,"Peuter","Kind")) AS fldLeeftijdsCat

In code:
Code:
Public Function fAgeCat(datBirthDate As Date) As String
On Error GoTo Err_fAgeCat

    Dim intYears As Integer
    
    intYears = DateDiff("yyyy", datBirthDate, Date)
    If intYears > 12 Then
        fAgeCat = "Volwassen"
    ElseIf intYears > 7 Then
        fAgeCat = "Kind"
    Else
        fAgeCat = "Peuter"
    End If

Exit_fAgeCat:
    Exit Function
    
Err_fAgeCat:
    Debug.Print Err.Number & ": " & Err.Description
    fAgeCat = "#Error in fAgeCat#"
    Resume Exit_fAgeCat

End Function

Die functie kan je dan in de query gebruiken:
vervang
IIf(DateDiff("yyyy",[Contactpersonen]![Geboortedatum],Date())>12,"Volwassen",Iif(DateDiff("yyyy",[Contactpersonen]![Geboortedatum],Date())<7,"Peuter","Kind"))

door

fAgeCat([Contactpersonen]![Geboortedatum])
 
dank voor uw oplossing, het werkt perfect.
Kan ik ook in de tabel contactpersonen of in een afhankelijke Query , een berekend veld toevoegen zodat dit automatisch wordt ingevuld als " peuter ", " kind " , of als "volwassenen ".
Dit lijkt me handiger om verder te gaan in mijn database.

mvg Wim
 
Ik zou geen berekend veld in een tabel aanmaken, maar in queries kan dit perfect.
 
Hoe doe ik dat ?
Welke expressie dien ik dan te gebruiken ?
Kan u mij op weg helpen ?
 
Ik begrijp je vraag niet goed, in bericht #1 gebruik je toch al de functie in een query om het berekend veld fldLeeftijdsCat aan te maken? Die kan je daar vervangen door de IIF expressie die ik in bericht 2 gaf.
Als je de VBA functie wil gebruiken zal je eerst de functie in een globale module van de VBA omgeving moeten aanmaken, maar daarna kan je die als een gewone access functie gebruiken.

Je kan het gegeven ook in een formulier/rapport gebruiken door de functie (Iif of zelf geprogrammeerde functie) als control source voor een tekstvak te gebruiken.
 
als ik deze code gebruik krijg ik altijd foutmelding, " de Syntaxis van de expressie is ongeldig"

IIf(DateDiff("yyyy",[ContactpersonenT]![Geboortedatum],Date())>12,"Volwassen",Iif(DateDiff("yyyy",[ContactpersonenT]![Geboortedatum],Date())<7,"Peuter","Kind")) AS fldLeeftijdsCat
 
Probeer eens de komma's (,) door puntkomma's te vervangen (;) Als je in een Nederlandstalige omgeving in een query werkt dan moeten de functie-argumenten door ; van elkaar worden gescheiden en niet met een komma. Sorry
 
Volgens mij kan de code nooit perfect werken (heb ik toch al een paar keer gelezen in het draadje) omdat je alleen een jaar verschil uitrekent, maar geen rekening houdt met de maand + dag. Dat werkt perfect op 31 december, maar nooit op 2 januari.
 
Weet ik, maar als die preciesie nodig is dan kan je de volgende functie gebruiken:
Code:
Public Function gfgCalcAge(datDateB As Date, Optional datDateC As Date) As Integer
On Error GoTo Err_gfgCalcAge

    Dim intYears As Integer
    
    If datDateC <= #1/1/1900# Then datDateC = Date
    If datDateB > datDateC Then
        gfgCalcAge = -1
        GoTo Exit_gfgCalcAge
    End If
    intYears = Year(datDateC) - Year(datDateB)
    If Month(datDateC) < Month(datDateB) Then
        intYears = intYears - 1
    End If
    If Month(datDateC) = Month(datDateB) And Day(datDateC) < Day(datDateB) Then
        intYears = intYears - 1
    End If
    gfgCalcAge = intYears
    

Exit_gfgCalcAge:
    Exit Function
    
Err_gfgCalcAge:
    gfgCalcAge = -1
    Resume Exit_gfgCalcAge

End Function

Maar dan zit je zowiezo met VBA. Als het eenvoudig datediff genoeg is, dan hoef je geen VBA te gebruiken.

vriendelijke groeten
nga
 
Kan een heel stuk simpeler. Ik zal morgen die code ook wel even posten. Sowieso raad ik Select Case aan, i.p.v. de IF constructie.
 
Dit is misschien niet echt nodig, misschien eerst antwoorden op de audit trail draad, die wacht al sinds 1 oktober op je erudiete raad.
 
De komma's vervangen door punt-komma's en werkt inderdaad perfect.
Wat bedoeld OctaFish met "volgens mij kan de code nooit perfect werken "

alvast bedankt.
 
Check zelf maar bij een aantal personen. Iemand die is geboren op 12-5-2020 is nu 20, maar iemand van 15-11-2020 is nog 19. Beiden hebben hetzelfde geboortejaar, en volgens jou rekenmethode zijn ze dus even oud.
 
misschien eerst antwoorden op de audit trail draad, die wacht al sinds 1 oktober op je erudiete raad.
Fijn, maar ook een beetje verontrustend dat je blijkbaar in mijn agenda kan kijken en daaruit kan concluderen dat ik daar best al een oplossing voor gevonden zou kunnen hebben.
 
Maar, we schatten je kennis zo hoog in dat jij toch niet hoeft te zoeken naar een oplossing, die heb je toch zo kant en klaar :P :p
 
Het zal je wellicht verbazen, maar ik vind mijn a.s. verhuizing en alles wat daar bij komt kijken nét even iets belangrijker dan HelpMij :d.
 
Leeftijd

Dit kan ook zonder een module te gebruiken in een Query.

SQL namen zelf aanpassen.

SELECT IIf(DateSerial(Year(Now()),Month([Geboortedatum]),Day([Geboortedatum]))>Now(),Year(Now())-Year([Geboortedatum])-1,Year(Now())-Year([Geboortedatum])) AS leeftijd, tblPersonen.Geboortedatum, IIf([leeftijd]>12,"Volwassen",IIf([leeftijd]<7,"Peuter","Kind")) AS Cat
FROM tblPersonen;

Gr. Cor
 
Zoals ik al zei: de formule om de leeftijd te berekenen kan een stuk korter. Ook de versie van pletter is nog te lang :).
PHP:
SELECT DisplayName, DateOfBirth, Year(Date())-Year([DateOfBirth])+(Format(Date(),"mmdd")<Format([DateOfBirth],"mmdd")) AS Leeftijd, IIf([leeftijd]>12,"Volwassen",IIf([leeftijd]<7,"Peuter","Kind")) AS Cat FROM Contact;
Overigens is NOW in een datumberekening natuurlijk nergens voor nodig. Gewoon Date gebruiken dus.
 
De oplossing van Pletter werkt weer perfect, bedankt voor al jullie oplossingen.
De PHP Code van OctaFish zal ook wel werken, maar met PHP ben ik niet vertrouwd en weet niet echt hoe ik dit moet doen.
mvg Wim
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan