GARANTIR DESCONTO

Fórum Dica - Validar código GTIN #462148

26/11/2013

0

Pessoal, tive necessidade esses dias de criar uma rotina que valide códigos GTIN. Como não achei nada parecido, decidi criar a minha própria e postar aqui, caso alguém mais precise. E claro, críticas, correções e sugestões são muito bem vindas!


P.S.: Pra quem não sabe o código GTIN é o famoso código de barras, também conhecido com EAN. O código GTIN é aceito no SPED se tiver 8, 12, 13 ou 14 posições. Nos meus testes eu utilizei códigos GTIN-13 (maioria no Brasil). Segue o código:

function ValidaGTIN(AGTIN: string): boolean;
var
  i, soma, resultado, base10: integer;
begin
  //Verifica se todos os caracteres de AGTIN são números
  for i:= 1 to Length(AGTIN) do
    if not (AGTIN[i] in ['0'..'9']) then
    begin
      Result:= False;
      Exit;
    end;
  //Verifica se AGTIN tem o tamanho necessário
  if Length(AGTIN) in [8,12,13,14] then
  begin
    soma:= 0;
    for i:= 1 to (Length(AGTIN) -1) do
    begin
      //Se for par, multiplica por 3. Se ímpar, por 1
      if Odd(i) then
        soma:= soma + (strtoint(AGTIN[i]) * 1)
      else
        soma:= soma + (strtoint(AGTIN[i]) * 3);
    end;
    base10:= soma;
    //Verifica se base10 é múltiplo de 10
    if not (base10 mod 10 = 0) then
    begin
      while not (base10 mod 10 = 0) do
      begin
        base10:= base10 + 1;
      end;
    end;
    resultado:= base10 - soma;
    //Verifica se o resultado encontrado é igual ao caractere de controle
    if resultado = strtoint(AGTIN[Length(AGTIN)]) then
      Result:= True
    else
      Result:= False;
  end
  else
    Result:= False;
end;


A título de informação, minha fonte para o cálculo do GTIN foi este site: [url]http://www.gs1.org/barcodes/support/check_digit_calculator[/url]

Um abraço a todos!
Jonathan Lazaro

Jonathan Lazaro

Responder

Post mais votado

26/11/2013

Agora que percebi que tinha cometido um erro... Apenas no GTIN-13 os números das posições ímpares são multiplicados por 1 e os pares por 3. Em todos os outros ocorre o inverso.


Portanto, segue agora o código (certo, espero eu!):

class function TValida.ValidaGTIN(AGTIN: string): boolean;
var
  i, soma, resultado, base10: integer;
begin
  //Verifica se todos os caracteres de AGTIN são números
  for i:= 1 to Length(AGTIN) do
    if not (AGTIN[i] in ['0'..'9']) then
    begin
      Result:= False;
      Exit;
    end;
  //Verifica se AGTIN tem o tamanho necessário
  if Length(AGTIN) in [8,12,13,14] then
  begin
    soma:= 0;
    for i:= 1 to (Length(AGTIN) -1) do
    begin
      if Length(AGTIN) = 13 then
      begin
        if Odd(i) then
          soma:= soma + (strtoint(AGTIN[i]) * 1)
        else
          soma:= soma + (strtoint(AGTIN[i]) * 3);
      end
      else
      begin
        if Odd(i) then
          soma:= soma + (strtoint(AGTIN[i]) * 3)
        else
          soma:= soma + (strtoint(AGTIN[i]) * 1);
      end;
    end;
    base10:= soma;
    //Verifica se base10 é múltiplo de 10
    if not (base10 mod 10 = 0) then
    begin
      while not (base10 mod 10 = 0) do
      begin
        base10:= base10 + 1;
      end;
    end;
    resultado:= base10 - soma;
    //Verifica se o resultado encontrado é igual ao caractere de controle
    if resultado = strtoint(AGTIN[Length(AGTIN)]) then
      Result:= True
    else
      Result:= False;
  end
  else
    Result:= False;
end;

Jonathan Lazaro

Jonathan Lazaro
Responder

Gostei + 3

Mais Posts

19/08/2015

João Batista

Rapaz, funcionou que é uma beleza, obrigado pela inciativa de compartilhar o código. Grande abraço,
Responder

Gostei + 1

01/02/2017

Jonatas Alves

Olá,

Muito obrigado Jonathan por compartilhar esta function.

grato!
Responder

Gostei + 0

22/01/2018

Rodrigo Menin

Sou novo por aqui, e achei interessante seu código;
desculpe minha ignorância, pois poderia mostrar como se aplica pra obter o resultado?
Responder

Gostei + 0

22/01/2018

Jonathan Lazaro

Sou novo por aqui, e achei interessante seu código;
desculpe minha ignorância, pois poderia mostrar como se aplica pra obter o resultado?


Boa tarde, Rodrigo!

Então, eu tenho que te falar que não mexo com Delphi há bastante tempo... Porém, se a sua dúvida é "como utilizar esse código dentro de uma aplicação Delphi", tem várias maneiras de se fazer isso.

No caso específico que me motivou a escrever este código, ele era um método estático (por isso "class function") que estava dentro de uma classe chamada TValida, onde pelo nome já dá pra sacar que eu tinha diversas validações. O método retorna um booleano, ou seja, bastaria um jogo de if..else pra fazer a checagem.

if TValida.ValidaGTIN(txtCodBarras.Text) then
ShowMessage('Código de barras ok!');
else
ShowMessage('Código de barras inválido!');
end


Lembrando que isso é só um exemplo. A forma de tratar o fluxo da condição depende de como você pretende utilizar o código.
Se ficar alguma dúvida, só falar! Abraço!
Responder

Gostei + 0

09/08/2019

Claudio

Parabéns pela iniciativa!!!
Responder

Gostei + 0

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

Aceitar