Página 1 de 1

Funcao que verifique codigo cmc7 (rodape dos cheques)????

Enviado: 17 Ago 2004 12:48
por JMARCELO
caros colegas



alguem tem alguma funcao ou sabe como se verifica se o codigo cmc7 (rodape dos cheques) e valida preciso meu com urgencia



desde ja obrigado



joao marcelo

Enviado: 18 Ago 2004 13:29
por Dudu_XBase
// Tem isso...o Toya me ajudou a me passar as coordenadas para calcular o módulo 10...e ainda fiquei perguntando pro Trazom...rs..mas como eh pra verificar somente um digito verificador....esta correto...
Estava com dúvida pra montar a função para calcular o modulo 10....se alguém achar q da pra melhora minha função por favor dê uma força....

Código: Selecionar todos

********************************
function MODULO10

   parameters st
   private s1, s2, m1, m2, i, l, v, d1, d2
   s1:= s2:= 0
   m2:= 2
   for i:= Len(st) to 1 step -1
      l:= SubStr(st, i, 1)
      if (l $ "0123456789")
         m1:= m2
         m2:= iif(m2 < 9, m2 + 1, 2)
         v:= Val(l)
         s1:= s1 + v * m1
         s2:= s2 + v * m2
      endif
   next
   s1:= s1 % 11
   d1:= iif(s1 < 2, 0, 11 - s1)
   s2:= (s2 + 2 * d1) % 11
   d2:= iif(s2 < 2, 0, 11 - s2)
   return Str(d1, 1) + Str(d2, 1)





function Valida_CMC7(Entrada)

  LOCAL campo1, campo2, campo3 
 
  campo1 := Substr(entrada,1,7)
  campo2 := Substr(entrada,9,10)
  campo3 := Substr(entrada,20,10)
  Result := .t.
  if Modulo10(campo1) <> substr(Entrada,19,1) 
     Result := .f.
  Endif
  if Modulo10(campo2) <> substr(Entrada,8,1) 
     Result := .f.
  Endif
  if Modulo10(campo3) <> Substr(Entrada,30,1) 
     Result := .f.
  endif

Return Result 


Enviado: 04 Nov 2006 08:33
por Poka
Alô Dudu_Xbase,

Estou precisando dessa dessa rotina, mas não está dando certo, poderia me dar uma ajuda, ou alguem aí que tiver a rotina dessa funcao.

Desde já agradeço,


Um abraço


Poka

Enviado: 04 Nov 2006 12:26
por Poka
Considere esse topico encerrado, Já resolvi.

Poka

Enviado: 04 Nov 2006 13:09
por rochinha
Amiguinho

Se não for incomodo poste a solução aqui de forma completa para quem necessitar.

@braços :?)

Enviado: 05 Nov 2006 09:56
por Poka
Olá a todos

Segue a rotina calculo para CMC7


mascara:="@r 99999999*9999999999*999999999999"
do while .t.
numero:=spac(30)
cls
@ 10,10 get numero pict"&mascara" valid fcmc7(numero)
read
if empty(numero)
exit
endif
enddo
//////
funct fcmc7(numero)
local ret:=.t.
if len( alltrim(numero)) < 30
ret:=.f.
else
banco :=substr(numero,1,3)
agencia :=substr(numero,4,4)
dv1 :=substr(numero,8,1)
compensacao :=substr(numero,9,3)
cheque :=substr(numero,12,6)
tipificacao :=substr(numero,18,1)
dv2 :=substr(numero,19,1)
conta :=substr(numero,20,10)
dv3 :=substr(numero,30,1)
//
// calculo do dv1
//
n_teste:=compensacao+cheque+tipificacao
m:=2
soma:=""
for a:= len(n_teste) to 1 step -1
d:=substr(n_teste,a,1)
if d $"0123456789"
soma+= strzero( val(d)*m,2)
iif(m=2,m:=1,m:=2)
endif
next
xtotal:=0
for a:= 1 to len(soma)
xtotal+=val( substr(soma,a,1) )
next
resto:=mod(xtotal,10)
iif(resto=0,dv1:=0,dv1:=10-resto)
dv1:=str(dv1,1)

//
// calculo do dv2
//
n_teste:=banco+agencia
m:=2
soma:=""
for a:= len(n_teste) to 1 step -1
d:=substr(n_teste,a,1)
if d $"0123456789"
soma+= strzero( val(d)*m,2)
iif(m=2,m:=1,m:=2)
endif
next
xtotal:=0
for a:= 1 to len(soma)
xtotal+=val( substr(soma,a,1) )
next
resto:=mod(xtotal,10)
iif(resto=0,dv2:=0,dv2:=10-resto)
dv2:=str(dv2,1)
//
// calculo do dv3
//
n_teste:=conta
m:=2
soma:=""
for a:= len(n_teste) to 1 step -1
d:=substr(n_teste,a,1)
if d $"0123456789"
soma+= strzero( val(d)*m,2)
iif(m=2,m:=1,m:=2)
endif
next
xtotal:=0
for a:= 1 to len(soma)
xtotal+=val( substr(soma,a,1) )
next
resto:=mod(xtotal,10)
iif(resto=0,dv3:=0,dv3:=10-resto)
dv3:=str(dv3,1)
if dv1=substr(numero,8,1).and.dv2=substr(numero,19,1);
.and. dv3=substr(numero,30,1)
alert("valido")
else
ret:=.f.
tone(1000,1)
alert("invalido")
endif

endif
retu ret


Poka

Enviado: 05 Nov 2006 18:48
por Maligno
A função de cálculo fornecida pelo Dudu me parece errada, pelo que sei do assunto, já que ela utiliza pesos de 2 a 9 e, o mais estranho, devolve na função Modulo10, dois dígitos verificadores que são comparados com um dígito.
Não testei, nem li muito bem a função do Poka, mas dá pra refatorar um pouco. Acho que ela ficaria como a minha:

Código: Selecionar todos

//*****************************************************************
static function Modulo10(cTst)
local nTot := 0
local nAux
local i
if Len(ctST)%2 != 0
   cTst := "0"+cTst
end
for i := 1 to Len(cTst)
    nAux := Val(SubStr(cTst,i,1)) * if(i%2==0,2,1)
    if nAux >= 10
       nAux := Val(Left(Str(nAux,2),1)) + Val(Right(Str(nAux,2),1))
    end
    nTot += nAux
next
nTot := 10-(nTot%10)
return if(nTot=10, "0", Str(nTot,1))


//*****************************************************************
function ValidCMC7(cCMC7)
return Modulo10(SubStr(cCMC7, 1, 7)) == SubStr(cCMC7,19,1) .and. ;
       Modulo10(SubStr(cCMC7, 9,10)) == SubStr(cCMC7, 8,1) .and. ;
       Modulo10(SubStr(cCMC7,20,10)) == SubStr(cCMC7,30,1)



/*
Dígitos   Descrição
-------   ---------------------------------------
1/3       Número do banco
4/7       Número da agência
8         Módulo 10 dos dígitos 9 a 18
9/11      Código de compensação
12/17     Número do cheque
18        Número fixo (5)
19        Módulo 10 dos dígitos 1 a 7
20/29     Número da conta corrente (incluindo DV)
30        Módulo 10 dos dígitos 20 a 29
*/
[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 06 Nov 2006 07:32
por Poka
Olá a todos


Maligno, testei a sua rotina e está Ok, funcionou certissimo, muito menos codigo de programação. Valeu.

Um abraço.

Poka