DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais

INICIANTES

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

Saiba mais

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
voltar

PARA QUEM GOSTA DE DELPHI

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

Fala galera de Delphi, tudo beleza?

hoje vamos abrir um parênteses para uma dica excelente de SQL, para quem trabalha com Firebird.

Diversas vezes precisei validar CPFs 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
83
84
85
86
87
88
89
90
SET TERM ^ ;
 
CREATE OR ALTER PROCEDURE UTIL_IS_VALID_CPF (
    CPF CHAR(11) CHARACTER SET WIN1252)
RETURNS (
    VALIDO SMALLINT)
AS
DECLARE variable SOMA INTEGER;
DECLARE variable RESTO SMALLINT;
DECLARE variable CONT SMALLINT;
BEGIN
  -- código da comunidade show delphi, adaptado por Giovani Da Cruz
 
  /* DIGITOS IDENTICOS */
  IF (
  (CHARACTER_LENGTH(CPF) <> 11) OR
  (CPF = '00000000000') OR (CPF = '11111111111') OR
  (CPF = '22222222222') OR (CPF = '33333333333') OR (CPF = '44444444444')OR
  (CPF = '55555555555') OR (CPF = '66666666666') OR (CPF = '77777777777')OR
  (CPF = '88888888888') OR (CPF = '99999999999')
  ) THEN
  BEGIN
    VALIDO = 0;
 
    SUSPEND;
    Exit;
  END
 
  /* INICIALIZA VARIÁVEIS */
  CONT=1;
  SOMA=0;
  RESTO=0;
 
  /* SOMA OS DÍGITOS MULTIPLICADOS E CALCULA O RESTO */
  WHILE (CONT<=9) DO
  BEGIN
    SOMA = SOMA + CAST( SUBSTRING(CPF FROM :CONT FOR 1) AS SMALLINT) * (11 - :CONT);
    CONT = CONT + 1;
  END
  RESTO=MOD(SOMA,11);
 
  /* TRATA O CASO DE RESTO INFERIOR A 2 */
  IF ( (RESTO < 2) AND (SUBSTRING(CPF FROM 10 FOR 1) <> '0') )THEN
  BEGIN
    VALIDO = 0;
  END
  ELSE
  BEGIN
    /*VERIFICA SE O PRIMEIRO DIGITO CONFERE*/
    IF (11-:RESTO<>CAST(SUBSTRING(CPF FROM 10 FOR 1) AS INTEGER)) THEN
    BEGIN
      VALIDO=0;
    END
    ELSE
    BEGIN
      CONT=1;
      SOMA=0;
 
      /*MULTIPLICA, SOMA E CALCULA O RESTO*/
      WHILE (CONT<=10) DO
      BEGIN
        SOMA = SOMA + CAST(SUBSTRING(CPF FROM :CONT FOR 1) AS SMALLINT) * (12-:CONT);
        CONT = CONT + 1;
      END
      RESTO = MOD(:SOMA,11);
 
      /*VERIFICA O SEGUNDO DÍGITO*/
      IF ((RESTO < 2) AND (SUBSTRING(CPF FROM 11 FOR 1) <> '0')) THEN
      BEGIN
        VALIDO=0;
      END
      ELSE
      BEGIN
        IF (11 - :RESTO <> CAST(SUBSTRING(CPF FROM 11 FOR 1) AS INTEGER)) THEN
        BEGIN
          VALIDO = 0;
        END
        ELSE
        BEGIN
          VALIDO = 1;
        END
      END
    END
  END
 
  SUSPEND;
END
^
 
SET TERM ; ^

A stored procedure foi montada com base no seguinte post:
https://www.devmedia.com.br/forum/stored-procedure-para-validacao-de-cpf/51957

No post Mordred (shdmaster@hotmail.com), publicou uma versão interessante, com base nesta versão
realizei mudanças importantes:

– Removi dependências de UDFs;
– Identeção (No padrão que uso – similar ao DELPHI)
– Alteração do retorno de char para smallint
– Ajustado para a compilação em Firebird 3.0

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 cpf do show delphi
(SELECT y.valido FROM util_is_valid_cpf('47570414039') y),
 
-- inválido
(SELECT y.valido FROM util_is_valid_cpf('00000000000') y),
 
-- in
(SELECT y.valido FROM util_is_valid_cpf('01294580043') 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!

Facebook Comments Box
  • Giovani Da Cruz
  • 3.699 views
  • 0 comentários
  • 28 de agosto de 2019

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

Deixe um comentário

Ir ao topo

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