• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

mrodrigues

Código de Barras EAN13

5 mensagens neste tópico

Uma das mais fáceis normas de Códigos de Barras, a EAN-13, e também a mais usada. Qualquer artigo que comprem tem sem dúvida alguma 1 Código de Barras EAN-13. Se um dia precisarem de colocar um código de barras (número) num campo específico, numa tabela de Artigos de uma base de dados SQL Server, podem usar a seguinte função, ou então retirar daqui o algoritmo e implementa-lo noutra linguagem qualquer.

/* 
   Aceita um parametro valor com 12 digitos ou vazio '', e um iRange que 
   serve para os últimos 5 digitos (código único para um artigo)
*/ 
CREATE FUNCTION dbo.fngaGerarCodBarEAN13 (@vcCodigoBarras VARCHAR(12), @iRange INTEGER)
   RETURNS VARCHAR(13)
BEGIN

/* variáveis que servem de constante, para os primeiros 3 digitos - País, e Código de Empresa (4 digitos) que por sua vez é único para cada empresa */
DECLARE @Country CHAR(3)
DECLARE @Company CHAR(4)

SET @Country = '560' /* Portugal */
SET @Company = '0000' /* Whatever.... */

DECLARE @i INTEGER
DECLARE @CalcSoma INTEGER
DECLARE @Remainder TINYINT

/* se a string não vier vazia... */
IF LEN(@vcCodigoBarras) <> 0 
   IF LEN(@vcCodigoBarras) < 12 /* se for menor que 12.. (inválido) */
       RETURN (NULL) /* Retorna NULL - corresponderá a erro */
   ELSE
	GOTO LABEL_CHECK_DIGIT /* senão, vai calcular.. */
ELSE
BEGIN 
/* Neste caso, gera o Código de Barras consoante os dados
e vai gerar o CheckDigit */
SET @vcCodigoBarras	= @Country + @Company + CONVERT(VARCHAR(5), @iRange)
GOTO LABEL_CHECK_DIGIT
END

LABEL_CHECK_DIGIT:
SET @i = 12
SET @CalcSoma = 0
WHILE (@i > 0) /* Enquanto 12 maior que 0.. */
BEGIN
   IF @i % 2 = 0 /* Aos números de posição Par, multiplica 3 */ 
       SET @CalcSoma = @CalcSoma + 3 * CONVERT(INTEGER, SUBSTRING(@vcCodigoBarras, @i, 1)) /* Soma */
   ELSE     
       SET @CalcSoma = @CalcSoma + CONVERT(INTEGER, SUBSTRING(@vcCodigoBarras, @i, 1)) /* Soma */
SET @i = @i - 1 /* Decrementa posição */
END
/* Achar o CheckDigit final */
SET @Remainder = @CalcSoma - CONVERT(TINYINT, @CalcSoma / 10) * 10
IF @Remainder = 0
   RETURN (@vcCodigoBarras + '0')
ELSE
   RETURN (@vcCodigoBarras + CONVERT(CHAR(1), 10 - @Remainder))

RETURN (NULL)

END

/*

Pode ser que seja útil.

A base explicativa do algoritmo, foi tirada deste site:

http://www.barcodeisland.com/ean13.phtml

PS:. Isto não indenta porquê?

*/

Abraços

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não tenho a certeza, mas se calhar isto pode provar-se útil para o nosso KISC...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora