GARANTIR DESCONTO

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.

Joao Silva

Joao Silva

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

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar