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