Validatieregel voor BSN-nummers

Status
Niet open voor verdere reacties.

bartprins

Gebruiker
Lid geworden
11 jun 2009
Berichten
11
Is er iemand die misschien de validatieregel voor BSN-nummers heeft liggen in een expressie, of eventueel in een Afterupdate code Vb ?
Ik heb wel gezocht, maar loop eigenlijk alleen maar tegen een berg meldingen aan die gaan over sofinummers/bsnnummers in voorbeeld databases, maar dat gaat alleen maar over het invoermasker, ik zou ook graag de invoer willen valideren.

Groetjes

Bart Prins
 
Ik vond de volgende berekening op een aantal sites, dus het basisprincipe zal wel kloppen. Het gaat hier om de zg. Elf-regel, waarbij elk getal in de reeks wordt geëvalueerd, en een berekening hierop in het getal 0 moet eindigen.

Ik heb de regel geprobeerd te vertalen naar een functie. Ziet er ongeeer zo uit:

Function BSN(SOFI As Long)
Dim Check() As Integer, i As Integer, Waarde As Long, iLen As Integer, sWaarde As String

''Oorspronkelijke berekening
''(9*A + 8*B + 7*C + 6*D + 5*E + 4*F + 3*G + 2*H + (-1*I)) Rest 11 = 0
sWaarde = SOFI
If Len(sWaarde) <> 9 Then Exit Function

iLen = Len(sWaarde)
ReDim Preserve Check(iLen, 2)

For i = 1 To iLen
Check(i, 1) = Mid(SOFI, i, 1)
Check(i, 2) = Mid(SOFI, i, 1) * (10 - i)
Next i
For i = 1 To iLen - 1
Waarde = Waarde + Check(i, 2)
Next i
Waarde = Waarde + (-1 * UBound(Check))

BSN = Waarde Mod 11

End Function

De functie geeft de uitkomst van de berekening; door hem als Boolean te valueren, kun je true of false teruglezen.

Michel
 
Super

Hoi Michael,

Enorm bedankt voor de moeite, maar misschien dat je wat meer uitleg kan geven over het declareren als boolean, want ik ben nog een beetje een newbie binnen vb/access ?:eek:

alvast bedankt
 
Het volgende voorbeeld heb ik vertaald vanuit een Delphi code; hierbij wordt de uitkomst van de functie-aanroep CheckBSN als Waar of Niet-waar beoordeeld; bij Waar levert-ie -1 terug, bij Onwaar 0.
Het verschil met het vorige voorbeeld is, dat je As Boolean achter de functienaam zet, om aan te geven dat je een Ja/Nee antwoord wilt hebben.

Code:
Function CheckBSN(BSN As Long) As Boolean
Dim i As Integer, Check As Integer, Product As Integer

  Product = 0
  ' Laatste cijfer opslaan en strippen. Dit is de verificatie
  Check = BSN Mod 10
  BSN = BSN / 10
  i = 2
  Do While BSN > 0
    ' Volgende cijfer vermenigvuldigen met steeds 1 meer
    Product = Product + (BSN Mod 10) * i
    BSN = BSN / 10
    i = i + 10
  Loop
 
  CheckBSN = (Product Mod 11)

End Function

Je zet de functie(s) bij voorkeur in een Modules blad, dat je vanuit het VBA venster kunt maken met Invoegen, Module.
In een query kun je de functies dan terugvinden in de Opbouwfunctie voor Expressies (<Ctrl>+<F2>, in de groep Functies, en dan de groep onder Ingebouwde functies.

Je kunt een functie ook direct intypen in een queryveld, is vaak een stuk sneller. Als je veld Sofienummer heet luidt de formule: CheckBSN([Sofienummer]). Evenzo voor de andere functie.
Je kunt dit in de functie als volgt terugherleiden:
Function BSN(SOFI As Long)
Betekent: de functienaam (BSN heeft een invoerwaarde nodig van de gebruiker. De functie noemt deze invoer in het voorbeeld: SOFI

Zoals je ziet, zijn het twee totaal verschillende manieren van berekenen, in ik krijg als ik ze zelf uitprobeer, ook verwarrende gegevens terug.... :confused:

Niettemin, de bedoeling is nu hopelijk wat duidelijker.

Michel
 
bedankt

Hoi Michel,

Bedankt voor de uitgebreide uitleg, super ! ga het vanavond uitproberen, ik laat nog even weten hoe ik het gedaan heb.

Groetjes

Bart
 
Volgens mij zitten er wat foutjes in de code.
Dit werkt in ieder geval met de paar BSN die ik geprobeerd heb
Code:
Function CheckBSN(BSN As Long) As Boolean
    Dim i As Integer, Check As Integer, Product As Integer

    Product = 0
    ' Laatste cijfer opslaan en strippen. Dit is de verificatie
    Check = BSN Mod 10
    BSN = Fix(BSN / 10)
    i = 2
    Do While BSN > 0
        ' Volgende cijfer vermenigvuldigen met steeds 1 meer
        Product = Product + (BSN Mod 10) * i
        BSN = Fix(BSN / 10)
        i = i + 1
    Loop

    CheckBSN = (Check = (Product Mod 11))
End Function
 
Ik zal eens kijken wat jouw code bij mij doet; zoals ik al eerder zei, heb ik de code proberen te vertalen van Delphi naar VBA, en daar zitten toch een paar andere functies in.
Ach, met z'n tweeën weet je meer als alleen :D
Ik koppel nog wel terug wat-ie bij mij doet.

Michel
 
Ik heb de verbeterde versie tegen een bestand van 1154 legitieme SOFI nummers gehouden, en heb nu 1151 goedgekeurde, en 24 afgekeurde. Ik heb er in mijn testbestand uiteraard wel een paar verbouwd, dus ik verwachtte wel een paar foutjes, maar 24 lijkt mij net iets teveel, omdat het wel echte nummers zouden moeten zijn.

Heb ik weer iets om uit te zoeken...

Michel
 
Gebruik zelf deze:
Code:
Function fControleSofi(s As String) As Integer  '0=niet (meer) ingevuld  1=foutieve lengte   2=onjuiste getallen    3=is sofinummer
    Dim iSom                     As Integer
    Dim iTeller                  As Integer

    If Len(s) = 0 Then
        fControleSofi = 0
    ElseIf Len(s) <> 9 Then
        fControleSofi = 1
    Else
        For iTeller = 1 To 8
            iSom = iSom + ((10 - iTeller) * Val(Mid$(s, iTeller, 1)))
        Next iTeller
        If iSom = 0 Then
            fControleSofi = 2
        Else
            iSom = iSom - Val(Mid$(s, 9, 1))
            If iSom Mod 11 = 0 Then
                fControleSofi = 3
            Else
                fControleSofi = 2
            End If
        End If
    End If
End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan