Jump to content

Recommended Posts

Posted

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.