validação de cpf funciona em cfm mas não funciona em cfc

80 views
Skip to first unread message

Anderson Alves de Almeida

unread,
May 20, 2011, 10:45:11 PM5/20/11
to ColdFusion Brasil
Pessoal, algo muito estranho, tenho uma função que valida CPF e a uso
no meu cfm, porém agora tenho a necessidade de tira-la da minha cfm e
coloca-la dentro de um componente, só que no componente ela não
funciona, da erro.

O problema não esta no código de validação até porque ja troquei ele
por algo simples, uma continha de +, e deu o mesmo erro, e o mais
engraçado é que da o erro no arquivo que chama a cfc, mas se eu tirar
a função e colocar outra coisa vai tranquilo, olha o erro

_______________________________________________________
Invalid CFML construct found on line 12 at column 42.
The function CPFvalidate is incorrectly nested inside another function
definition validacpf, which is located at line 2, column 27.

The error occurred in C:\Inetpub\vhosts\sistema5.com.br\httpdocs
\paracred\webservice\testes.cfm: line 10

8 : <body>
9 :
10 : <cfset pessoafisica = createObject("component", "pessoafisica")>
11 : <cfset retorno = pessoafisica.validacpf("000.000.001-91")>
12 : <cfdump var="#retorno#">
_______________________________________________________

Aqui a forma como chamo o meu objeto:

_______________________________________________________
<cfset pessoafisica = createObject("component", "pessoafisica")>
<cfset retorno = pessoafisica.validacpf("000.000.001-91")>
<cfdump var="#retorno#">
_______________________________________________________

E aqui o meu componente:

<cfcomponent>
<cffunction name="validacpf" access="public" returntype="string">
<cfargument name="cpf" type="string" required="yes">

<cfscript>
/**
* Checa se um CPF específico (Brasil) é válido.
*
* @param inputCPF O CPF (000.000.000-00) para checar.
* @return Retorna um boolean.
*/
function CPFvalidate(thisCPF) {
var thisCPFdigitos = "";
var thisDigit = 0;
var thisCPFlen = 0;

var somaDigitoUm = 0;
var somaDigitoDois = 0;
var digitoUm = 0;
var digitoDois = 0;
var i = 0;

thisCPF = Replace(thisCPF, " ", "", "ALL");
thisCPF = Replace(thisCPF, ".", "", "ALL");
thisCPF = Replace(thisCPF, "-", "", "ALL");
thisCPFlen = len(thisCPF);

// Numérico, 11 dígitos e maior que zero (no caso 000.000.000-00)
if (NOT (IsNumeric(thisCPF) AND thisCPFlen EQ 11 AND thisCPF GT
0))
return false;

// Separa o número e digitos verificadores
thisCPFdigitos = right(thisCPF, 2);
thisCPF = left(thisCPF, 9);

// Por exemplo 111.111.111-11, 222.222.222-22, etc.
// O caso 000.000.000-00 é tratato em thisCPF GT 0, acima.
// Só faz tal verificação se os dígitos forem maior que zero (não
se pode
//dividir por zero)

if (thisCPFdigitos AND int(thisCPF/thisCPFdigitos) EQ 10101010)
return false;

for(i=10; i GT 1; i=i-1) {
thisDigit = mid(thisCPF, 11-i, 1);
somaDigitoUm = somaDigitoUm + thisDigit * i;
}
digitoUm = somaDigitoUm * 10 MOD 11;
if (digitoUm EQ 10)
digitoUm = 0;

thisCPF = thisCPF & digitoUm;

for(i=11; i GT 1; i=i-1) {
thisDigit = mid(thisCPF, 12-i, 1);
somaDigitoDois = somaDigitoDois + thisDigit * i;
}
digitoDois = somaDigitoDois * 10 MOD 11;
if (digitoDois EQ 10)
digitoDois = 0;

if (digitoUm & digitoDois EQ thisCPFdigitos)
return true;
else
return false;
}
</cfscript>

<cfset cpfStatus = CPFvalidate(arguments.cpf)>

<cfreturn cpfStatus>
</cffunction>
</cfcomponent>


Bom, pra quem precisar ja fica na mão uma função para validar CPF, a
função funciona muito bem, meu erro é outro, só não sei qual, espero
que suas experiências me ajudem, abraços.

Christiano Oliveira

unread,
May 21, 2011, 8:47:21 PM5/21/11
to cfbr...@googlegroups.com
Olá Anderson,

Voce esta usando function dentro de function, realmente nao funciona.

Se quer seguir neste modelo, separe-as assim:

