Avatar billede svaages Nybegynder
10. november 2008 - 15:37 Der er 13 kommentarer og
1 løsning

Udregne alder fra CPR nr

Hejsa.
Jeg har læst og forsøgt flere af eksemplerne herude, men jeg kan ikke få det til at virke.
Jeg skal bruge en metode at udregne, og liste alderen på mine brugere, ud fra deres CPR numre. (eks. 0101072351)
Tabel: brugere
Feltnavn: cpr_nr
datatype: tekst
Avatar billede mugs Novice
10. november 2008 - 15:47 #1
Indsæt denne i et modul:


Function BeregnAlderFraCPRNR(cprnr As String) As Long
On Error Resume Next
Dim TestSum  As Long
Dim Fødselsdato As Date
Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, F As Integer, G As Integer, H As Integer, i As Integer, j As Integer
Dim Aar As Integer, Mdr As Integer, Dag As Integer, Aarhundred As Integer
CPRNRNR = Replace(CPRNRNR, "-", "")
a = Mid(cprnr, 1, 1)
b = Mid(cprnr, 2, 1)
c = Mid(cprnr, 3, 1)
d = Mid(cprnr, 4, 1)
e = Mid(cprnr, 5, 1)
F = Mid(cprnr, 6, 1)
G = Mid(cprnr, 7, 1)
H = Mid(cprnr, 8, 1)
i = Mid(cprnr, 9, 1)
j = Mid(cprnr, 10, 1)
TestSum = (4 * a + 3 * b + 2 * c + 7 * d + 6 * e + 5 * F + 4 * G + 3 * H + 2 * i + j)
If (TestSum Mod 11) <> 0 Then
MsgBox "CPRNR nr '" & cprnr & "' er ugyldigt!" 
End If
On Error GoTo Except
Dag = Int(Mid(cprnr, 1, 1) + Mid(cprnr, 2, 1))
Mdr = Int(Mid(cprnr, 3, 1) + Mid(cprnr, 4, 1))
Aar = Int(Mid(cprnr, 5, 1) + Mid(cprnr, 6, 1))
Aarhundred = 0
Select Case G
Case 0 To 3: Aarhundred = 1900
Case 4
Select Case Aar
Case 0 To 36: Aarhundred = 1900
Case 37 To 99: Aarhundred = 2000
End Select
Case 5
Select Case Aar
Case 0 To 36: Aarhundred = 2000
Case 58 To 99: Aarhundred = 1800
End Select
Case 6
Select Case Aar
Case 0 To 36: Aarhundred = 2000
Case 58 To 99: Aarhundred = 1800
End Select
Case 7
Select Case Aar
Case 0 To 36: Aarhundred = 2000
Case 58 To 99: Aarhundred = 1800
End Select
Case 8
Select Case Aar
Case 0 To 36: Aarhundred = 2000
Case 58 To 99: Aarhundred = 1800
End Select
Case 9
Select Case Aar
Case 0 To 36: Aarhundred = 2000
Case 37 To 99: Aarhundred = 1900
End Select
End Select
Fødselsdato = DateSerial(Aarhundred + Aar, Mdr, Dag)
If DateSerial(Year(Date), Month(Fødselsdato), Day(Fødselsdato)) > Date Then
BeregnAlderFraCPRNR = DateDiff("yyyy", Fødselsdato, Date) - 1
Else
BeregnAlderFraCPRNR = DateDiff("yyyy", Fødselsdato, Date)
End If
Exit Function
Except:
BeregnAlderFraCPRNR = Null
End Function

Kald funktionen med denne:

Dim VARa As String
VARa = Me.cprnr
MsgBox Module1.BeregnAlderFraCPRNR(VARa)

Kontrollen af CPRNR er baseret på modulus 11 metoden som ikke længere er gældende i alle tilfælde.
Avatar billede svaages Nybegynder
11. november 2008 - 08:33 #2
Tak for den meget hurtige tilbagemelding.
Jeg er ikke ret god til access, så jeg bliver nød til at spørge.
Hvordan kalder jeg en funktion i en forespørgsel?
Avatar billede mugs Novice
11. november 2008 - 09:18 #3
Udtryk1: BeregnAlderFraCPRNR([CPRNR])

