Ir para conteúdo
  • Cadastre-se

dev botao

Função para Gerar EAN8 e 13 a partir de um número


  • Este tópico foi criado há 4379 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

marcelo_sp muito obrigado, valeu pelos fontes.

Eu havia feito uma rotina semelhante para gerar o ean8 porem no validador não validava então achei que eu estava errado. porém os ean8 gerados na sua rotina também não validão pelo menos da maneiro que estou fazendo. exemplo.

Caso o usuário não coloque o código de barras, o meu sistema vai gerar um a partir do código sequencia do sistema. ou seja.

o produto com codigo 20 vira no ean13 0000000000208 e isso valida direitinho.

ja no ean 8 o codigo 20 vira 00000204 e isso não valida.

Eu estou usando a seguinte rotina para validar:

if Trim(Edit9.Text)<>EmptyStr then

begin

ACBrValidador1.TipoDocto:=docGTIN;

ACBrValidador1.Documento:=Edit9.Text;

if ACBrValidador1.Validar then

begin

end else

begin

Edit9.Clear;

Edit9.Text:='';

Edit9.SetFocus;

end;

end;

O que estou fazendo de errado?

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Essa atualização para o calculo dos GTINs foi feita a muito tempo, inclusive foi eu e o André que fizemos e testei com uma massa de dados enorme, estava tudo OK, já deve ter quase 1 ano que foi feito.

Verifique se o seu arquivo não está com problemas e não foi atualizado, uma boa seria apagar o arquivo ACBrValidador.pas e efetuar a atualização o tortoise vai baixar novamente o arquivo que está no repositório.

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

O André tem razão , a função abaixo esta validando com o digito 8 e não 4 para o código '0000020' !!!

function Valida_EAN(vEan: String): Boolean ;

var

Temp1, Temp2, Digito: Integer;

Temp3, Temp4: String;

begin

Result := False;

Temp2 := 0;

Temp3 := '';

if ((Length(vEan) <> 8) and (Length(vEan) <> 12) and (Length(vEan) <> 13) and (Length(vEan) <> 18)) then

Exit;

Temp4 := '31313131313131313';

Temp4 := Copy(Temp4,(Length(Temp4)-Length(vEan)),Length(vEan)-1);

Digito := StrToInt(Copy(vEan,Length(vEan),1));

Temp3 := Copy(vEan,1,Length(vEan)-1);

for Temp1 := 1 to Length(Temp3) do

Temp2 := Temp2+StrToInt(Temp3[Temp1])*StrToInt(Temp4[Temp1]);

Temp2:=10-Round(Frac(Temp2/10)*10);

if Temp2 = 10 then

Temp2 := 0 ;

Result := (Temp2 = Digito);

end;

Link para o comentário
Compartilhar em outros sites

Fabio , a função de teste que calcula EAN8 que postei esta incorreta como a sua ! , conhecidiu da que postei retornar o mesmo valor que a sua , na verdade '0000020' tem o digito verificador = 8 e não 4 , por isso que o ACBrValidador estava retornando False , me equivoquei com aquela função que para EAN13 esta correta mas para EAN8 não , retorne o fonte anterior do ACBrValidador.pas que esta correto , e modifique a função abaixo para que result em string pro seu uso e não boolean , testei varios codigos com esta função e deu certo , foi de grande valia o link do post que o André informou para que possamos testar esses GTIN's ! Obrigado Andre e Regys .

Function Valida_EAN(vEan: String): Boolean ;

var

Temp1, Temp2, Digito: Integer;

Temp3, Temp4: String;

begin

Result := False;

Temp2 := 0;

Temp3 := '';

if ((Length(vEan) <> 8) and (Length(vEan) <> 12) and (Length(vEan) <> 13) and (Length(vEan) <> 18)) then

Exit;

Temp4 := '31313131313131313';

Temp4 := Copy(Temp4,(Length(Temp4)-Length(vEan)),Length(vEan)-1);

Digito := StrToInt(Copy(vEan,Length(vEan),1));

Temp3 := Copy(vEan,1,Length(vEan)-1);

for Temp1 := 1 to Length(Temp3) do

Temp2 := Temp2+StrToInt(Temp3[Temp1])*StrToInt(Temp4[Temp1]);

Temp2:=10-Round(Frac(Temp2/10)*10);

if Temp2 = 10 then

Temp2 := 0 ;

Result := (Temp2 = Digito);

end;

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 4379 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.