Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 13:38 Der er 47 kommentarer og
1 løsning

Cpr validator

Jeg har lavet følgende script men den fejler i Line 9

Er der nogen der kan finde ud af hvad der er galt ?

<%
Function CPROK(Streng)
  Dim Nummer, Sum
  Nummer = Trim(Replace(Streng, "-", ""))
  If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function
  Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1)
  Sum = 0
  For i = 0 To 9
      Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i)
  Next
  If Sum Mod 11 = 0 Then CPROK = True
End Function

If CPROK("250342-1247") Then
  Response.Write "Gyldigt CPR"

  If CInt(Mid(Nummer, 9, 1)) Mod 2 = 0 Then
  Response.Write "... og du er en <span style=""color: red"">kvinde</span>"
Else
  Response.Write "... og du er en <span style=""color: blue"">mand</span>"
End If

Else
  Response.Write "Ugyldigt!"
End If
%>
Avatar billede erikjacobsen Ekspert
25. oktober 2007 - 13:42 #1
Det løser ikke dit problem, ud over at du kan slette linien, men man skal generelt ikke længere køre med checksum-test: http://cpr.dk/cpr/site.aspx?p=23&t=ForsideVisartikel&Articleid=4347
Avatar billede nielle Nybegynder
25. oktober 2007 - 13:44 #2
Skyldes den fejlende kode ikke at du ikke har dim'et din Check?

Function CPROK(Streng)
    Dim Nummer, Sum
    Dim Check(9)
    Nummer = Trim(Replace(Streng, "-", ""))

    If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function

    Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1)
    Sum = 0
    For i = 0 To 9
        Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i)
    Next

    If Sum Mod 11 = 0 Then
        CPROK = True
    Else
        CPROK = False
    End If
End Function

Udover det er jeg 100 % enig i det problematiske ved at tjekke med modulus 11 mere...
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 13:45 #3
Jo desværre. Det er hvad opgaven lyder. Nogen gode forslag ?

Det skal siges jeg er meget grøn på dette område. jeg startede på det i mandags
Avatar billede softspot Forsker
25. oktober 2007 - 13:47 #4
Det er fordi du starter din indeksering i strengen Nummer ved 0 og i VBScrpt er det 1 som er første tegn i en streng...
Avatar billede w13 Novice
25. oktober 2007 - 13:47 #5
DJ_Jens85>> Er fejlmeddelelsen hemmelig? :)
Avatar billede softspot Forsker
25. oktober 2007 - 13:48 #6
Så du kan eksempelvis gøre således:

    For i = 0 To 9
        Sum = Sum + CInt(Mid(Nummer, i+1, 1)) * Check(i)
    Next

eller

    For i = 1 To 10
        Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1)
    Next
Avatar billede softspot Forsker
25. oktober 2007 - 13:50 #7
Desuden skal dette check nok også rettes fra:

  If CInt(Mid(Nummer, 9, 1)) Mod 2 = 0 Then

til:

  If CInt(Mid(Nummer, 10, 1)) Mod 2 = 0 Then
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 13:54 #8
w13>> Her :)

Siden kan ikke vises
Der er opstået et problem med den side, du forsøger at se, og siden kan ikke vises.

HTTP 500,100 - Intern fejl på serveren - ASP-fejl -
Internet Information Services

Tekniske oplysninger (for supportteknikere)

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A0005)
Procedurekaldet eller argumentet er ugyldigt: 'Mid'
/cpr.asp, line 9
Avatar billede fennec Nybegynder
25. oktober 2007 - 13:56 #9
Noget helt andet er hvad du skal bruge det til...

Du kan ALDRIG kræve at en person skal oplyse fuldt person nummer (de sidste 4 cifre). Det er vist kun banker og kommunen/staten der må det (mener ikke engang politiet har krav på det)
Avatar billede w13 Novice
25. oktober 2007 - 13:56 #10
Hjælper Softspots løsning dig?
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 13:57 #11
softspot>> Jeg har prøvet at tilrette dem men jeg for også fejl ved det ?
Avatar billede w13 Novice
25. oktober 2007 - 13:57 #12
Prøvede du også hans:

    For i = 1 To 10
        Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1)
    Next
