Avatar billede crazy_zim Nybegynder
21. februar 2005 - 02:16 Der er 24 kommentarer og
1 løsning

Udskrive liste over antal medlemmer fordelt på alder - igen

Hej igen
Jeg har kigget lidt på den db som jeg fik tilsendt og efter at have kigget lidt nærmere på den, har jeg fundet ud af at den ikke er så brugbar, da den kun udregner alder for 1 person ad gangen.
Men så tænkte jeg om det ikke var muligt at lave en eller anden for for løkke, så den løber hele basen igennem og udregner alder for de enkelte personer og deler dem ind i de intervaller der skal udskrives en liste for.
Lyder måske lidt kryptiskt.
Eller måske findes der en anden løsning.
Alle foreslag modtages.
Avatar billede mugs Novice
21. februar 2005 - 05:39 #1
Det må være dette spørgsmål:

http://www.eksperten.dk/spm/588165

Det er korrekt, at den tilsendte db kun beregner en person ad gangen. Som thomasjepsen skriver, kan du placere beregningen i et modul, og så kalde dette fra en forespørgsel.
Avatar billede rosco Novice
21. februar 2005 - 18:00 #2
Hvad med at beregne alder i forespørgslen
Avatar billede crazy_zim Nybegynder
21. februar 2005 - 19:00 #3
Jo, det kunne jeg da godt hvis jeg kunne finde ud af det.
Jeg skal bruge 6 udregninger (3 for m og 3 for k). Så jeg havde tænkt på at lave 6 variabler, som skulle tælles op efterhånden som programmet kørte db igennem. Men hvordan man lige laver det i praksis med hvilket felt og hvordan man skal bruge i enten en FOR eller DO WHILE løkke eller ??, det er jeg ikke helt med på.
Programmering er ikke lige det jeg er aller stærkest i.
Avatar billede mugs Novice
22. februar 2005 - 05:41 #4
Indsæt dette i et modul:

Public Function Alderberegning(Dato As Date) As Integer
If DateSerial(Year(Date), Month(Dato), Day(Dato)) > Date Then
Alderberegning = DateDiff("yyyy", Dato, Date) - 1
Else
Alderberegning = DateDiff("yyyy", Dato, Date)
End If
End Function

Herefter kopierer du dette ind i en tom kolonne i en forespørgsel:

Udtryk1: Alderberegning([fødselsdag])

Feltet fødselsdag skal rettes til navnet på dit felt med 6-cifret fødselsdag.
Avatar billede kjulius Novice
22. februar 2005 - 18:58 #5
Du kunne f.eks. oprette en tabel med dine intervaller (her kaldet AldersPerioder). Hvis vi herefter bygger på koden fra det oprindelige spørgsmål, kan du lave en forespørgsel som denne:

SELECT FraÅr, TilÅr, Sum(IIf(IIf(DateSerial(Year(Date()),Month(Fødselsdag),Day(Fødselsdag))>Date(),DateDiff("yyyy",Fødselsdag,Date())-1,DateDiff("yyyy",Fødselsdag,Date()))>=FraÅr And IIf(DateSerial(Year(Date()),Month(Fødselsdag),Day(Fødselsdag))>Date(),DateDiff("yyyy",Fødselsdag,Date())-1,DateDiff("yyyy",Fødselsdag,Date()))<=TilÅr,1,0)) AS AntalMedlemmer
FROM Aldersperioder, Fødselsdage
GROUP BY FraÅr, TilÅr;
Avatar billede mugs Novice
22. februar 2005 - 19:02 #6
kjulius < jeg mener ikke det er relevant at oprette endnu en tabel, fordelingen i aldersgrupperne må kunne laves med en iif i forespørgslen.
Avatar billede mugs Novice
22. februar 2005 - 19:10 #7
F.eks. således:

Udtryk2: IIf([Udtryk1]>20 And [Udtryk1]<25;"20-24";IIf([Udtryk1]>24 And [Udtryk1]<30;"25-29"))
Avatar billede kjulius Novice
22. februar 2005 - 19:13 #8
--> mugs: Tjo, men det er jo sådan set også det jeg har gjort.
Man kunne selvfølgelig hardkode intervallerne i sådan en IIf sætning, men jeg foretrækker klart en parameterstyret opsætning (eller tabelbaseret, i dette tilfælde).

