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