mrodrigues Posted October 27, 2005 at 08:26 AM Report #5875 Posted October 27, 2005 at 08:26 AM 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
Bruno Posted October 27, 2005 at 09:04 AM Report #5876 Posted October 27, 2005 at 09:04 AM Porque não usaste o bloco "Code"! 😄
deathseeker25 Posted October 27, 2005 at 04:33 PM Report #5887 Posted October 27, 2005 at 04:33 PM Tópico editado com as tags code... ;)
AriOps Posted October 27, 2005 at 05:35 PM Report #5889 Posted October 27, 2005 at 05:35 PM não tenho a certeza, mas se calhar isto pode provar-se útil para o nosso KISC... Daniel Correia
vbmaster Posted October 27, 2005 at 06:33 PM Report #5893 Posted October 27, 2005 at 06:33 PM também pensei nisso...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now