Fórum Validação do número de registro de CNH #354889
06/03/2008
0
Já pesquisei em tudo que é forum e não encontrei uma solução definitiva para o cálculo dos Dígitos Verificadores do Registro de CNH.
O número tem 11 dígitos e os 2 últimos são os DV.
Peguei algumas idéias mas não atendem 100¬ dos números, principalmente os que terminam em ´00´.
Se alguem puder dar uma ajuda, ficarei grato.

Cps.art
Curtir tópico
+ 0Post mais votado
27/03/2013
FUNCTION VRegCnh(PVRegCnh : string) : string; stdcall;
var
j, Mult, Soma, Digito1, Digito2, Incr_dig2: integer;
CNH_Forn, Dig_Forn, Dig_Enc : string;
begin
Result := F;
if length(Trim(PVRegCnh)) < 11 then
Exit;
CNH_Forn := Copy(PVRegCnh,1,9);
Dig_Forn := Copy(PVRegCnh,10,2);
Incr_Dig2 := 0;
Soma := 0;
Mult := 9;
for j := 1 to 9 do
begin
Soma := Soma + (StrToInt(CNH_Forn[j]) * Mult);
Mult := Mult - 1;
end;
Digito1 := Soma Mod 11;
if Digito1 = 10 then
begin
Incr_Dig2 := - 2;
end;
if Digito1 > 9 then
begin
Digito1 := 0;
end;
Soma := 0;
Mult := 1;
for j := 1 to 9 do
begin
Soma := Soma + (StrToInt(CNH_Forn[j]) * Mult);
Mult := Mult + 1;
end;
if (Soma Mod 11) + Incr_Dig2 < 0 then
begin
Digito2 := 11 + (Soma Mod 11) + Incr_Dig2;
end;
if (Soma Mod 11) + Incr_Dig2 >= 0 then
begin
Digito2 := (Soma Mod 11) + Incr_Dig2;
end;
if Digito2 > 9 then
begin
Digito2 := 0;
end;
Dig_Enc := IntToStr(Digito1)+IntToStr(Digito2);
if Dig_Forn = Dig_enc then
begin
Result := V;
end;
if Dig_Forn Dig_enc then
begin
Result := F;
end;
end;
Clovis Perazza