<cfcomponent>

     

      <cffunction name="CPFvalidate" access="public" returntype="boolean">

           

            <cfscript>

                  var thisCPFdigitos = "";

                  var thisDigit = 0;

                  var thisCPFlen = 0;

           

                  var somaDigitoUm = 0;

                  var somaDigitoDois = 0;

                  var digitoUm = 0;

                  var digitoDois = 0;

                  var i = 0;

           

                  thisCPF = Replace(thisCPF, " ", "", "ALL");

                  thisCPF = Replace(thisCPF, ".", "", "ALL");

                  thisCPF = Replace(thisCPF, "-", "", "ALL");

                  thisCPFlen = len(thisCPF);

           

                  // Numérico, 11 dígitos e maior que zero (no caso 000.000.000-00)

                  if(NOT (IsNumeric(thisCPF) AND thisCPFlen EQ 11 AND thisCPF GT 0))

                        return false;

           

                  // Separa o número e digitos verificadores

                  thisCPFdigitos = right(thisCPF, 2);

                  thisCPF = left(thisCPF, 9);

           

                  // Por exemplo 111.111.111-11, 222.222.222-22, etc.

                  // O caso 000.000.000-00 é tratato em thisCPF GT 0, acima.

                  // Só faz tal verificação se os dígitos forem maior que zero (não se pode

                  //dividir por zero)

                  if(thisCPFdigitos AND int(thisCPF / thisCPFdigitos) EQ 10101010)

                        return false;

           

                  for(i = 10; i GT 1; i = i - 1)

                  {

                        thisDigit = mid(thisCPF, 11 - i, 1);

                        somaDigitoUm = somaDigitoUm + thisDigit * i;

                  }

                  digitoUm = somaDigitoUm * 10 MOD 11;

                  if(digitoUm EQ 10)

                        digitoUm = 0;

           

                  thisCPF = thisCPF & digitoUm;

           

                  for(i = 11; i GT 1; i = i - 1)

                  {

                        thisDigit = mid(thisCPF, 12 - i, 1);

                        somaDigitoDois = somaDigitoDois + thisDigit * i;

                  }

                  digitoDois = somaDigitoDois * 10 MOD 11;

           

                  if(digitoDois EQ 10)

                        digitoDois = 0;

           

                  if(digitoUm & digitoDois EQ thisCPFdigitos)

                        return true;

                  else

                        return false;

            </cfscript>

           

      </cffunction>

     

      <cffunction name="validacpf" access="public" returntype="string">

            <cfargument name="cpf" type="string" required="yes"/>

     

            <cfset cpfStatus = CPFvalidate(arguments.cpf)>

     

            <cfreturn cpfStatus>

      </cffunction>

     

</cfcomponent>



Porem, EU imagino que nao precise de 2 funcoes, pode fazer isso com apenas 1.




2011/5/20 Anderson Alves de Almeida <pool...@gmail.com>

--
Você recebeu este e-mail pois está cadastrado na lista ColdFusion Brasil
Para CANCELAR sua assinatura escreva para cfbrasil+u...@googlegroups.com
Para ASSINAR a lista escreva para cfbrasil+...@googlegroups.com
O endereço para ENVIO DE MENSAGENS da lista é cfbr...@googlegroups.com
REGRAS em http://groups.google.com/group/cfbrasil/web/regras-de-boa-convivncia-na-lista
Outras opções disponíveis em http://groups.google.com/group/cfbrasil



--

Christiano Jose de Oliveira
Project Manager - Brasil Netuno Internacional
DebugNet - Development Business Group
coli...@debug.net.br
http://www.debug.net.br


Anderson Alves de Almeida

unread,
May 22, 2011, 12:03:39 PM5/22/11
to cfbr...@googlegroups.com
cara, entendi, não havia me atendado a isso, eu so peguei o que estava no meu cfm e colei o cfc sem pensar direito no ue estava fazendo.
Obrigado Cristiano.
Anderson Alves de Almeida.
Engenheiro Elétrico - Modalidade Eletrônica.
http://www.andersonalves.com/

Curriculo: http://lattes.cnpq.br/1880686062854710

Paulo Augusto Teixeira

unread,
May 23, 2011, 3:36:45 PM5/23/11
to cfbr...@googlegroups.com
Anderson, já tentou testar seu validador com esse número: 00000000191   ?

Abraços!

2011/5/22 Anderson Alves de Almeida <pool...@gmail.com>



--
Paulo A. Teixeira
Adobe Certified Expert Flex 3 with AIR
Adobe Certified Expert Rich Internet Application v1.0
Adobe Certified Expert ColdFusion 8
--
Blog: http://www.pauloteixeira.blog.br
My Pics: http://agostinho.tumblr.com/

Anderson Alves de Almeida

unread,
May 23, 2011, 5:12:25 PM5/23/11
to cfbr...@googlegroups.com
Deu certo Paulo, meu erro era estar chamando uma função dentro de outra função, na hora do copia e cola fiz isso sem perfeber a besteira que eu estava fazendo. Agora ja esta funcionando.

Valeu.

Paulo Augusto Teixeira

unread,
May 23, 2011, 11:26:03 PM5/23/11
to cfbr...@googlegroups.com
Eu sei que deu Certo, oque estou te falando é que se vc tentar validar o CPF 00000000191 com sua função, vai retornar true!

2011/5/23 Anderson Alves de Almeida <pool...@gmail.com>

Anderson Alves de Almeida

unread,
May 24, 2011, 10:24:31 AM5/24/11
to cfbr...@googlegroups.com
Mas é isso mesmo, esse cpf é valido, não tem dono mas se fizer o calculo o resultado vai ser -91 mesmo.
Reply all
Reply to author
Forward
0 new messages