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

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

JMARCELO
Usuário Nível 1
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)????

Mensagem 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
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem 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 



________________________________________________________________________________________________________
(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




Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem 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
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem por Poka »

Considere esse topico encerrado, Já resolvi.

Poka
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

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.
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem 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
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem 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
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem 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
Responder