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