Stored Procedure para Validação de CPF
Estou criando um sistema de gerenciamento comercial e gostaria muito muito muito de poder validar dentro do banco de dados o CPF das pessoas físicas que eu cadastro e assim aliviar um pouquinho a barra da aplicação, deixando esse serviço pra ser feito na base. O código que eu tenho até agora é este:
O Firebird compila esse código sem maiores problemas, mas quando executo a procedure passando um CPF válido como parâmetro, obtenho ´N´ como retorno, informando que o CPF passado é inválido. O que eu estou fazendo de errado, meudeusdocéu?
Desde já grato pelas suas atenções :)[/code]
COMMIT WORK; SET AUTODDL OFF; SET TERM ^ ; CREATE PROCEDURE "CHECACPF" ( "CPF" CHAR(11) CHARACTER SET WIN1252 ) RETURNS ( "VALIDO" CHAR(1) CHARACTER SET WIN1252 ) AS DECLARE VARIABLE NUMERO CHAR(9); DECLARE VARIABLE DIGITO CHAR(2); DECLARE VARIABLE SOMA INTEGER; DECLARE VARIABLE RESTO SMALLINT; DECLARE VARIABLE CONT SMALLINT; BEGIN /*VERIFICAÇÕES PRELIMINARES*/ IF ((UDF_LEN(CPF)<>11)OR(CPF=´00000000000´)OR(CPF=´11111111111´)OR (CPF=´22222222222´)OR(CPF=´33333333333´)OR(CPF=´44444444444´)OR (CPF=´555555555555´)OR(CPF=´66666666666´)OR(CPF=´77777777777´)OR (CPF=´88888888888´)OR(CPF=´99999999999´)) THEN BEGIN VALIDO=´N´; END ELSE /*INICIALIZA VARIÁVEIS*/ BEGIN NUMERO=UDF_COPY(CPF,0,9); DIGITO=UDF_COPY(CPF,10,2); CONT=0; /*SOMA OS DÍGITOS MULTIPLICADOS E CALCULA O RESTO*/ WHILE (CONT<=9) DO BEGIN SOMA=SOMA+CAST(UDF_COPY(NUMERO,:CONT,1) AS SMALLINT)*(10-:CONT); CONT=CONT+1; END RESTO=UDF_MOD(:SOMA,11); /*TRATA O CASO DE RESTO INFERIOR A 2*/ IF ((RESTO<2)AND(UDF_COPY(DIGITO,1,1)<>´0´)) THEN BEGIN VALIDO=´N´; END ELSE /*VERIFICA SE O PRIMEIRO DIGITO CONFERE*/ IF (11-:RESTO<>CAST(UDF_COPY(DIGITO,1,1) AS INTEGER)) THEN BEGIN VALIDO=´N´; END ELSE BEGIN CONT=0; /*MULTIPLICA, SOMA E CALCULA O RESTO*/ WHILE (CONT<=9) DO BEGIN SOMA=SOMA+CAST(UDF_COPY(NUMERO,:CONT,1) AS SMALLINT)*(11-:CONT); CONT=CONT+1; END SOMA=SOMA+CAST(UDF_COPY(DIGITO,1,1) AS SMALLINT)*2; RESTO=UDF_MOD(:SOMA,11); /*VERIFICA O SEGUNDO DÍGITO*/ IF ((:RESTO<2)AND(UDF_COPY(DIGITO,2,1)<>´0´)) THEN BEGIN VALIDO=´N´; END ELSE IF (11-:RESTO<>CAST(UDF_COPY(DIGITO,2,1) AS INTEGER)) THEN BEGIN VALIDO=´N´; END ELSE VALIDO=´S´; END END SUSPEND; END ^ SET TERM ; ^ COMMIT WORK; SET AUTODDL ON;
O Firebird compila esse código sem maiores problemas, mas quando executo a procedure passando um CPF válido como parâmetro, obtenho ´N´ como retorno, informando que o CPF passado é inválido. O que eu estou fazendo de errado, meudeusdocéu?
Desde já grato pelas suas atenções :)[/code]
Mordred
Curtidas 0
Melhor post
Mordred
04/08/2005
Alguém sabe se existe algum software depurador de scripts compatível com Firebird? Eu sei que o IB Expert depura, no entanto na versão Personal, essa função está desabilitada. Será que existe algum outro?
GOSTEI 1
Mais Respostas
Gandalf.nho
03/08/2005
Existe uma biblioteca UDF para ajudar a debugar SPs e triggers no IB/FB chamada IBDebugUDF, pegue-a em [url]http://www.firebase.com.br/cgi-bin/firebase.cgi/dnld?ID=32[/url]
GOSTEI 0
Mordred
03/08/2005
Valeu pelo link, amiga moderadora (moderadora?). O Leiame.txt que vem junto com essa UDF que você me indicou me deu algumas idéias mais simples e eficazes. Quando o código estiver pronto, eu posto aqui pra galera da comunidade tb poder tirar proveito.
Cheers!
Cheers!
GOSTEI 0
Mordred
03/08/2005
Aqui está para quem possa interessar:
/******Quaisquer dúvidas, entre em contato através do e-mail******/ /*****************shdmaster@hotmail.com********************/ COMMIT WORK; SET AUTODDL OFF; SET TERM ^ ; CREATE PROCEDURE "CHECACPF" ( "CPF" CHAR(11) CHARACTER SET WIN1252 ) RETURNS ( "VALIDO" CHAR(1) CHARACTER SET WIN1252 ) AS /*DECLARE VARIABLE NUMERO CHAR(9); DECLARE VARIABLE DIGITO1 CHAR(1); DECLARE VARIABLE DIGITO2 CHAR(1);*/ DECLARE VARIABLE SOMA INTEGER; DECLARE VARIABLE RESTO SMALLINT; DECLARE VARIABLE CONT SMALLINT; BEGIN /*VERIFICAÇÕES PRELIMINARES*/ IF ((UDF_LEN(CPF)<>11)OR(CPF=´00000000000´)OR(CPF=´11111111111´)OR (CPF=´22222222222´)OR(CPF=´33333333333´)OR(CPF=´44444444444´)OR (CPF=´555555555555´)OR(CPF=´66666666666´)OR(CPF=´77777777777´)OR (CPF=´88888888888´)OR(CPF=´99999999999´)) THEN BEGIN VALIDO=´A´; END ELSE /*INICIALIZA VARIÁVEIS*/ BEGIN /*NUMERO =UDF_COPY(CPF,0,9); DIGITO1=UDF_COPY(CPF,10,1); DIGITO2=UDF_COPY(CPF,11,1);*/ CONT=1; SOMA=0; RESTO=0; /*SOMA OS DÍGITOS MULTIPLICADOS E CALCULA O RESTO*/ WHILE (CONT<=9) DO BEGIN SOMA=SOMA+CAST(UDF_COPY(CPF,:CONT,1) AS SMALLINT)*(11-:CONT); CONT=CONT+1; END RESTO=UDF_MOD(SOMA,11); /*TRATA O CASO DE RESTO INFERIOR A 2*/ IF ((RESTO<2)AND(UDF_COPY(CPF,10,1)<>´0´))THEN BEGIN VALIDO=´N´; END ELSE /*VERIFICA SE O PRIMEIRO DIGITO CONFERE*/ IF (11-:RESTO<>CAST(UDF_COPY(CPF,10,1) AS INTEGER)) THEN BEGIN VALIDO=´N´; END ELSE BEGIN CONT=1; SOMA=0; /*MULTIPLICA, SOMA E CALCULA O RESTO*/ WHILE (CONT<=10) DO BEGIN SOMA=SOMA+CAST(UDF_COPY(CPF,:CONT,1) AS SMALLINT)*(12-:CONT); CONT=CONT+1; END RESTO=UDF_MOD(:SOMA,11); /*VERIFICA O SEGUNDO DÍGITO*/ IF ((RESTO<2)AND(UDF_COPY(CPF,11,1)<>´0´)) THEN BEGIN VALIDO=´N´; END ELSE IF (11-:RESTO<>CAST(UDF_COPY(CPF,11,1) AS INTEGER)) THEN BEGIN VALIDO=´N´; END ELSE VALIDO=´S´; END END SUSPEND; END ^ SET TERM ; ^ COMMIT WORK; SET AUTODDL ON;
GOSTEI 0
Danilo Oliveira
03/08/2005
Obrigado pelo código. Me ajudou em minha aplicação e de quebra ainda aprendi a criar e manipular UDFs
GOSTEI 0