Gostei + 1
Mais Posts
06/03/2008
Onjahyr
Se puder enviar e-mails também poderemos unir as forças (envie para diversos estados, pois se um não souber o outro pode saber)...
Blz.
Gostei + 0
06/03/2008
Cps.art
Vou tentar, se conseguir alguma coisa coloco aqui neste tópico.
Gostei + 0
09/03/2008
Asales
Você já tem a função ou parte da função pronta para testar? Se tiver poste aqui.
Para quem se interessar este é o link para download do documento que regulamenta o documento de cnh:
http://www.denatran.gov.br/download/Resolucoes/resolucao_192_06.doc
Gostei + 0
10/03/2008
Onjahyr
18. CÓDIGO NUMÉRICO DE VALIDAÇÃO: com 11 (onze) dígitos gerados a partir de algoritmo específico e de propriedade do DENATRAN, composto pelos dados individuais de cada CNH, permitindo a validação do documento;
=============================================
Art. 2º. O documento de Habilitação terá 2 (dois) números de identificação nacional e 1 (um) número de identificação estadual, que são:
I – o primeiro número de identificação nacional – Registro Nacional, será gerado pelo sistema informatizado da Base Índice Nacional de Condutores – BINCO, composto de 9 (nove) caracteres mais 2 (dois) dígitos verificadores de segurança, sendo único para cada condutor e o acompanhará durante toda a sua existência como condutor, não sendo permitida a sua reutilização para outro condutor.
II – [b:222657da1c]o segundo número de identificação nacional – Número do Espelho da CNH, será formado por 8 (oito) caracteres mais 1 (um) dígito verificador de segurança, autorizado e controlado pelo órgão máximo executivo de trânsito da União, e identificará cada espelho de CNH expedida.[/b:222657da1c]
a) [b:222657da1c]O dígito verificador será calculado pela rotina denominada de “módulo 11” e sempre que o resto da divisão for zero (0) ou um (1), o dígito verificador será zero (0); [/b:222657da1c]
III – o número de identificação estadual será o número do formulário RENACH, documento de coleta de dados do candidato/condutor gerado a cada serviço, composto, [b:222657da1c]obrigatoriamente, por 11 (onze) caracteres, sendo as duas primeiras posições formadas pela sigla da Unidade de Federação expedidora, facultada a utilização da última posição como dígito verificador de segurança.[/b:222657da1c]
Gostei + 0
10/03/2008
Cps.art
Não montei a função ainda, só estou fazendo testes no Excel para descobrir a forma de calcular esses DVs.
A CNH tem 2 números, 1 em preto, na vertical do lado esquerdo da foto e no verso do lado esquerdo da assinatura do delegado, e é chamdo de ´ESPELHO´, o outro fica abaixo da foto, em vermelho e é chamado de ´REGISTRO´.
O primeiro tem 8 dígitos e um DV, e a informação da letra a) da Res. do Denatran ([b:25f0df1472]O dígito verificador será calculado pela rotina denominada de “módulo 11” e sempre que o resto da divisão for zero (0) ou um (1), o dígito verificador será zero (0); [/b:25f0df1472]), tambem está furada para o DV do espelho, pois tem espelho com DV 1, o que não poderia acontecer.
Já o segundo número, o REGISTRO, que tem 2 DVs, na maioria dos casos consegui uma forma de validar, porem, para os números que tem DVs ´00´, a mesma regra não se aplica, e para DVs ´01, 02, 03....09´, em alguns casos tambem não.
Trabalho no Detran aqui na minha cidade e cuido do setor de CNH.
Estou tentando montar um sisteminha de protocolo digital para a agencia do Detran aqui da minha cidade, e um para as Auto-Escolas pra agendamento de Provas (Teórica e Prática) para evitar excesso de digitação desnecessária, ou seja, elas me passariam o agendamento em disquetes, e eu compilaria tudo num BD para controle de aprovações e de novos agendamentos, e para isso eu preciso que os números de REGISTRO, assim como CPF e RENACH, fossem validados na digitação para evitar erros.
O CPF e o RENACH não tem problema, mas esse do REGISTRO não há meio de descobrir.
O Denatran não fornece o algorítimo, e não sei porque fazem tanto segredo, se a própria RECEITA FEDERAL forneceu o do DV do CPF e CGC.
Fica então a nosso cargo descobrir isso, mesmo que seja pra auxiliar no próprio serviço do Detran.
Não dá pra entender o que se passa na cabeça desse povo.
Mas vamos tentando que descobriremos.
Abraços.
Gostei + 0
11/03/2008
Asales
já que vc está utilizando o Excel vc viu este post no link abaixo?
Ele traz duas funções em VBA para validação dos números presentes na CNH.
Se funcionar poste aqui porque fica mais fácil convertê-los para Pascal.
http://forumaccess.com/eve/forums/a/tpc/f/273606921/m/8751053512
Gostei + 0
11/03/2008
Cps.art
Já tinha visto esse forum sim.
Já testei o algoritimo que o Mc Feba utiliza e acontece o que eu disse acima, os DVs terminados em ´[b:d87629c409]00[/b:d87629c409]´ não validam, assim como alguns terminados em ´[b:d87629c409]01, 02......08, 09[/b:d87629c409]´.
Na função dele, quando o [b:d87629c409]Resto = 0 ou Resto = 1, o Resto será 0[/b:d87629c409].
Só isso já invalida o algorítimo, pois tem numeros que tem o último dígito igual a [b:d87629c409]1[/b:d87629c409].
Vamos continuar tentando.
Abraços.
Gostei + 0
03/07/2009
Cps.art
Nada ainda?
Até hoje não consegui nada.
O próprio Detran nem responde meus emails.
Cambada de safados!!!!
Acho que o chefe do Detran do estado de São Paulo não sabe nem o que é CNH.
Se falarem a sigla CNH pra ele, é capaz de pensar que é alguma doença contagiosa, imaginem se ele vai saber o que é ´algoritimo para cálculo de DV de CNH´.
Vai achar que é alguma organização terrorista.
Essas instituições do estado são uma merda mesmo.
Mas vou continuar tentando.
Abraços.
Gostei + 0
04/07/2009
José Henrique
http://delphiforall.blogspot.com/2008/09/algortimo-para-validao-de-cnh.html
Gostei + 0
04/07/2009
Cps.art
Mas não funciona para todos os números.
Tem número de registro de CNH com dígito 1 (um), então se aplicarmos:
[b:d9a37c2f07]Conta := (Soma div 11) * 11;
if (Soma - Conta) < 2 then
Dv := 0
else
Dv := 11 - (Soma - Conta);[/b:d9a37c2f07]
já percebe-se que nunca vai se encontrar o dígito 1.
Vamos continuar tentando.
Gostei + 0
06/07/2009
Emerson Nascimento
1 2 3 4 5 | Conta := (Soma div 11) * 11; if (Soma - Conta) < 2 then Dv := 0 else Dv := 11 - (Soma - Conta); |
NUNCA VAI ENCONTRAR O DÍGITO 1 ?????
sua afirmação está equivocada.
vamos utilzar uma variável para ilustrar melhor:
1 2 3 4 5 6 | Conta := (Soma div 11) * 11; DVx := Soma - Conta; if DVx < 2 then Dv := 0 else Dv := 11 - DVx; |
não há qualquer alteração no código, exceto a atribuição da variável, certo? então...
se DVx resultou em 0 ou 1, Dv será 0.
se DVx resultou em 5, então Dv será 6.
se DVx resultou em 10, qual será o valor de Dv??? tchanammmm.... 1 !!!
de qualquer modo, pulblique alguns números de CNH que você não conseguiu validar com os algoritmos que você encontrou.
Gostei + 0
06/07/2009
Emerson Nascimento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | function ValidaCNH(sCNH: string; lExibeMsg: boolean): boolean; const String1 = ´090807060504030201´; String2 = ´100908070605040302´; var i,j,Digito: byte; Controle, DigitoInformado: string[2]; StringX: string; Soma: smallint; begin sCNH := Copy(´00000000000´+Trim(sCNH),(Length(Trim(sCNH))+11)-10,11 ); Controle := ´ ´; DigitoInformado := Copy( sCNH,10,2 ); StringX := String1; if sCNH <> ´00000000000´ then for i := 1 to 2 do begin Soma := 0; if i = 2 then StringX := String2; for j := 1 to 9 do Soma := Soma + ( StrToInt(sCNH[j]) * StrToIntDef( Copy( StringX,j+(j-1),2 ),0 ) ); Digito := Soma Mod 11; if Digito >= 10 then Digito := 0; Controle[i] := IntToStr( Digito )[1]; end; Result := Controle = DigitoInformado; if not Result and lExibeMsg then Application.MessageBox(´Número de CNH inválido!´,´Atenção´,mb_TaskModal + mb_IconWarning); end; |
Gostei + 0
06/07/2009
Cps.art
Prestando mais atenção no código, percebi meu erro.
Mas a função completa que está no link:
http://delphiforall.blogspot.com/2008/09/algortimo-para-validao-de-cnh.html
não funciona.
Vamos falar da CNH nova, com 11 dígitos no seu número de registro.
Naquela função, a linha que contem [b:9122dbfc90]Digito := StrToInt(CnhN[10]);[/b:9122dbfc90], está errada, deveria ser [b:9122dbfc90]Digito := StrToInt(CnhN[11]);[/b:9122dbfc90], mas mesmo fazenda essa alteração, tambem não funciona.
Tome como exemplo esse número de CNH: [b:9122dbfc90]02650306461[/b:9122dbfc90].
É o número de minha CNH, válido portanto.
Tente validar esse número com a função do link, alterando a linha que citei acima, depois poste o resultado.
Quanto a essa outra função que você postou, ainda não testei, mas parece ser mais coerente.
Obrigado pela dica, e vão me desculpando por alguma gafe minha, pois sou um iniciante e só pretendo aprender com vocês, e colaborar se me for possível.
Abraços.
Gostei + 0
07/07/2009
Cps.art
Teste com o número da CNH que passei no post anterior.
Só valida como verdadeira se alterarmos o último digito (1), por 0(zero).
Vou postar aqui uns 20 números de CNH válidos para testarmos.
Vamos ver se conseguiremos achar esse bendito algoritimo do Detran.
Abraços.
Gostei + 0
07/07/2009
Emerson Nascimento
1 2 | if Digito >= 10 then Digito := 0; |
para:
1 2 | if Digito >= 10 then Digito := 1; |
mas para ter certeza seria necessário mais alguns numeros de CNH.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)