21/01/2006

Digitos especias dos campos dos Cheques

Alguem sabe a lei de formação para o digito C3 dos Cheques

Obrigado....


Marco Salles

Respostas

22/01/2006

Marco Salles

Consegui algo em

http://forum.devmedia.com.br/viewtopic.php?t=29416&highlight=cmc7&sid=2f853605fa368c7c653af78b8520d99e

Cujo o algoritimo é :


CÁCULO DO C3 ============ Cheque: 001552 C3=0 0 0 1 5 5 2 x x x x x x 7 6 5 4 3 2 ------------------ 0 0 5 20 15 4 = 44 44 / 11 resto = 0 C3 = 11 - 0 Zero ???????????? C3 = 0 ?


Porem esta ultima etapa esta estranha .. Como C3 = 11 - 0 = 0 ????

Alguem sabe onde esta o erro ????


Responder Citar

22/01/2006

Edilcimar

não é uma operação aritimética, no módulo 11, se o resto for 10, C3 deve ser 0, creio que esteja errado, pois na conta do link, [u:ba03b60e9b][b:ba03b60e9b] C1 = 11-RESTO (OBS:SE O RESTO FOR 0 OU 1, C1 SERÁ 0)[/b:ba03b60e9b][/u:ba03b60e9b]
é claro que o resto jamais será 11


Responder Citar

22/01/2006

Aroldo Zanela

Colega,

Função para calcular módulo 11:

Function Mod11( iNumero: Integer ) : Integer;
var   sCadeia  : String;
      iX       : Integer;
      iY       : Integer;
      iValor   : Integer;
      iDigito  : Integer;
      sPosicao : String;
      iPosicao : Integer;

Begin
   iValor := 0;
   sCadeia := StrZero( iNumero, 16 );
   For iY := 2 DownTo 1 do
   Begin
      For iX := 8 DownTo 1 do
      Begin
         sPosicao    := Copy( sCadeia, ( 17 - ( iX + ( 8 * ( iY - 1 ) ) ) ), 1 );
         iPosicao    := StrToInt( sPosicao );
         iValor      := iValor + ( iPosicao * ( iX + 1 ) )
      End;
   End;

   iDigito := ( ( iValor * 10 ) mod 11 );

   If iDigito >= 10 Then
      iDigito := 0;

   Result := StrToInt(StrZero( iDigito, 1 ));

End;



Responder Citar

22/01/2006

Marco Salles

Muito obrigado edicilmar e Aroldo Zanela..

Tô entrando de férias Hoje e depois vou testar e post novamente ..

Muitissimo Obrigado;


Responder Citar

22/01/2006

Edilcimar

ok, às ordens


Responder Citar

23/01/2006

Marco Salles

Férias em Vila Velha .. To desfrutando Um Pouco Das Extensões das Minas Gerais , Afinal esta região toda é nossa... Hehehehehehe


Responder Citar

23/01/2006

Edilcimar

Tá pensando que isto aqui é quintal de mineiro? Cuidado para não ser depenado!


Responder Citar

03/02/2006

Marco Salles

Tô entrando de férias Hoje e depois vou testar e post novamente ..


Voltando...

[b:a761383b2b]o meu delphi é o 5.0[/b:a761383b2b]

e a função

sCadeia := StrZero( iNumero, 16 );


[b:a761383b2b]Não compila[/b:a761383b2b] :cry: :cry: :cry: :cry:

Se não me engano esta função e do Cliper não ??? :?: :?: :?:

Mas independentemente disso , o que esta função faz e com eu poderia inclementa-la no delphi 5.0 , para que eu consiga Testar a função passada pelo amigo Aroldo Zanela..


Responder Citar

03/02/2006

Martins

sCadeia := StrZero( iNumero, 16 );


[b:2430dceb4e]Não compila[/b:2430dceb4e] :cry: :cry: :cry: :cry:

Se não me engano esta função e do Cliper não ??? :?: :?: :?:

function StrZero(Zeros:string;Quant:integer):String;
{Insere Zeros à frente de uma string}
var
I,Tamanho:integer;
aux: string;
begin
  aux := zeros;
  Tamanho := length(ZEROS);
  ZEROS:=´´;
  for I:=1 to quant-tamanho do
  ZEROS:=ZEROS + ´0´;
  aux := zeros + aux;
  StrZero := aux;
end;


Teste esse código, ele deve ser o mesmo usado na função passada pelo nobre [b:2430dceb4e]Aroldo Zanela[/b:2430dceb4e].

Depois vou postar um código lá no tópico sobre o [b:2430dceb4e]foco RadioGroup[/b:2430dceb4e].

Boa sorte [b:2430dceb4e]Marco Salles[/b:2430dceb4e]


Responder Citar

03/02/2006

Aroldo Zanela

Colegas,

Desculpem, esqueci de incluir a função StrZero:

Function StrZero(iNumero, iQtde: Integer): string;
begin
  Result := FormatFloat(StringOfChar(´0´,iQtde-Length(IntToStr(iNumero))), iNumero);
end;



Responder Citar

03/02/2006

Martins

[quote:344385315d=´Aroldo Zanela´]Colegas,

Desculpem, esqueci de incluir a função StrZero:

Function StrZero(iNumero, iQtde: Integer): string;
begin
  Result := FormatFloat(StringOfChar(´0´,iQtde-Length(IntToStr(iNumero))), iNumero);
end;
[/quote:344385315d]

Tranquilo Zanela, e essa função é bem menor do q a q eu postei.

Boa sorte!!!


Responder Citar

04/02/2006

Marco Salles

Colegas, Desculpem, esqueci de incluir a função StrZero: Código: Function StrZero(iNumero, iQtde: Integer): string; begin Result := FormatFloat(StringOfChar(´0´,iQtde-Length(IntToStr(iNumero))), iNumero); end;


Aroldo, esta função testei e me retorna uma string com 13 Digitos...O Problema e que para IX<=3 e Iy=1 na função Mod11 Teremos um erro na instrução :

sPosicao := Copy( sCadeia, ( 17 - ( iX + ( 8 * ( iY - 1 ) ) ) ), 1 );
iPosicao := StrToInt( sPosicao );

substiuindo pelos valores teremos:

sPosicao := Copy( sCadeia, ( 17 - ( 3 + ( 8 * ( 1 - 1 ) ) ) ), 1 );
sPosicao := Copy( sCadeia, ( 17 - 3 ), 1 );
sPosicao := Copy( sCadeia,14, 1 );

Como sPosicao tem so Treze digitos , devido a função SrtZero , teremos
sposicao:= ´Vazio´ e consequentemente um erro na linha de baixo , quando tentamos fazer a conversão

[b:7d7fa53774]iPosicao := StrToInt( sPosicao );[/b:7d7fa53774]

Ja que levantei esta questão , do possível erro na função StrZero , se o o objetivo da mesma e retornar uma String com 16 Digitos , porque não simpesmente fazer :

Function StrZero(iNumero, iQtde: Integer): string; begin Result := FormatFloat(StringOfChar(´0´,iQtde), iNumero); end;



Responder Citar

04/02/2006

Aroldo Zanela

Colega,

Tem razão, basta corrigir a função StrZero. :oops:


Responder Citar