Função testa CNPJ
Olá pessoal, hoje é o dia das dúvidas né...
Bem eu tenho a seguinte função:
[color=red:4dd907be4f]function TestaCnpj(xCNPJ: String):Boolean;
Var
d1,d4,xx,nCount,fator,resto,digito1,digito2 : Integer;
Check : String;
begin
d1 := 0;
d4 := 0;
xx := 1;
for nCount := 1 to Length( xCNPJ )-2 do
begin
if Pos( Copy( xCNPJ, nCount, 1 ), ´/-.´ ) = 0 then
begin
if xx < 5 then
begin
fator := 6 - xx;
end
else
begin
fator := 14 - xx;
end;
d1 := d1 + StrToInt( Copy( xCNPJ, nCount, 1 ) ) * fator;
if xx < 6 then
begin
fator := 7 - xx;
end
else
begin
fator := 15 - xx; end;
d4 := d4 + StrToInt( Copy( xCNPJ, nCount, 1 ) ) * fator;
xx := xx+1;
end;
end;
resto := (d1 mod 11);
if resto < 2 then
begin
digito1 := 0;
end
else
begin
digito1 := 11 - resto;
end;
d4 := d4 + 2 * digito1;
resto := (d4 mod 11);
if resto < 2 then
begin
digito2 := 0;
end
else
begin
digito2 := 11 - resto;
end;
Check := IntToStr(Digito1) + IntToStr(Digito2);
if Check <> copy(xCNPJ,succ(length(xCNPJ)-2),2) then
begin
Result := False;
MessageDlg(´CNPJ Inválido!´,
mtWarning,[mbOk],0,mbOk,nil);
end
else
begin
Result := True;
end;
end;[/color:4dd907be4f]
Chamo ela no evento onexit na dbedit onde digito o CNPJ, mas quando dá a mensagem que este cnpj está inválido eu gostaria que o foco voltasse para esta dbedit, e quando eu não digito nada, deixo em branco, eu gostaria que ela não me desse a mensagem de cnpj inválido. Para o problema da mensagem coloquei o seguinte código antes de chamar a função:
[color=darkred:4dd907be4f]procedure TFFornecedores.DBEdit18Exit(Sender: TObject);
begin
inherited;
IF DBEDIT18.TEXT <> ´´ THEN
TestaCnpj(DBEDIT18.Text);
end;[/color:4dd907be4f]
mas como é uma função, eu não gostaria de cada vez que chamá-la, ter que fazer esta pergunta antes...
Alguém tem uma idéia?
Abraços...
Bem eu tenho a seguinte função:
[color=red:4dd907be4f]function TestaCnpj(xCNPJ: String):Boolean;
Var
d1,d4,xx,nCount,fator,resto,digito1,digito2 : Integer;
Check : String;
begin
d1 := 0;
d4 := 0;
xx := 1;
for nCount := 1 to Length( xCNPJ )-2 do
begin
if Pos( Copy( xCNPJ, nCount, 1 ), ´/-.´ ) = 0 then
begin
if xx < 5 then
begin
fator := 6 - xx;
end
else
begin
fator := 14 - xx;
end;
d1 := d1 + StrToInt( Copy( xCNPJ, nCount, 1 ) ) * fator;
if xx < 6 then
begin
fator := 7 - xx;
end
else
begin
fator := 15 - xx; end;
d4 := d4 + StrToInt( Copy( xCNPJ, nCount, 1 ) ) * fator;
xx := xx+1;
end;
end;
resto := (d1 mod 11);
if resto < 2 then
begin
digito1 := 0;
end
else
begin
digito1 := 11 - resto;
end;
d4 := d4 + 2 * digito1;
resto := (d4 mod 11);
if resto < 2 then
begin
digito2 := 0;
end
else
begin
digito2 := 11 - resto;
end;
Check := IntToStr(Digito1) + IntToStr(Digito2);
if Check <> copy(xCNPJ,succ(length(xCNPJ)-2),2) then
begin
Result := False;
MessageDlg(´CNPJ Inválido!´,
mtWarning,[mbOk],0,mbOk,nil);
end
else
begin
Result := True;
end;
end;[/color:4dd907be4f]
Chamo ela no evento onexit na dbedit onde digito o CNPJ, mas quando dá a mensagem que este cnpj está inválido eu gostaria que o foco voltasse para esta dbedit, e quando eu não digito nada, deixo em branco, eu gostaria que ela não me desse a mensagem de cnpj inválido. Para o problema da mensagem coloquei o seguinte código antes de chamar a função:
[color=darkred:4dd907be4f]procedure TFFornecedores.DBEdit18Exit(Sender: TObject);
begin
inherited;
IF DBEDIT18.TEXT <> ´´ THEN
TestaCnpj(DBEDIT18.Text);
end;[/color:4dd907be4f]
mas como é uma função, eu não gostaria de cada vez que chamá-la, ter que fazer esta pergunta antes...
Alguém tem uma idéia?
Abraços...
Cristiane
Curtidas 0
Respostas
Jairroberto
05/06/2003
Olá, Cristiane!
Você pode fazer uma pequena alteração na função para evitar o teste da string em branco antes de chamá-la:
Quanto ao foco no DBEdit, eu sempre prefiro separar as ´regras de negócio´ das rotinas de ´interface´ com o usuário, ou seja, eu prefiro usar o método ´OnValidate´ do campo vinculado ao DBEdit. Por exemplo:
Usando este recurso, o foco não sai do DBEdit a menos que o código esteja válido ou em branco.
Neste caso, você deve retirar a chamado ao MessageDlg que você fez na própria função, pois o ideal é que a função apenas retorne o resultado, True ou False, e não mostre nenhuma mensagem para o usuário, pois você pode precisar usar esta mesma função em outros processo que não retornem uma mensagem na tela, como a geração de um arquivo de log com uma mensagem indicando se o CNPJ está válido ou não.
Um abraço,
Jair
Você pode fazer uma pequena alteração na função para evitar o teste da string em branco antes de chamá-la:
function TestaCnpj(xCNPJ: String): Boolean; var d1,d4,xx,nCount,fator,resto,digito1,digito2: Integer; Check: string; begin if Trim(xCNPJ) = ´´ then begin Result := True; Exit; end; ... end;
Quanto ao foco no DBEdit, eu sempre prefiro separar as ´regras de negócio´ das rotinas de ´interface´ com o usuário, ou seja, eu prefiro usar o método ´OnValidate´ do campo vinculado ao DBEdit. Por exemplo:
procedure TForm1.tblTesteCNPJValidate(Sender: TField); begin // Chama a função para validar o conteúdo do campo if not TestaCnpj(Sender.AsString) then DatabaseError(´CNPJ inválido!´); // Se não validar, gera um erro end;
Usando este recurso, o foco não sai do DBEdit a menos que o código esteja válido ou em branco.
Neste caso, você deve retirar a chamado ao MessageDlg que você fez na própria função, pois o ideal é que a função apenas retorne o resultado, True ou False, e não mostre nenhuma mensagem para o usuário, pois você pode precisar usar esta mesma função em outros processo que não retornem uma mensagem na tela, como a geração de um arquivo de log com uma mensagem indicando se o CNPJ está válido ou não.
Um abraço,
Jair
GOSTEI 0
Dluca
05/06/2003
Ola amiga Cristiane.
Acho que vc esta quebrando a cabeça sem ter necessidade.
Compre os componentes da deltress www.deltress.com.br, alem de cnpj, tem todas as outras (cpf, insc. estadual, pis), funciona 100¬ e custa muito barato.
Depois que adquiri um componente, nunca mais tive problema, com impressão, checar documentos etc...
Acho que vc esta quebrando a cabeça sem ter necessidade.
Compre os componentes da deltress www.deltress.com.br, alem de cnpj, tem todas as outras (cpf, insc. estadual, pis), funciona 100¬ e custa muito barato.
Depois que adquiri um componente, nunca mais tive problema, com impressão, checar documentos etc...
GOSTEI 0