USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic
Voltar
Autor Assunto:  Calculo Matemático
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

     
Cardoso G
Pontos: 2843 Pontos: 2843
PATOS DE MINAS
MG - BRASIL
Postada em 20/07/2006 11:37 hs            
vixi , pra te explicar isso vai demorar bastante tempo heim
     
ghost_jlp
Pontos: 2843 Pontos: 2843 Pontos: 2843 Pontos: 2843
SÃO PAULO
SP - BRASIL
Postada em 20/07/2006 14:07 hs            
     
Sandro
não registrado
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.
     
Sandro
não registrado
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.
     
Página(s): 1/1    


Seu Nome:

Seu eMail:

ALTERAR PARA MODO HTML
Mensagem:

[:)] = 
[:P] = 
[:(] = 
[;)] = 

HTML DESLIGADO

     
 VOLTAR

  



CyberWEB Network Ltda.    © Copyright 2000-2026   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página