Ir para conteúdo
  • Cadastre-se

dev botao

Cálculo do DV em EAN13


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 1968 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Olá a todos,

Estou gerando códigos de barras In-Store para produtos sem código de barras, o problema está no cálculo do Dígito Verificador. 

O ACBr tem alguma função que efetue tal cálculo?

  • Membros Pro
Postado

Olá amigo, vou te mostrar como faço na minha aplicação veja se te ajuda.

Function EAN13( CodigoDeBarras : String ) : String;
Var
  nX, nPeso,   nDigito: Integer;
  nSoma, nMaior  : Double;
Begin
  nPeso := 3;
  nSoma := 0;

  For nX := 12 DownTo 1 do
  Begin

    nSoma := nSoma + StrToInt( CodigoDeBarras[ nX ] ) * nPeso;

    If nPeso = 3 Then
       nPeso := 1
    Else
    nPeso := 3;

 End;

 nMaior      := ( ( Trunc( nSoma / 10 ) + 1 ) * 10 );
 nDigito  := Trunc( nMaior ) - Trunc( nSoma );
 If nDigito = 10 Then
     nDigito := 0;
 Result := IntToStr( nDigito );
End;

//Abaixo veja como uso parte da função acima.

Var

    codigo, digito, vCOD_BARRA_GERADO : string;

begin

    digito := FormatFloat('789000000000', StrToFloat(QrProdutoidproduto.Text)); 
    codigo := codigo + ean13(digito); 

    vCOD_BARRA_GERADO := digito + codigo;

end;

  • Curtir 1
  • Obrigado 1
  • Fundadores
  • Solution
Postado

Realmente não parece haver um método público, no ACBr que faça exatamente essa função... mas lendo os fontes... temos:

  function CalcularDV(ACodigoGTIN: String): String;
  var
    Dig, I, DV: Integer;
  begin
    DV := 0;
    Result := '' ;

    // adicionar os zeros a esquerda, se não fizer isso o cálculo não bate
    // limite = tamanho maior codigo (gtin14) - 1 (digito)
    ACodigoGTIN := PadLeft(ACodigoGTIN, 13, '0');

    for I := Length(ACodigoGTIN) downto 1 do
    begin
      Dig := StrToInt(ACodigoGTIN[I]);
      DV  := DV + (Dig * IfThen(odd(I), 3, 1));
    end;

    DV := (Ceil(DV / 10) * 10) - DV ;
    Result := IntToStr(DV);
  end;    

 

  • Curtir 2
  • Obrigado 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado
6 horas atrás, Daniel Simoes disse:

Realmente não parece haver um método público, no ACBr que faça exatamente essa função... mas lendo os fontes... temos:


  function CalcularDV(ACodigoGTIN: String): String;
  var
    Dig, I, DV: Integer;
  begin
    DV := 0;
    Result := '' ;

    // adicionar os zeros a esquerda, se não fizer isso o cálculo não bate
    // limite = tamanho maior codigo (gtin14) - 1 (digito)
    ACodigoGTIN := PadLeft(ACodigoGTIN, 13, '0');

    for I := Length(ACodigoGTIN) downto 1 do
    begin
      Dig := StrToInt(ACodigoGTIN[I]);
      DV  := DV + (Dig * IfThen(odd(I), 3, 1));
    end;

    DV := (Ceil(DV / 10) * 10) - DV ;
    Result := IntToStr(DV);
  end;    

 

Meu amigo, surgiram duas dúvidas...

Nessa função existe um chamado a função IfThen, mas a mesma está tanto na unit StrUtils e na unit Math. Minhas dúvidas são:

1º - De qual dessas units o Delphi tem que chamar o IfThen para funcionamento correto do CalcularDV?

2º - Nessa unit (ACBrValidador.pas) que consta a função CalcularDV, existe em uses tanto a StrUtils quanto a Math, portanto como o Delphi sabe de qual unit ele deve chamar o IfThen?

 

  • Moderadores
Postado
13 horas atrás, doidopb disse:

Meu amigo, surgiram duas dúvidas...

Nessa função existe um chamado a função IfThen, mas a mesma está tanto na unit StrUtils e na unit Math. Minhas dúvidas são:

1º - De qual dessas units o Delphi tem que chamar o IfThen para funcionamento correto do CalcularDV?

2º - Nessa unit (ACBrValidador.pas) que consta a função CalcularDV, existe em uses tanto a StrUtils quanto a Math, portanto como o Delphi sabe de qual unit ele deve chamar o IfThen?

De acordo com o tipo dos parâmetros informados.

Para tipos numéricos, vai ser usada a função da unit Math, para string, StrUtils.

Se houver a mesma função com mesma assinatura (quantidade e tipagem dos parâmetros) em duas units diferentes, o Delphi vai usar a que for informada por último na cláusula uses.

  • Curtir 3
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.