Verfijning formule voor leeftijdgroepering in query

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
555
Ik gebruik volgende formule in een query om een rapport te genereren met daarin o.a. de verblijfsduur van onze bewoners in het WZC maar ook de leeftijd van de bewoners gegroepeerd in leeftijdsgroepen per 10 jaar om dan op 't einde van het rapport tot een procentuele verdeling van die groepen te komen in de totale populatie.
Code:
Leeftijdsgroep: (DateDiff("yyyy";[Bewoner].[Geboortedatum];Date())\10)*10
Die code is echter nu niet fijn genoeg (of juist) aangezien er bv mensen geboren in 1925 eens wel en dan weer niet bij de 100 leeftijdsgroep worden gezet in verhouding tot de huidige datum. Graag een voorstel wat te gebruiken.

1751467925823.png
Zo kom je tot een overzicht waar er al 2 100 jarigen getoond worden terwijl er duidelijk nog maar één 100 jaar is.
1751468073105.png
 

Bijlagen

  • 1751467816055.png
    1751467816055.png
    11,2 KB · Weergaven: 6
Je kunt natuurlijk ook "gewoon" de leeftijd berekenen. Deze functie plukte ik net van internet:
Code:
Function Leeftijd(Geboortedatum As Date) As Integer
  Dim vandaag As Date
  vandaag = Date
  Leeftijd = DateDiff("yyyy", Geboortedatum, vandaag)

  ' Controleer of de verjaardag dit jaar al is geweest
  If Month(Geboortedatum) > Month(vandaag) Or _
     (Month(Geboortedatum) = Month(vandaag) And Day(Geboortedatum) > Day(vandaag)) Then
    Leeftijd = Leeftijd - 1
  End If
End Function
 
Die functie kan een stuk makkelijker, en zonder het gebruik van een (in mijn ogen) nutteloze variabele.
Code:
Function Leeftijd(Geboortedatum As Date) As Integer
     Leeftijd = DateDiff("yyyy", Geboortedatum, Date) _
          + (Format(Geboortedatum,"mmdd") > Format(Date,"mmdd")
End Function

Waarom de variabele nutteloos is? Als jij mij kan uitleggen waarom je een variabele zou moeten gebruiken waarvan de naamlengte langer is als de functienaam die hij definieert(7 letters om 4), dan geef ik je helemaal gelijk. Maar ik denk niet dat je dat kan :).
 
Je kunt natuurlijk ook "gewoon" de leeftijd berekenen. Deze functie plukte ik net van internet:
Code:
Function Leeftijd(Geboortedatum As Date) As Integer
  Dim vandaag As Date
  vandaag = Date
  Leeftijd = DateDiff("yyyy", Geboortedatum, vandaag)

  ' Controleer of de verjaardag dit jaar al is geweest
  If Month(Geboortedatum) > Month(vandaag) Or _
     (Month(Geboortedatum) = Month(vandaag) And Day(Geboortedatum) > Day(vandaag)) Then
    Leeftijd = Leeftijd - 1
  End If
End Function
Die functie kan een stuk makkelijker, en zonder het gebruik van een (in mijn ogen) nutteloze variabele.
Code:
Function Leeftijd(Geboortedatum As Date) As Integer
     Leeftijd = DateDiff("yyyy", Geboortedatum, Date) _
          + (Format(Geboortedatum,"mmdd") > Format(Date,"mmdd")
End Function

Waarom de variabele nutteloos is? Als jij mij kan uitleggen waarom je een variabele zou moeten gebruiken waarvan de naamlengte langer is als de functienaam die hij definieert(7 letters om 4), dan geef ik je helemaal gelijk. Maar ik denk niet dat je dat kan :).
Ben beginnend access gebruiker. Waar plaats ik deze code. Bij het maken van een Query ? of ergens anders. Ik krijg wel een leeftijd maar niet de exacte zoals 68 jaar, 11 maanden en 30 dagen
 

Bijlagen

Functies plaats je in een module; daar kun je komen als je op <Alt>+<F11> drukt. Heb je nog geen of nog nooit modules gemaakt in de db (of in welke db dan ook) dan kies je in het VBA venster <Invoegen>, <Module>. Die module mag je elke willekeurige naam geven, maar de standaardnaam (Module1) is natuurlijk prima.
In die module plak je (bij voorkeur mijn ;)) de code, en daarna sluit je de VBA editor af. Uiteraard bewaar je de module :).
Vervolgens kun je de functie in een query gebruiken. De functie heeft één parameter nodig: de geboortedatum. Hoe dat veld bij jou heeft, is totaal niet belangrijk, maar het moet uiteraard wél een datum zijn. Om fouten te voorkomen, kun je de functie nog uitbreiden met een stukje foutafhandeling. Dan krijg je deze functie:
Code:
Function Leeftijd(Geboortedatum As Date) As Integer
    If Not IsDate(Geboortedatum) Then GoTo Hell
     Leeftijd = DateDiff("yyyy", Geboortedatum, Date) _
        + (Format(Geboortedatum, "mmdd") > Format(Date, "mmdd"))
    Exit Function

