Stored Procedure para Validação de CPF
03/08/2005
0
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
Post mais votado
04/08/2005
Mordred
Mais Posts
04/08/2005
Gandalf.nho
04/08/2005
Mordred
Cheers!
05/08/2005
Mordred
/******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;
05/08/2018
Danilo Oliveira
Clique aqui para fazer login e interagir na Comunidade :)