Hvor funktionens navn er BeregnAlderFraCPRNR og variablen CPRNR sendes til funktionen for beregning af alder.
Avatar billede svaages Nybegynder
11. november 2008 - 09:45 #4
Tak skal du have. Du er godt nok kvik. :-)
Hvis jeg bruger 'Udtryk1: BeregnAlderFraCPRNR([CPRNR])' spørger access efter Parameterværdi <<cprnr>>
Hvad gør jeg galt?
Avatar billede olebole Juniormester
11. november 2008 - 09:54 #5
<ole>

[CPRNR] symboliserer et CPR-nummer. Udskift [CPRNR] med det aktuelle CPR-nummer  =)

/mvh
</bole>
Avatar billede svaages Nybegynder
11. november 2008 - 10:00 #6
Hej.
CPR numrene skal den tage fra:
Tabel: brugere
Feltnavn: cpr_nr

Og ud fra det vise i forespørgslen, vise hvor gammel brugeren er.
Den skal vise hele min liste af brugere, med deres alder.
Avatar billede mugs Novice
11. november 2008 - 10:46 #7
Som olebole skriver skal CPRNR udskiftes med navnet på dit felt altså cpr_nr i både modul og funktionskald.

Når Access beder om parameterværdi, skyldes oftest, at Access ikke genkender feltnavnet, i dette tilfælde CPRNR.
Avatar billede svaages Nybegynder
11. november 2008 - 11:11 #8
:-)
Jeg er ked af at skulle spørge dumt.
Men hvordan gør jeg følgende:
Kald funktionen med denne:

Dim VARa As String
VARa = Me.cprnr
MsgBox Module1.BeregnAlderFraCPRNR(VARa)
Avatar billede mugs Novice
11. november 2008 - 11:17 #9
F.eks en kommandoknap. Men 11/11-2008 08:33:45 spørger du om, hvordan du kalder funktionen fra en forespørgsel. DEt svarede jeg på Kl. 11/11-2008 09:18:21. Men også der skal dy rette feltnavnet.
Avatar billede svaages Nybegynder
11. november 2008 - 11:50 #10
:-) :-) :-)
Det virker. 1000 tak for hjælpen, og tålmodigheden.
Jeg indsatte følgende i ud for Felt:
Alder: BeregnAlderFraCPRNR([cpr_nr])
Avatar billede mugs Novice
11. november 2008 - 12:29 #11
Tak for point.

Alder: BeregnAlderFraCPRNR([cpr_nr]): Lige nøjagtig sådan: Først navnet på den funktion du vil kalde efterfulgt af hvilket felt der skal beregnes på.
Avatar billede JoxXx Praktikant
15. oktober 2020 - 11:12 #12
Fin formel, svaages. Tak for den. (Jeg er her fordi, jeg har lavet den logik en gang, men har glemt at gemme den) :-D

Hvis formler skal bruges i forespørgsler bør man dog undgå Msgbox og andre funktioner, der afbryder udførslen.

Fejlhåndtering bør nok placeres inden du  splitter og evaluerer cpr-nummeret, da der f.eks. ved erstatnings cpr-numre (og helt almindelige fejlindtastning) kan forekomme bogstaver i cpr-numre, som vil få mod11 beregningen til at fejle.

Man kan, hvis man vil, disable mod11 beregningen selektivt ved at indføre en parameter mere i funktionskaldet (Boolean) som kan bruges til at skippe mod11 beregningen i koden.
Avatar billede JoxXx Praktikant
15. oktober 2020 - 11:14 #13
Sorry! Det var mugs, der skulle have haft credit for den ;-)
Avatar billede JoxXx Praktikant
16. oktober 2020 - 09:56 #14
NB: Mugs: der er byttet om på 2000 og 1900 i Case 4, hvilket giver negativ alder for den del. Hele funktionen skal nok gås efter med tættekammen.

Tjek: https://cpr.dk/media/17534/personnummeret-i-cpr.pdf
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