Hell:
    Leeftijd = 0
End Function
Ik zou dus de nieuwe versie gebruiken. Die levert geen fouten op.
 
Ik krijg wel een leeftijd maar niet de exacte zoals 68 jaar, 11 maanden en 30 dagen
Dat was de vraag ook niet. Die was:
de leeftijd van de bewoners gegroepeerd in leeftijdsgroepen per 10 jaar om dan op 't einde van het rapport tot een procentuele verdeling van die groepen te komen in de totale populatie.
Oh, heb je de vraag gekaapt? 😡
 
Functies plaats je in een module; daar kun je komen als je op <Alt>+<F11> drukt. Heb je nog geen of nog nooit modules gemaakt in de db (of in welke db dan ook) dan kies je in het VBA venster <Invoegen>, <Module>. Die module mag je elke willekeurige naam geven, maar de standaardnaam (Module1) is natuurlijk prima.
In die module plak je (bij voorkeur mijn ;)) de code, en daarna sluit je de VBA editor af. Uiteraard bewaar je de module :).
Vervolgens kun je de functie in een query gebruiken. De functie heeft één parameter nodig: de geboortedatum. Hoe dat veld bij jou heeft, is totaal niet belangrijk, maar het moet uiteraard wél een datum zijn. Om fouten te voorkomen, kun je de functie nog uitbreiden met een stukje foutafhandeling. Dan krijg je deze functie:
Code:
Function Leeftijd(Geboortedatum As Date) As Integer
    If Not IsDate(Geboortedatum) Then GoTo Hell
     Leeftijd = DateDiff("yyyy", Geboortedatum, Date) _
        + (Format(Geboortedatum, "mmdd") > Format(Date, "mmdd"))
    Exit Function

Hell:
    Leeftijd = 0
End Function
Ik zou dus de nieuwe versie gebruiken. Die levert geen fouten op.
Ik heb de module1 aangemaakt en ben weer terug in access. Als ik dan in sql ontwerp de code plak krijg ik foutmeldingen. Of is dat niet de bedoeling.
 
Ik krijg wel een leeftijd maar niet de exacte zoals 68 jaar, 11 maanden en 30 dagen
Leeftijd wordt in jaren uitgedrukt. Iemand is 689 jaar, en blijft dat een heel jaar. Wat jij wil is dus geen leeftijd, maar het aantal dagen dat iemand geleefd heeft, uitgedrukt in jaren, maanden en dagen. En dat is een hele andere berekening. Die je wel kan maken overigens, maar dan krijg je een hele andere functie.

Zelf zie ik het nut niet in van dit soort berekeningen, want wat moet je er mee? Als je wilt weten wanneer iemand jarig is, dan is het voldoende als je weet hoeveel dagen die persoon van zijn/haar verjaardag af zit.
Ik heb voor een vereniging wel eens een formulier gemaakt met daarop alle leden die binnen 30 dagen jarig waren. Dan konden ze op tijd de kaarten etc. regelen. Veel nuttiger kun je de exacte verjaardatum niet gebruiken, al laat ik me graag verrassen.
 
Krijg je ervan als je niet oplet :). Inderdaad is het een vraag van Johan, en daar geven we dus in beginsel antwoord op. Andere lezers mogen uiteraard met de gegeven oplossingen aan de slag gaan, maar het is dus niet de bedoeling om een eigen (afwijkende) vraag te stellen in het topic van iemand anders. Ook al heeft die nieuwe vraag verwantschap (maar toch ook weer niet).

In dit geval is de oplossing dus heel simpel: maak zelf een nieuwe vraag aan. En dan gaan we daar zeker naar kijken :).
 
Waarom ga je dan dood lukt verder met het geen van @jlsaccess ??
 
Waarom ga je dan dood lukt verder met het geen van @jlsaccess ??
Spoor jij wel? Of kun je niet lezen? Ik heb twee (voor de analfabeten: 2) antwoord gegeven aan de 'inbreker'. Omdat ik momenteel hele andere zaken aan mijn hoofd heb, en dus even niet goed had opgelet. Doorgaans ben ik er als de kippen bij om 'inbrekers' hierop aan te spreken en ze een eigen vraag te laten starten. Ik heb in #10 al aangegeven dat Peter een eigen vraag moet starten, en daarmee is voor mij de kous af. Pak mij niet aan, maar @jlsaccess die inbreekt.
 
Spoor jij wel? Of kun je niet lezen?
Ja, ik spoor en kan ook nog lezen.
Denk je dat ik (andere) Peter zijn bijdrage niet al gezien had?
Ja, en dan toch antwoord geven.
In dit geval is de oplossing dus heel simpel: maak zelf een nieuwe vraag aan.
Na #6 van 16:03 heb je na #8 van 16:37 dit om 16:40 snel toegevoegd.
Omdat ik momenteel hele andere zaken aan mijn hoofd heb, en dus even niet goed had opgelet.
Ga toch niet steeds in de slachtofferrol want daar heeft niemand iets mee te maken. Ik krijg bijna medelijden met je.
 
Terug
Bovenaan Onderaan