Stored Procedure para Validação de CPF

03/08/2005

0

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:
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

Mordred

Responder

Post mais votado

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?


Mordred

Mordred
Responder

Mais Posts

04/08/2005

Gandalf.nho

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]


Responder

04/08/2005

Mordred

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!


Responder

05/08/2005

Mordred

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;



Responder

05/08/2018

Danilo Oliveira

Obrigado pelo código. Me ajudou em minha aplicação e de quebra ainda aprendi a criar e manipular UDFs
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar