



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 ([email protected]), 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!