[AccessD] adding control number

MartyConnelly martyconnelly at shaw.ca
Sat Aug 27 00:19:22 CDT 2005


Just as a matter of interest this works to verify last digit on Canadian 
SIN Social Insurance number
Just pass first 8 digits in string ModulusAppend(lSIN, 10)
and you get 9'th check digit appended.
You could use for verifying ISBN numbers but need to handle additional 
 appending of -X in method

Gustav Brock wrote:

>Hi Pedro 
>
>Looks like a Modulus 10 check digit calculation.
>Below is a function that will do this for you in a maintainable way.
>
>Use it like this:
>
>strChk = Right(ModulusAppend("00327833", 10), Len("00327833"))
>
>/gustav
>
><code>
>
>Function ModulusAppend( _
>  ByVal strNumber As String, _
>  ByVal intModulus As Integer) _
>  As String
>
>' Appends a Modulus 10 or 11 check digit to strNumber.
>'
>' 1999-10-08. Cactus Data ApS, CPH.
>
>  Dim intC As Integer, intF As Integer, intN As Integer
>  Dim intL As Integer, intM As Integer, intT As Integer
>  Dim strNumCheck As String
>  Dim strNumChr   As String
>  Dim strNumClean As String
>  
>  ' Max. length of number.
>  intM = 32 - 1
>  
>  If intModulus = 10 Or intModulus = 11 Then
>    intL = Len(strNumber)
>    ' Remove non-digits.
>    For intN = 0 To intL - 1
>      strNumChr = Mid(strNumber, intN + 1, 1)
>      If (Asc(strNumChr) >= 48) And (Asc(strNumChr) <= 57) Then
>        strNumClean = strNumClean & strNumChr
>      End If
>    Next intN
>    strNumber = strNumClean
>    intL = Len(strNumber)
>  End If
>  
>  If intL > 0 And intL <= intM Then
>    For intN = 0 To intL - 1
>      intC = Val(Mid(strNumber, intL - intN, 1))
>      Select Case intModulus
>        Case Is = 10
>          intF = (1 + ((intN + 1) Mod 2))
>          intC = intF * intC
>          intC = Int(intC / 10) + (intC Mod 10)
>        Case Is = 11
>          intF = 2 + (intN Mod 6)
>          intC = intF * intC
>      End Select
>      intT = intT + intC
>    Next
>    Select Case intModulus
>      Case Is = 10
>        intC = intT - (intT Mod intModulus) + intModulus
>        strNumCheck = Format((intC - intT) Mod intModulus, "@")
>      Case Is = 11
>        intC = intModulus - (intT Mod intModulus)
>        Select Case intC
>          Case Is = 11
>            ' A check digit for this number cannot be calculated!
>            strNumber = vbNullString
>            intC = 0
>            Beep
>          Case Is = 10
>            intC = 0
>        End Select
>        strNumCheck = Format(intC, "@")
>    End Select
>    strNumber = strNumber & strNumCheck
>  Else
>    strNumber = "0"
>  End If
>  
>  ModulusAppend = strNumber
>
>End Function
>
></code>
>
>
>  
>
>>>>pedro at plex.nl 26-08-2005 11:11 >>>
>>>>        
>>>>
>Hello Group,
>
>I have an ID (text, because it begins with 00) that exist of 8
>numbers.
>I need to change this ID by removing the first 0, and by adding a extra
>control number.
>This control number can be calculated from this ID. This can be done by
>several query's. Is it possible to do in one query??
>
>For example.
>
>I have ID:  00327833
>
>Take the number of the odd positions:    0 3 7 3
>
>Place these numbers behind each other to make one number:    0373
>
>Multiply this number with 2:    0373 x 2 = 0746
>
>Count up the separate numbers from this last multiplication:    0 + 7 +
>4 + 6 = 17
>
>>From the original ID, take the even positions:    0 2 8 3
>
>Count up the separate numbers from the even positions with the sum of
>the last count up:    17 + 0 + 2 + 8 + 3 = 30
>
>The last number of the previous sum is the extra control number:    0
>
>>From the original ID, remove the first 0 and add the control number:  
> 03278330
>
>  
>

-- 
Marty Connelly
Victoria, B.C.
Canada






More information about the AccessD mailing list