Det gør det meget mere enkelt at tilrette intervallerne efterfølgende, og er idet hele taget meget mere generelt brugbart.

Bare min ringe mening :-)
Avatar billede mugs Novice
22. februar 2005 - 19:17 #9
kjulius > Når der er flere måder at gøre tingene på, ar vi jo ofte uenige. Og det er forfriskende!

Vi skal naturligvis have de nødvendige tabeller, men kan jeg kode mig ad af det i en SQL i stedet for en ekstra tabel, foretrækker jeg klart at gøre det.

Men hvad der er teknisk er mest korrekt, ved jeg ikke ;o)
Avatar billede kjulius Novice
22. februar 2005 - 19:31 #10
Nej, det ved jeg heller ikke. Som så meget andet her i livet, er det i sidste ende et spørgsmål om smag og behag.

Noget andet er så, at din idé med at gemme en del af funktionaliten i en funktion i et modul, gør SQL koden meget mere overskuelig. Det har du selvfølgelig ret i.

Hvis jeg skulle bruge din funktion i min SQL ville den lyde ca. sådan:

SELECT FraÅr, TilÅr, Sum(IIf(Aldersberegning(Fødselsdato) >= FraÅr And Aldersberegning(Fødselsdato) <= TilÅr, 1, 0)) AS AntalMedlemmer
FROM Aldersperioder, Fødselsdage
GROUP BY FraÅr, TilÅr

Ingen tvivl om, at det bliver mere overskuelig på den måde.
Avatar billede kjulius Novice
22. februar 2005 - 20:08 #11
Jeg ser lige, at "kunden" ønsker en opdeling efter køn. Det vil kunne gøres sådan:

SELECT FraÅr, TilÅr, Sum(IIf(Køn="Mand",IIf(Aldersberegning(Fødselsdag)>=FraÅr And Aldersberegning(Fødselsdag)<=TilÅr,1,0),0)) AS Mænd, Sum(IIf(Køn="Kvinde",IIf(Aldersberegning(Fødselsdag)>=FraÅr And Aldersberegning(Fødselsdag)<=TilÅr,1,0),0)) AS Kvinder
FROM Aldersperioder, Fødselsdage
GROUP BY FraÅr, TilÅr;

Eller det samme med den mere "rå" kode:

SELECT FraÅr, TilÅr, Sum(IIf(Køn="Mand",IIf(IIf(DateSerial(Year(Date()),Month(Fødselsdag),Day(Fødselsdag))>Date(),DateDiff("yyyy",Fødselsdag,Date())-1,DateDiff("yyyy",Fødselsdag,Date()))>=FraÅr And IIf(DateSerial(Year(Date()),Month(Fødselsdag),Day(Fødselsdag))>Date(),DateDiff("yyyy",Fødselsdag,Date())-1,DateDiff("yyyy",Fødselsdag,Date()))<=TilÅr,1,0),0)) AS Mænd, Sum(IIf(Køn="Kvinde",IIf(IIf(DateSerial(Year(Date()),Month(Fødselsdag),Day(Fødselsdag))>Date(),DateDiff("yyyy",Fødselsdag,Date())-1,DateDiff("yyyy",Fødselsdag,Date()))>=FraÅr And IIf(DateSerial(Year(Date()),Month(Fødselsdag),Day(Fødselsdag))>Date(),DateDiff("yyyy",Fødselsdag,Date())-1,DateDiff("yyyy",Fødselsdag,Date()))<=TilÅr,1,0),0)) AS Kvinder
FROM Aldersperioder, Fødselsdage
GROUP BY FraÅr, TilÅr;
Avatar billede mugs Novice
22. februar 2005 - 20:19 #12
Eller sådan som et udtryk i forespørgslen:

Udtryk3: IIf(Right([cprnr];1) Mod 2=0;"K";"M")

Og sådan kan vi blive ved ;o)
Avatar billede kjulius Novice
22. februar 2005 - 20:25 #13
Ja, god idé :-)
Men er der ikke noget om, at man er ved at "smide" modulus tjekket på CPR-numrene fordi man ønsker mere plads?
Det synes jeg, at jeg har hørt noget om.
Hvorvidt det så også betyder, at man ikke længere kan identificere kønnet ud fra CPR-nummeret, ved jeg selvfølgelig ikke. Det hænger jo ikke nødvendigvis sammen.
Avatar billede mugs Novice
22. februar 2005 - 20:32 #14
Jo det er korrekt, om 2½ år tilføjes endnu et ciffer til CPR. Men det berører kun valideringen (og det er jo slemt nok i sig selv) af CPR. dette er ikke en validering af CPR, men checker blot og mod 2 på det sidste ciffer er 0. Når det 11. ciffer kommer på, kan man blot bruge Mid i stedet for Right:

Udtryk4: IIf(Mid([cprnr];9;1) Mod 2=0;"K";"M")
Avatar billede mugs Novice
22. februar 2005 - 22:24 #15
Og en kommentar fra spørgeren ville da være velkommen ;o)
Avatar billede crazy_zim Nybegynder
22. februar 2005 - 23:23 #16
Det er en meget fin diskussion i har kørende og jeg skal lige have lidt tid til at se om jeg kan få nogle af jeres ideer implementeret, så der går nok et par dage inden jeg har fået tygget mig igennem det.
Avatar billede kjulius Novice
04. marts 2005 - 23:26 #17
Hvordan har gummerne det efter de sidste dages tyggeri? :-)

Hvis der er noget mere vi kan hjælpe med, må du jo sige til...
Avatar billede crazy_zim Nybegynder
09. marts 2005 - 02:31 #18
Meget meget ømme :-)
Tjah, jeg er ikke kommet så meget videre. Har prøvet lidt frem og tilbage, men har ikke kunnet finde en løsning.
Hvordan kan man bedst få access til at lave en beregning for hver post i databasen, dvs. løbe posterne igennem fra top til bund?
Kan man lave en DO WHILE løsning eller en FOR sætning.
Noget i stil med
Så længe man ikke er nået til EOF lav aldersberegning (if resultat = .... osv) gå til næste post.
Eller kan man tilføje et nyt felt til tabellen, f.eks. alder og få programmet til at beregne personernes alder og derefter lave en query der finder hvor mange personer hvis alder ligger indenfor bestemte intervaller.
Avatar billede mugs Novice
09. marts 2005 - 05:31 #19
Indsæt dette i et modul:

If DateSerial(Year(Date), Month(Dato), Day(Dato)) > Date Then
Alderberegning = DateDiff("yyyy", Dato, Date) - 1
Else
Alderberegning = DateDiff("yyyy", Dato, Date)
End If

Funktionen skal hedde:

Alderberegning

I en forespørgsel sætte du markøren i en ny tom kolonne og indsætter flg.:

Udtryk1: Alderberegning([fødselsdag])

Nju vil forespørgslen beregne alderen hver du indtaster en fødselsdag i feætet fødselsdag i forespørgslen.

Du skal altså ikke have nogle ekstra felter i tabellen.Jeg har afprøvetr funktionen i en db, jeg kan sende dig den i eftermiddag når jeg er hjemme fra arbejde. Blot læg din e-mail.
Avatar billede crazy_zim Nybegynder
09. marts 2005 - 07:37 #20
me_the_zim@hotmail.com
Avatar billede mugs Novice
09. marts 2005 - 08:43 #21
Sendt.
Avatar billede mugs Novice
09. marts 2005 - 13:37 #22
Og kommet retur igen, da mailen ikke kunne leveres. Hva' nu?
Avatar billede kjulius Novice
10. marts 2005 - 01:03 #23
Jeg har også prøvet at sende en db med eksempler (som en lille zip fil på 60 KB). Håber jeg har bedre held end mugs...
Avatar billede kjulius Novice
10. marts 2005 - 18:11 #24
Og det ser ud til at den er gået igennem...

Er det noget du kan bruge, crazy?
Avatar billede crazy_zim Nybegynder
11. marts 2005 - 11:48 #25
Tak for de tilsendte databaser. Kjulius´s passede bedst, der skulle lige et par tilretninger til, så fungerede den fint.
Tak til jer begge.
Det er nok ikke sidste gang jeg får brug for hjælp, så jeg vender nok frygteligt tilbage en anden gang.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester