JOÃO PAULO
não registrado
|
|
Postada em 20/07/2006 11:33 hs
alguem sabe me explicar Matematicamente como faz este calculo e não atraves de código em vb. é validação de CNPJ/CPF 'no module Public Formato, Numeros As String
Function Fu_consistir_CgcCpf(Vl_CgcCpf As String) ' Esta Rotina Devolverá True Se o Cgc/Cpf Informado For valido ' ou False Se o Cgc/Cpf Não For Correto
Fu_consistir_CgcCpf = False Dim VA_CgcCpf As String Dim VA_Digito As String Static Numero(15) As Integer Dim VA_Resto As Integer Dim VA_Resultado As Integer Dim VA_SomaDigito10 As Integer Dim VA_resto1 As Integer
VA_CgcCpf = Format(SóNumeros(Vl_CgcCpf), "@@@@@@@@@@@@@@") VA_Digito = Mid(VA_CgcCpf, 13, 2) 'frmCritica_CPCCGC.LblVerificador.Caption = VA_Digito
Numero(1) = Val(Mid(VA_CgcCpf, 1, 1)) Numero(2) = Val(Mid(VA_CgcCpf, 2, 1)) Numero(3) = Val(Mid(VA_CgcCpf, 3, 1)) Numero(4) = Val(Mid(VA_CgcCpf, 4, 1)) Numero(5) = Val(Mid(VA_CgcCpf, 5, 1)) Numero(6) = Val(Mid(VA_CgcCpf, 6, 1)) Numero(7) = Val(Mid(VA_CgcCpf, 7, 1)) Numero(8) = Val(Mid(VA_CgcCpf, 8, 1)) Numero(9) = Val(Mid(VA_CgcCpf, 9, 1)) Numero(10) = Val(Mid(VA_CgcCpf, 10, 1)) Numero(11) = Val(Mid(VA_CgcCpf, 11, 1)) Numero(12) = Val(Mid(VA_CgcCpf, 12, 1)) Numero(13) = Val(Mid(VA_CgcCpf, 13, 1)) Numero(14) = Val(Mid(VA_CgcCpf, 14, 1))
If Len(Trim(VA_CgcCpf)) > 11 Then ' Cgc Formato = Format(Numeros, "@@.@@@.@@@/@@@@-@@")
VA_Resultado = (Numero(1) * 5) + (Numero(2) * 4) _ + (Numero(3) * 3) + (Numero(4) * 2) _ + (Numero(5) * 9) + (Numero(6) * 8) + _ (Numero(7) * 7) + (Numero(8) * 6) + _ (Numero(9) * 5) + (Numero(10) * 4) + _ (Numero(11) * 3) + (Numero(12) * 2) ' Atribui para resto o resto da divisão ' de VA_resultado dividido por 11 VA_Resto = VA_Resultado Mod 11 If VA_Resto < 2 Then VA_resto1 = 0 Else VA_resto1 = 11 - VA_Resto End If If VA_resto1 <> Numero(13) Then Exit Function End If VA_Resultado = (Numero(1) * 6) + _ (Numero(2) * 5) + (Numero(3) * 4) + _ (Numero(4) * 3) + (Numero(5) * 2) + _ (Numero(6) * 9) + (Numero(7) * 8) + _ (Numero(8) * 7) + (Numero(9) * 6) + _ (Numero(10) * 5) + (Numero(11) * 4) + _ (Numero(12) * 3) + (Numero(13) * 2) ' Atribui para resto o resto da divisão ' de VA_resultado dividido por 11 VA_Resto = VA_Resultado Mod 11 If VA_Resto < 2 Then VA_resto1 = 0 Else VA_resto1 = 11 - VA_Resto End If If VA_resto1 <> Numero(14) Then Exit Function End If Else ' Cpf Formato = Format(Numeros, "@@@.@@@.@@@ - @@") VA_Resultado = (Numero(4) * 1) + (Numero(5) * 2) _ + (Numero(6) * 3) + (Numero(7) * 4) _ + (Numero(8) * 5) + (Numero(9) * 6) _ + (Numero(10) * 7) + (Numero(11) * 8) + (Numero(12) * 9) VA_Resto = VA_Resultado Mod 11
If VA_Resto > 9 Then VA_resto1 = VA_Resto - 10 Else VA_resto1 = VA_Resto End If 'frmCritica_CPCCGC.LblC1.Caption = VA_resto1 If VA_resto1 <> Numero(13) Then GoTo Sairr End If
VA_Resultado = (Numero(5) * 1) _ + (Numero(6) * 2) + (Numero(7) * 3) _ + (Numero(8) * 4) + (Numero(9) * 5) + _ (Numero(10) * 6) + (Numero(11) * 7) + _ (Numero(12) * 8) + (VA_resto1 * 9) VA_Resto = VA_Resultado Mod 11 If VA_Resto > 9 Then VA_resto1 = VA_Resto - 10 Else VA_resto1 = VA_Resto End If 'frmCritica_CPCCGC.LblC2.Caption = VA_resto1 If VA_resto1 <> Numero(14) Then Exit Function End If
End If
Fu_consistir_CgcCpf = True Exit Function Sairr: VA_Resultado = (Numero(5) * 1) _ + (Numero(6) * 2) + (Numero(7) * 3) _ + (Numero(8) * 4) + (Numero(9) * 5) + _ (Numero(10) * 6) + (Numero(11) * 7) + _ (Numero(12) * 8) + (VA_resto1 * 9) VA_Resto = VA_Resultado Mod 11 If VA_Resto > 9 Then VA_resto1 = VA_Resto - 10 Else VA_resto1 = VA_Resto End If 'frmCritica_CPCCGC.LblC2.Caption = VA_resto1 If VA_resto1 <> Numero(14) Then Exit Function End If
End Function Function SóNumeros(x As String) As String On Error Resume Next Dim temp As String Dim j As Integer temp = "" For j = 1 To Len(x) If Mid(x, j, 1) = "0" Or _ Mid(x, j, 1) = "1" Or _ Mid(x, j, 1) = "2" Or _ Mid(x, j, 1) = "3" Or _ Mid(x, j, 1) = "4" Or _ Mid(x, j, 1) = "5" Or _ Mid(x, j, 1) = "6" Or _ Mid(x, j, 1) = "7" Or _ Mid(x, j, 1) = "8" Or _ Mid(x, j, 1) = "9" Then
temp = temp + Mid(x, j, 1) End If Next Numeros = temp SóNumeros = temp End Function
'Para Chamar a Funcao ! 'If Fu_consistir_CgcCpf(MskCPF) = False Then ' MsgBox "Cpf Informado não é valido", 64 ' TxtCPF.SetFocus ' Exit Sub 'Else ' MskCPF.Text = Formato 'End If 'End Sub
'Utilizo em meus sistemas essa rotina e funciona muito bem :) 'Até Mais
|
|
|
|
|
|
|
|
Postada em 20/07/2006 11:37 hs
vixi , pra te explicar isso vai demorar bastante tempo heim
|
|
|
|
|
|
Postada em 20/07/2006 14:07 hs
|
|
|
|
|
|
Postada em 20/07/2006 22:06 hs
Olá, Esse algoritmo é chamado de algoritmo do módulo 11, pois fazemos uma divisão por 11 para obter os dígitos verificadores. O mesmo processo pode ser aplicado para a carteira de identidade do IFP, lembrando que nesse caso temos apenas 1 dígito verificador. Para validar o CNPJ ou o CPF, devemos recalcular os dígitos verificadores (os dois último dígitos que funcionam como uma espécie de CRC ou paridade). Se os dígitos verificadores conferirem com o cálculo, assumimos que o número é válido (o que não significa necessariamente que exista...) Bom, basicamente é o seguinte: Imagine o número 001627080001. Dispomos o número na primeira linha e abaixo, começamos do último número dispondo os algarismos de 2 a 9 para que cada um fique na mesma coluna de um único algarismo do número a ser verificado. Atingindo o 9, recomeçamos de 2. Veja só: 0 0 1 6 2 7 0 8 0 0 0 1 5 4 3 2 9 8 7 6 5 4 3 2 Depois, multiplicamos os número coluna a coluna e somamos o resultado. Depois dividimos o resultado por 11. O complemento em 11 do resto da divisão (isto é, 11 menos o resto) é o dígito verificador. Veja: 2 0 0 0 48 0 56 18 12 3 0 0 ------- 139 / 11 --------- 7 12 Como resto da divisão encontramos 7, esse é o primeiro dígito verificador. Depois, basta repetir o processo para os 12 números do CNPJ/CPF mais o dígito verificador e calcular o segundo dígito verificador. No exemplo, 0 0 1 6 2 7 0 8 0 0 0 1 7 6 5 4 3 2 9 8 7 6 5 4 3 2 14 3 0 0 0 56 0 63 4 18 4 0 0 ------ 162 / 11 8 14 Encontramos desta vez, 8. Então o número do CNPJ em questão seria 00.162.708/0001-78. Assim, basta comprar os dígitos calculados com os dígitos informados para validar o CNPJ. Eu tirei essa explicação de um livro de VB4 que eu tenho. Um abraço, sandro.
|
|
|
|
|
|
Postada em 20/07/2006 22:09 hs
Oi, Equeçi de um detalhe: se o resto da divisão for 10 ou 11, por definição o dígito verificador será 0. um abraço, Sandro.
|
|
|
|
|