Avatar billede w13 Novice
25. oktober 2007 - 13:58 #13
Og er det samme fejl?
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 13:58 #14
Fennec>> Det er en skoleopgave. Det skal ikke bruges til andet. Bare rolig =)

Jeg er bare blank derfor jeg spørger jer
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:00 #15
w13>> Skriver den bare Ugyldigt.
Avatar billede nielle Nybegynder
25. oktober 2007 - 14:02 #16
Brug hellere denne:

    For i = 0 To 9
        Sum = Sum + CInt(Mid(Nummer, i+1, 1)) * Check(i)
    Next

Og så skal Check stadig Dim'es.
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:05 #17
Nielle>> Nu kommer den bare frem med "Ugyldigt"
Avatar billede softspot Forsker
25. oktober 2007 - 14:06 #18
Rettede du begge steder (jf. 25/10-2007 13:50:16)?
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:07 #19
Okay vi starter lige forfra.

Hvis jeg nu f.eks godt kunne tænke mig at den skal Fra dagsdato kunne Udregne alle de gyldige cpr-numre som der kunne laves idag, hvordan skal den så se ud ?
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:07 #20
Softspot>> Ja det gjorde jeg =)
Avatar billede softspot Forsker
25. oktober 2007 - 14:11 #21
Hvordan ser din kode ud lige nu?

Den opgave du kaster op i luften 25/10-2007 14:07:24, er lidt anderledes end den du spørger om, så mon ikke vi bare skal løse spørgsmålet her...? ;-)
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:14 #22
Jeg ved godt at den er lidt anderledes, Men er det for besværligt ?
Kunne godt tænke mig den ændring nemlig, Hvis du selfølgelig vil hjelpe mig ?

Jamen efter din rådgivning ser min kode således ud

<%
Function CPROK(Streng)
  Dim Nummer, Sum
  Nummer = Trim(Replace(Streng, "-", ""))
  If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function
  Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1)
  Sum = 0
  For i = 0 To 9
      Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1)
  Next
  If Sum Mod 11 = 0 Then CPROK = True
End Function

If CPROK("250342-1247") Then
  Response.Write "Gyldigt CPR"

  If CInt(Mid(Nummer, 10, 1)) Mod 2 = 0 Then
  Response.Write "... og du er en <span style=""color: red"">kvinde</span>"
Else
  Response.Write "... og du er en <span style=""color: blue"">mand</span>"
End If

Else
  Response.Write "Ugyldigt!"
End If
%>
Avatar billede softspot Forsker
25. oktober 2007 - 14:17 #23
Du har glemt at rette løkkens grænseværdier. De skal rettes fra 0 og 9 til 1 og 10, altså:

  For i = 1 To 10
      Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1)
  Next
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:19 #24
Samme Meddelse "Ugyldig"
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:20 #25
Og således ser det ud

<%
Function CPROK(Streng)
  Dim Nummer, Sum
  Nummer = Trim(Replace(Streng, "-", ""))
  If Len(Nummer) <> 10 Or Not IsNumeric(CStr(Nummer)) Then Exit Function
  Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1)
  Sum = 0
  For i = 1 To 10
      Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1)
  Next
  If Sum Mod 11 = 0 Then CPROK = True
End Function

If CPROK("250342-1247") Then
  Response.Write "Gyldigt CPR"

  If CInt(Mid(Nummer, 10, 1)) Mod 2 = 0 Then
  Response.Write "... og du er en <span style=""color: red"">kvinde</span>"
Else
  Response.Write "... og du er en <span style=""color: blue"">mand</span>"
End If

Else
  Response.Write "Ugyldigt!"
End If
%>
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:24 #26
Jeg tror der er et eller andet helt galt med mit script.
Avatar billede softspot Forsker
25. oktober 2007 - 14:27 #27
Og du er sikker på at det CPR-nr du kontrollerer er gyldigt? ;-)

Desuden skal du sørge for at returnere et veldefineret resultat fra din funktion, inden du afslutter den. Der er mindst 2 veje igennem din funktion som ikke returnerer noget. Det kan godt være VBScript tillader dette, men der er andre sprog hvor dette ikke er tilladt, så tillæg dig nogle gode vaner fra starten :-)

