Fórum Dica - Validar código GTIN #462148
26/11/2013
0
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
Curtir tópico
+ 2Post mais votado
26/11/2013
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
Gostei + 3
Mais Posts
19/08/2015
João Batista
Gostei + 1
01/02/2017
Jonatas Alves
Muito obrigado Jonathan por compartilhar esta function.
grato!
Gostei + 0
22/01/2018
Rodrigo Menin
desculpe minha ignorância, pois poderia mostrar como se aplica pra obter o resultado?
Gostei + 0
22/01/2018
Jonathan Lazaro
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!
Gostei + 0
09/08/2019
Claudio
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)