Funcao que verifique codigo cmc7 (rodape dos cheques)????
Moderador: Moderadores
-
JMARCELO
- Usuário Nível 1

- Mensagens: 33
- Registrado em: 13 Jul 2004 09:39
- Localização: presidente venceslau - sp
- Contato:
Funcao que verifique codigo cmc7 (rodape dos cheques)????
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
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
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
// 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....
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
________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Amiguinho
Se não for incomodo poste a solução aqui de forma completa para quem necessitar.
@braços :?)
Se não for incomodo poste a solução aqui de forma completa para quem necessitar.
@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
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
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
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:
[]'s
Maligno
http://www.buzinello.com/prg
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
*/
Maligno
http://www.buzinello.com/prg
