dicas show delphi

DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais
sombra
Artigos Show Delphi

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais
sombra
iniciantes show delphi

INICIANTES

Aprenda a programar de um modo simples e fácil.

Saiba mais
sombra
downloads show delphi

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
sombra
voltar

PARA QUEM GOSTA DE DELPHI

Stored Procedure para a validação de CNPJ SQL Firebird

Fala galera de Delphi, tudo beleza?

Continuando com o parênteses de SQL para quem trabalha com Firebird, vamos a mais
uma dica interessante.

Diversas vezes precisei validar CNPJs de base de dados, mas sempre precisando fazer a validação
via aplicação, o que acabava aumentando o tempo necessário do trabalho além de não poder
resolver tudo via banco de dados.

Pesquisei e felizmente encontrei uma alternativa para fazer a validação diretamente
via SQL. A solução foi criar uma Stored Procedure que é a responsável pela validação!

Esta versão já está validada para Firebird 3.0 é não faz uso de UDFs!

Vamos ao código!

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
SET TERM ^ ;
 
CREATE OR ALTER PROCEDURE UTIL_IS_VALID_CNPJ (
CNPJ VARCHAR(30))
RETURNS (
VALIDO SMALLINT)
AS
DECLARE variable TMP_CNPJ VARCHAR(30);
DECLARE variable I INTEGER;
DECLARE variable L INTEGER;
DECLARE variable T INTEGER;
BEGIN
-- código da comunidade show delphi, adaptado por Giovani Da Cruz
CNPJ = TRIM(:CNPJ);
 
/* DIGITOS IDENTICOS */
IF (
(CHARACTER_LENGTH(CNPJ) <> 14) OR
(CNPJ = '00000000000000') OR (CNPJ = '11111111111111') OR
(CNPJ = '22222222222222') OR (CNPJ = '33333333333333') OR (CNPJ = '44444444444444')OR
(CNPJ = '55555555555555') OR (CNPJ = '66666666666666') OR (CNPJ = '77777777777777')OR
(CNPJ = '88888888888888') OR (CNPJ = '99999999999999')
) THEN
BEGIN
VALIDO = 0;
 
SUSPEND;
Exit;
END
 
I = 1;
TMP_CNPJ = '';
while (I <= CHAR_LENGTH(CNPJ)) do
BEGIN
IF (SUBSTRING(CNPJ FROM I FOR 1) BETWEEN '0' AND '9') THEN
TMP_CNPJ = TMP_CNPJ || SUBSTRING(CNPJ FROM I FOR 1);
I = I + 1;
END
 
IF (CHAR_LENGTH(TMP_CNPJ) <> 14) THEN
BEGIN
VALIDO = 0;
suspend;
exit;
END
 
L = 0;
while (L < 2) do
BEGIN
I = 1;
T = 0;
while (I < 13 + L) do
BEGIN
T = T + (MOD(20 - I + L, 8) + 2) * CAST(SUBSTRING(TMP_CNPJ FROM I FOR 1) AS INTEGER);
I = I + 1;
END
T = MOD(T, 11);
IF (T < 2) THEN
BEGIN
T = 0;
END
ELSE
BEGIN
T = 11 - T;
END
 
IF (T <> CAST(SUBSTRING(TMP_CNPJ FROM 13 + L FOR 1) AS INTEGER)) THEN
BEGIN
VALIDO = 0;
suspend;
exit;
END
 
L = L + 1;
END
 
VALIDO = 1;
suspend;
END
^
 
SET TERM ; ^

A stored procedure foi montada com base no seguinte post: https://www.firebase.com.br/artigo.php?id=3061
(FireBase – mais só acessível para usuários logados).

Maravilha, vamos ao exemplo de uso!

1
2
3
4
5
6
7
8
9
10
11
12
SELECT
 
-- válido gerado pelo gerador de cnpj do show delphi
(SELECT y.valido FROM util_is_valid_cnpj('78651494000161') y),
 
-- inválido
(SELECT y.valido FROM util_is_valid_cnpj('00000000000000') y),
 
-- inválido
(SELECT y.valido FROM util_is_valid_cnpj('01294580043417') y)
 
FROM rdb$database

Assim você pode facilitar as suas validação diretamente via SQL.

Aproveite e conheça o gerador de CNPJ e CPF do Show Delphi para aprimorar
seus testes. Visite: https://showdelphi.com.br/gerador-de-cpf-e-cnpj/

Espero que seja útil a todos!

Dúvidas ou sugestões? Deixe o seu comentário!

  • Giovani Da Cruz
  • 2 comentários
  • 29 de agosto de 2019

2 respostas para “Stored Procedure para a validação de CNPJ SQL Firebird”

  1. Gerson De Simone disse:

    Também tive esse problema na criação da procedure, mas foi só tirar as linhas
    — código da comunidade show delphi, adaptado por Giovani Da Cruz e
    /* DIGITOS IDENTICOS */
    não sei por que mas pude criar e testar.
    Funciona bem, é diferente do método que uso mas é boa, parabéns e obrigado

  2. Oliveira Dos Santos, provavelmente o erro “Malformed string.” ocorre por causa dos acentos nos comentários.

    Se remove-los, provavelmente funcionará.

    Isso pode ocorrer em alguns casos dependebdo do charset ou colatte escolhidos.

Deixe um comentário

Ir ao topo

© 2024 Infus Soluções em Tecnologia - Todos os Direitos Reservados