Du kan f.eks. starte med at sætte CPROK = false, inden du begynder at manipulere parameteren Streng.
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:32 #28
Jeg ved godt alt det her lyder meget forvirret, men jeg er blevet kastet ind i det her og har kun haft det i 3 ½ dag. alt dette er nyt for mig. Var der en mulighed for du kunne hjælpe mig lidt. f.eks hvis du selv kunne tjekke det ?
Avatar billede softspot Forsker
25. oktober 2007 - 14:40 #29
Prøv at checke dit eget CPRnr med den funktion - det burde jo være gyldigt ;-)

Hvis den stadig melder "ugyldig", så er der nok noget i vejen med kontrol-tallene...
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 14:44 #30
Melder fejl i linie 17

If CInt(Mid(Nummer, 10, 1)) Mod 2 = 0 Then
Avatar billede softspot Forsker
25. oktober 2007 - 14:52 #31
Ja, det er fordi Nummer ikke er defineret i det scope hvor du refererer til den. Prøv lige denne version af kode i stedet (det hele skal udskiftes):

<%
Function CPROK(Streng)
  Dim Nummer, Sum, Check, i

  CPROK = false
  Nummer = Trim(Replace(Streng, "-", ""))

  If Len(Nummer) <> 10 Or Not IsNumeric(Nummer) Then Exit Function

  Check = Array(4, 3, 2, 7, 6, 5, 4, 3, 2, 1)

  Sum = 0
  For i = 1 To 10
      Sum = Sum + CInt(Mid(Nummer, i, 1)) * Check(i-1)
  Next

  If Sum Mod 11 = 0 Then CPROK = True
End Function

cprnr = "250342-1247"

If CPROK(cprnr) Then
  Response.Write "Gyldigt CPR"

  If CInt(Mid(cprnr, 10, 1)) Mod 2 = 0 Then
    Response.Write "... og du er en <span style=""color: red"">kvinde</span>"
  Else
    Response.Write "... og du er en <span style=""color: blue"">mand</span>"
  End If

Else
  Response.Write "Ugyldigt!"
End If
%>
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 15:06 #32
Det fungere nu. Det var cpr-numret den var galt med. og jeg kan se ud fra beregningen at den er helt gal :P Den siger jeg er en kvinde... Men det er nu en lettere sag at ordne. Men for at vende tilbage til mit andet spørgsmål med Hvis jeg ønsker at udskrive alle de gyldige cpr-numre for pågældende dag ? var det noget du ville hjælpe mig med ?

Ellers skal du have tak for din hjælp :-)
Avatar billede softspot Forsker
25. oktober 2007 - 15:11 #33
Ja, det med kvinde/mand, det er givetvis fordi det næstsidste tal i dit CPRnr er et lige tal. Da cprnr indeholder en bindestreg er det jo det 11. tegn du skal kontrollere og ikke det 10.

Mht. til genereringen af cprnumre, så har jeg ikke lige tid til at sætte mig ind i hvordan det skal beregnes, så hvis du selv kan flikke et forslag sammen, hvor reglerne fremgår, så kan jeg muligvis hjælpe dig med at gøre den færdig (det er jo din opgave, ikke sandt? ;-)).
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 15:23 #34
Selvfølgelig er det det :-)

Jeg har allerede lavet lidt af det hvis du vil se på det. har ikke den fjerneste idé om det er noget der fungere endnu..

<%
Dim check, A(9), Dato
Dato = "251007"
Check = Array (4, 3, 2, 7, 6, 5, 4, 3, 2)
A(0) = mid(Dato,1,1)
A(1) = mid(Dato,2,1)
A(2) = mid(Dato,3,1)
A(3) = mid(Dato,4,1)
A(4) = mid(Dato,5,1)
A(5) = mid(Dato,6,1)
A(6) = mid(Dato,7,1)
A(7) = mid(Dato,8,1)
    For x 0 to 999
        if x < 100 then
        a(8)="0"
       
        if x < 10 then
        a(9)="0"
       
   
        next
       
       
       
       
        %>
Avatar billede softspot Forsker
25. oktober 2007 - 15:36 #35
Jeg tror vist lige du skal have lov til at arbejde lidt mere med den der... ;-)

Tak for point :)
Avatar billede dj_jens85 Nybegynder
25. oktober 2007 - 15:44 #36
Det er jeg også ret sikker på jeg skal. Syntes bare det er meget svært, da jeg ikke har haft noget erffaring med det og så bliver kastet ud i sådan en opgave :)

Jamen det var så lidt, Det er dig jeg skal takke for den gode Tålmodighed, med dumme spørgsmål.
Avatar billede softspot Forsker
25. oktober 2007 - 15:56 #37
Ingen spørsgmål er dumme (første gang de bliver stillet :-)).

En simpel løsning (men ikke nødvendigvis den mest effektive) var at kalde din egen funktion CPROK med hver af det 9000 kombinationer af dags dato og de fire cifre og så bare udskrive dem der er valide. Men jeg er sikker på at det ikke er det der er menigen med opgaven, så det går nok ikke med mindre du også leverer den "rigtige" løsning... :-)

Response.Write("Valide CPR-numre:<br>")
idag = "251007"
for i = 1000 to 9999
  checkcprnr = idag & "-" & i
  if cprok(checkcprnr) then
    Response.Write(checkcprnr & "<br>)
  end if
next
Avatar billede erikjacobsen Ekspert
25. oktober 2007 - 18:04 #38
9000?
Avatar billede softspot Forsker
25. oktober 2007 - 21:34 #39
erikjacobsen >> Er det tilladt at have cifre der starter med nul i de sidste 4?
Avatar billede nielle Nybegynder
25. oktober 2007 - 21:43 #40
Avatar billede softspot Forsker
25. oktober 2007 - 21:47 #41
OK, men så 10000 da, men rutinen bliver nu ikke ret meget forskellig fra den med 9000 :-)
Avatar billede softspot Forsker
25. oktober 2007 - 21:48 #42
Men for en god orden skyld:

Response.Write("Valide CPR-numre:<br>")
idag = "251007"
for i = 0 to 9999
  checkcprnr = idag & "-" & right("0000" & i, 4)
  if cprok(checkcprnr) then
    Response.Write(checkcprnr & "<br>)
  end if
next
Avatar billede erikjacobsen Ekspert
25. oktober 2007 - 22:30 #43
Og som linket i første kommentar siger, så kan vi vel egentlig bare slette

  if cprok(checkcprnr) then

og gøre 251007-0000 til 251007-9999 til lovlige cpr-numre. Ja, ok, det er en skoleopgave, men så må du fortælle dine lærere, at den netop er blevet for gammel ;)
Avatar billede softspot Forsker
25. oktober 2007 - 22:42 #44
Ja, men det er sq nok ikke så vigtigt om det er en rutine til CPRnr-check eller beregning af fibonachi - det er nok metodikken der er interessant ;-)
Avatar billede nielle Nybegynder
26. oktober 2007 - 06:50 #45
Muligvis, men den med at lave CPR validering ser man stadig gang på gang uanset at folk faktisk har været advaret af CPR registeret selv i en del år efterhånden.

Lærene har derfor et job med at gøre deres egne studerende klar over det...
Avatar billede dj_jens85 Nybegynder
26. oktober 2007 - 17:24 #46
Hej igen:-)

Jeg fik delvist lavet min opgave færdig og den kom til at se helt anderledes ud end dette resultat. jeg kan lige sende det til jer når jeg kommer på min bærbar. den er slet ikke færdig med den er accepteret :-)

Nielle>> Læren er godt klar over det. Det var bare en opgave vi skulle lave for at vise vi kunne skrive sproget. Ikke fordi det skulle være brugbart i den forstand bagefter.
Avatar billede nielle Nybegynder
26. oktober 2007 - 21:38 #47
Ikke særligt pædagogisk hvis læreren så ikke også fortæller det. :^)
Avatar billede dj_jens85 Nybegynder
28. oktober 2007 - 13:52 #48
Det kan man jo selv læse :P
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
Kurser inden for grundlæggende programmering

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