Validação do número de registro de CNH

06/03/2008

0

Olá pessoal.

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

Cps.art

Responder

Post mais votado

27/03/2013

A função de validação de números de registro de CNHs novas (com foto) vai abaixo:



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

Clovis Perazza
Responder

Mais Posts

06/03/2008

Onjahyr

Realmente, passei horas no Google procurando e no site do DETRAN e não encontrei nada. Enviei um e-mail ao DETRAN (setor de informática) Se receber alguma informação eu te passo....
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.


Responder

06/03/2008

Cps.art

Obrigado onjahyr.

Vou tentar, se conseguir alguma coisa coloco aqui neste tópico.


Responder

09/03/2008

Asales

cps.art,
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


Responder

10/03/2008

Onjahyr

Mas não informa diretamente como fazer o algorítmo:

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]


Responder

10/03/2008

Cps.art

Olá amigos.

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.


Responder

11/03/2008

Asales

cps.art,

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


Responder

11/03/2008

Cps.art

Olá pessoal.

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.


Responder

03/07/2009

Cps.art

E aí pessoal.

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.


Responder

04/07/2009

José Henrique

Achei esta rotina
http://delphiforall.blogspot.com/2008/09/algortimo-para-validao-de-cnh.html


Responder

04/07/2009

Cps.art

Eu já tinha visto essa rotina José Henrique.

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.


Responder

06/07/2009

Emerson Nascimento

Eu já tinha visto essa rotina José Henrique. 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:
Conta := (Soma div 11) * 11;
if (Soma - Conta) < 2 then
  Dv := 0
else
  Dv := 11 - (Soma - Conta);
já percebe-se que nunca vai se encontrar o dígito 1. Vamos continuar tentando.


NUNCA VAI ENCONTRAR O DÍGITO 1 ?????
sua afirmação está equivocada.

vamos utilzar uma variável para ilustrar melhor:
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.


Responder

06/07/2009

Emerson Nascimento

veja se este código funciona. acabei de montá-lo. testei apenas com dois números de registro de CNH:
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;



Responder

06/07/2009

Cps.art

Realmente [b:9122dbfc90]emerson.en[/b:9122dbfc90], me enganei qdo disse que não se encontraria dígito 1(um).
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.


Responder

07/07/2009

Cps.art

Olá [b:3609038ac3]emercon.en[/b:3609038ac3], a função que você postou e que verifica os 2 últimos dígitos da CNH, tambem não funciona.

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.


Responder

07/07/2009

Emerson Nascimento

ao que parece, basta alterar o trecho:
    if Digito >= 10 then
      Digito := 0;

para:
    if Digito >= 10 then
      Digito := 1;


mas para ter certeza seria necessário mais alguns numeros de CNH.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar