Fórum calculo digito nosso numero para banco bradesco #455950
20/09/2013
0
Por favor ajudem-me a encontrar meu erro:
minha função:
Function DN( pNosso:String):String;
Var
aNosso:Array[1..13] of Integer;
aBase:Array[1..13] of Integer;
aMulti:Array[1..13] of Integer;
aMulti2:Array[1..13] of String;
iX,iSoma1,iSoma2,iPar,iImp,iDividendo,iResto:Integer;
Begin
aBase[ 1 ] := 2;
aBase[ 2 ] := 7;
aBase[ 3 ] := 6;
aBase[ 4 ] := 5;
aBase[ 5 ] := 4;
aBase[ 6 ] := 3;
aBase[ 7 ] := 2;
aBase[ 8 ] := 7;
aBase[ 9 ] := 6;
aBase[ 10 ] := 5;
aBase[ 11 ] := 4;
aBase[ 12 ] := 3;
aBase[ 13 ] := 2;
iSoma1 := 0;
iSoma2 := 0;
iImp := 1;
iPar := 2;
For iX := 1 to 13 Do
Begin
aNosso[ iX ] := StrToInt( Copy( pNosso , iX , 1) );
aMulti[ iX ] := aNosso[ iX ] * aBase[ iX ];
aMulti2[ iX ] := IIF( aMulti[ iX ] < 10 , '0','' ) + IntToStr( aMulti[ iX ] );
Inc( iSoma1 , StrToInt(Copy( aMulti2[ iX ],1,1 )) );
Inc( iSoma2 , StrToInt(Copy( aMulti2[ iX ],2,1 )));
Inc( iImp, 2);
Inc( iPar, 2);
End;
aMulti2[ 1 ] := IntToStr(iSoma1)+IntToStr(iSoma2);
iDividendo := StrToInt( aMulti2[ 1 ] ); // 1627
iResto := (iDividendo mod 11);
IF iResto = 0 Then
result := '0';
iResto := 11 - iResto;
IF iResto = 10 Then
result := 'P';
IF iResto < 10 Then
result := IntToStr(iResto);
End;
Segundo o banco para nosso numero = 0900000039874 o valor do digito é zero ( 0900000039874-0 ) mas na minha função só retorna 1.
desde já agradeço.
minha função:
Function DN( pNosso:String):String;
Var
aNosso:Array[1..13] of Integer;
aBase:Array[1..13] of Integer;
aMulti:Array[1..13] of Integer;
aMulti2:Array[1..13] of String;
iX,iSoma1,iSoma2,iPar,iImp,iDividendo,iResto:Integer;
Begin
aBase[ 1 ] := 2;
aBase[ 2 ] := 7;
aBase[ 3 ] := 6;
aBase[ 4 ] := 5;
aBase[ 5 ] := 4;
aBase[ 6 ] := 3;
aBase[ 7 ] := 2;
aBase[ 8 ] := 7;
aBase[ 9 ] := 6;
aBase[ 10 ] := 5;
aBase[ 11 ] := 4;
aBase[ 12 ] := 3;
aBase[ 13 ] := 2;
iSoma1 := 0;
iSoma2 := 0;
iImp := 1;
iPar := 2;
For iX := 1 to 13 Do
Begin
aNosso[ iX ] := StrToInt( Copy( pNosso , iX , 1) );
aMulti[ iX ] := aNosso[ iX ] * aBase[ iX ];
aMulti2[ iX ] := IIF( aMulti[ iX ] < 10 , '0','' ) + IntToStr( aMulti[ iX ] );
Inc( iSoma1 , StrToInt(Copy( aMulti2[ iX ],1,1 )) );
Inc( iSoma2 , StrToInt(Copy( aMulti2[ iX ],2,1 )));
Inc( iImp, 2);
Inc( iPar, 2);
End;
aMulti2[ 1 ] := IntToStr(iSoma1)+IntToStr(iSoma2);
iDividendo := StrToInt( aMulti2[ 1 ] ); // 1627
iResto := (iDividendo mod 11);
IF iResto = 0 Then
result := '0';
iResto := 11 - iResto;
IF iResto = 10 Then
result := 'P';
IF iResto < 10 Then
result := IntToStr(iResto);
End;
Segundo o banco para nosso numero = 0900000039874 o valor do digito é zero ( 0900000039874-0 ) mas na minha função só retorna 1.
desde já agradeço.
Joao Silva
Curtir tópico
+ 0
Responder
Posts
20/09/2013
Rivaildo Junior
Essa função deve lhe ajudar.
function CalcularDigito(const Numero: WideString): WideString;
var
NumeroAtual, digito: String;
soma, peso, resto, ix: Integer;
begin
try
NumeroAtual := Numero;
soma := 0; // inicializando a soma
peso := 2; // inicializando o peso
for ix := Length(NumeroAtual) downto 1 do //loop da ultima posicao a primeira posicao da variavel
begin
soma := soma + StrToInt(copy(NumeroAtual,ix,1))* peso; //soma
peso := peso + 1; //adiconando o peso
if peso > 7 then //quando o peso for 9 move 2 para o peso
peso := 2; //conforme anexo 01 do arquivo remessa
end;
resto := (soma Mod 11); //pegando o resto
digito := IntToStr(11 - resto);
if StrToInt(digito) = 10 then
digito := 'P'
else
begin
if StrToInt(digito) = 11 then
digito := '0';
end;
Result := digito;
except
on E: Exception do
showmessage(E.Message);
end;
function CalcularDigito(const Numero: WideString): WideString;
var
NumeroAtual, digito: String;
soma, peso, resto, ix: Integer;
begin
try
NumeroAtual := Numero;
soma := 0; // inicializando a soma
peso := 2; // inicializando o peso
for ix := Length(NumeroAtual) downto 1 do //loop da ultima posicao a primeira posicao da variavel
begin
soma := soma + StrToInt(copy(NumeroAtual,ix,1))* peso; //soma
peso := peso + 1; //adiconando o peso
if peso > 7 then //quando o peso for 9 move 2 para o peso
peso := 2; //conforme anexo 01 do arquivo remessa
end;
resto := (soma Mod 11); //pegando o resto
digito := IntToStr(11 - resto);
if StrToInt(digito) = 10 then
digito := 'P'
else
begin
if StrToInt(digito) = 11 then
digito := '0';
end;
Result := digito;
except
on E: Exception do
showmessage(E.Message);
end;
Responder
Gostei + 0
26/09/2013
Joao Silva
OBRIGADO! a função funcionou perfeitamente.
Da uma olhada na minha função de digito do código de barras . onde estou errando?
Function DigBarra( pCodigo:String ):String;
Var
iRes,iPos,iDif,iCont,iSoma,iFator:Integer;
dRes:Double;
sVar:String;
Begin
//ShowMessage('TAM_COD = '+ IntToStr( Len(pcodigo) ) );
IF Len(pcodigo) = 43 Then
Begin
iCont:=43;
iFator:=2;
While iCont > 0 Do
Begin
iSoma := iSoma + ( StrToInt( Copy(pCodigo,iCont,1) ) * iFator );
iFator := IIF(iFator=2,3,2);
iCont := iCont-1;
End;
iDif := (iSoma mod 11); // novo...
iRes := 11 - iDif;
IF (iRes=0) or (iRes=1) or (iRes>9) Then
Result := '1'
Else
Result := IntToStr(iRes);
End
Else
ShowMessage('Tamanho do Código Inválido!');
End;
Da uma olhada na minha função de digito do código de barras . onde estou errando?
Function DigBarra( pCodigo:String ):String;
Var
iRes,iPos,iDif,iCont,iSoma,iFator:Integer;
dRes:Double;
sVar:String;
Begin
//ShowMessage('TAM_COD = '+ IntToStr( Len(pcodigo) ) );
IF Len(pcodigo) = 43 Then
Begin
iCont:=43;
iFator:=2;
While iCont > 0 Do
Begin
iSoma := iSoma + ( StrToInt( Copy(pCodigo,iCont,1) ) * iFator );
iFator := IIF(iFator=2,3,2);
iCont := iCont-1;
End;
iDif := (iSoma mod 11); // novo...
iRes := 11 - iDif;
IF (iRes=0) or (iRes=1) or (iRes>9) Then
Result := '1'
Else
Result := IntToStr(iRes);
End
Else
ShowMessage('Tamanho do Código Inválido!');
End;
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)