Avatar billede wmtoole Nybegynder
04. november 2003 - 17:42 Der er 6 kommentarer og
1 løsning

Forbedring til: At udlede alder i år fra et cpr nr i format tekst

I spørgsmål http://www.eksperten.dk/spm/422929 fik jeg løst følgende problem (terry havde svaret):

Jeg har en database med et felt som indeholder cpr numre (alle 10 cifre i formatet: 113322-1134).
Jeg har behov for at finde alle personer som fx er lig med og over 50 år gamle.
Hvordan løser jeg problemet i en forespørgsel?

Jeg behøver nu en tilføjelse som bevirker at sql sætningen ikke medtager de personer hvor der er sat markering i Ja/nej feltet [Afmeldt Xyz].
D.v.s. [Afmeldt Xyz] = Falsk
- samt naturligvis stadig dem der er lig med og over 50 år gamle.
Avatar billede wmtoole Nybegynder
04. november 2003 - 17:44 #1
Det var nedenstående kode fra terry sdom løste mit første problem:

SELECT tblCprNumber.*, tblCprNumber.CPR, CDate(IIf(CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))<=Date(),CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2)),DateAdd("yyyy",-100,CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))))) AS Dt
FROM tblCprNumber
WHERE (((CDate(IIf(CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))<=Date(),CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2)),DateAdd("yyyy",-100,CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))))))<=DateAdd("yyyy",-50,Date())));
Avatar billede jkrons Professor
04. november 2003 - 17:46 #2
terry-> Just out of curiosity: How does your you code handle the problem that 180101-1234 can be both 1801-1901, and 1801-2001? Maybe its just me, but I cant figure it out from your code?
Avatar billede terry Ekspert
04. november 2003 - 18:28 #3
I have seen the question, will get back soon!
Avatar billede erikjacobsen Ekspert
04. november 2003 - 18:32 #4
Det kan nu ikke være fra 1801 da den ældste der har fået et personnummer
er fra ca. 1850. Men det kan være både 1901 og 2001. Man kan se reglerne
på http://www.cpr.dk/imagesupload/dokument/Skema%20over%20personnummerets%20opbygning.pdf
Avatar billede terry Ekspert
04. november 2003 - 18:44 #5
thanks for that link erikjacobsen, I'm sure I can make use of it on my travles :o)
Avatar billede terry Ekspert
04. november 2003 - 19:30 #6
jkron>I want aware that CPR numbers werefirst intoduced in DK ca. 1850, so I was lucky there :o)

Access isnt too smart when you try converting a two digit year to a date and I noticed that some dates were actually geting converted to greater than 2020 which obvioulsy cant be correct, so I subtract 100.

wmtoole>I havent checked this but try

SELECT tblCprNumber.*, tblCprNumber.CPR, CDate(IIf(CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))<=Date(),CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2)),DateAdd("yyyy",-100,CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))))) AS Dt
FROM tblCprNumber
WHERE (((CDate(IIf(CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))<=Date(),CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2)),DateAdd("yyyy",-100,CDate(Mid([CPR],1,2) & "/" & Mid([CPR],3,2) & "/" & Mid([CPR],5,2))))))<=DateAdd("yyyy",-50,Date() AND [Afmeldt Xyz] = -1)));


I'm not sure if you wnatto see those that are false or true in the result so if its wrong then alter

[Afmeldt Xyz] = -1
to
[Afmeldt Xyz] = 0
Avatar billede jkrons Professor
04. november 2003 - 22:02 #7
Another way is to put this function in a modulem, and then call it from a query. It calculates age from the cpr-number including century, (and btw your'e right about 1850, or rather 1858).

unction CprAlder(cpr As String) As Byte
'JKrons, 2002
'Finder fødsels-århundredet ud af
'et cpr-nummer på formen xxxxxx-xxxx
'Den virker kun indtil 2036, hvor cpr-nummersystemet i
'dets nuværende form ophører med at fungere
'se nærmere på www.cpr.dk
If Not IsNull(cpr) Then

    Dim bytCent As Byte
    Dim bytSevdig As Byte
    Dim bytCpryear As Byte
    Dim bytCprmonth As Byte
    Dim bytCprday As Byte
    Dim strErrtxt As String
    Dim datTemp As Date

   
    strErrtxt = "Der eksisterer ikke lovlige cpr-numre, hvor årstallet er "
    bytSevdig = Mid(cpr, 8, 1)
    bytCpryear = Mid(cpr, 5, 2)
    bytCprmonth = Mid(cpr, 3, 2)
    bytCprday = Mid(cpr, 1, 2)
   
    Select Case bytSevdig
        Case 0 To 3
            bytCent = 19
        Case 4, 9
            If bytCpryear <= 36 Then
                bytCent = 20
            Else
                bytCent = 19
            End If
        Case 5 To 8
            If bytCpryear <= 36 Then
                bytCent = 20
                ElseIf bytCpryear >= 58 Then
                bytCent = 18
                Else
                strErrtxt = strErrtxt & bytCpryear & " og 7. ciffer er " & bytSevdig
                MsgBox strErrtxt, vbOKOnly + vbCritical, "CPR-nummer fejl"
                Exit Function
            End If
           
    End Select

    datTemp = DateSerial(bytCent & bytCpryear, bytCprmonth, bytCprday)

    If datTemp > Date Then
        MsgBox "Den pågældende person er ikke født endnu", vbOKOnly + vbExclamation, "CPR-nummer fejl"
        Exit Function
    End If
   
    If Mid(datTemp, 7, 2) = 18 Then
        CprAlder = Right(DatePart("yyyy", Date - datTemp), 2) + 100
        Else
        CprAlder = Right(DatePart("yyyy", Date - datTemp), 2)
    End If
End If

End Function


Then use the function in your query, something like this

SELECT CPR, cpralder([cpr]) AS Alder, AfmeldtXYZ
FROM Tabel2
WHERE cpralder([cpr])>=50 AND Tabel2.AfmeldtXYZ=-1;
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