Sie sind auf Seite 1von 8

Subscrbete

AHORA!
Cdigo de Barras
Explicacin de la codificacin del cdigo de barras con un fuente en VFP que te permite imprimir cdigos de barras sin
usar fonts u otro tipo de utilidades.
Por Luis Martnez
Qu producto no est, hoy en da, identificado por un cdigo de barras? La respuesta es obvia. Muy pocos o ninguno, son los
productos que hoy en da no identifican sus productos con cdigos de barras.
A la pregunta de qu es un cdigo de barras? Se podra afirmar que es un sistema de identificacin automtica, nico, normalizado y
homologado que no slo permite controlar la gestin de stocks y racionalizar el suministro de mercancas, sino que crea nuevos
cauces de comunicacin entre fabricantes y distribuidores.
Cdigo Fuente
Los suscriptores
pueden conseguir
el cdigo en el
fichero
correspondiente a
este nmero de la
revista
Cdigos Fox.2x,
VFP 3.0/5.0/60
Existen distintos tipos de codificacin entre los que destacan el UPC, EAN 13, EAN 8, ... Particularmente, en Espaa el sistema de
codificacin ms extendido es el EAN 13. Este ser el objeto de nuestro estudio y de su posterior codificacin. Grafico 1
Representacin del sistema EAN 13.
El sistema EAN es un conjunto de normas que homogeneizan la numeracin de todos los productos de gran consumo y tiene tres
caractersticas principales:
- Puede ser utilizado por fabricantes y distribuidores en el intercambio y en la mejora de las informaciones.
- Identifica la unidad del producto de forma biunvoca (un cdigo, un producto).
- No es explicativo o significativo: toda la informacin est contenida en el registro de la base de datos al que se accede con el
cdigo.
- Puede recogerse datos en el punto de venta.
La representacin del cdigo EAN se efecta mediante la visualizacin de 13 dgitos que identifican el producto:
- Los dos primeros dgitos/caracteres corresponden al pas. Para el caso que nos ocupa decir que el cdigo numrico asociado a
nuestro pas es el 84. Grafico 2
- Los cinco caracteres siguientes identifican la empresa fabricante del artculo.
- Los cinco siguientes caracteres ser un nmero que identificar cada uno de los productos que la empresa produzca. La empresa
podr poner su propia numeracin de productos.
- Por ltimo, el dgito 13, es un dgito de control y se calcula mediante una sencillo algoritmo matemtico que comentaremos ms
adelante. Este algoritmo elimina cualquier posibilidad de error en la lectura.
Caractersticas del smbolo
La representacin del cdigo se ha de efectuar mediante la simbolizacin de los dgitos de forma que puedan leerse y traducirse
directamente del decodificador, que a travs de la interface se comunica con el ordenador o terminal.
El smbolo estndar est formado por una serie de barras paralelas, de diferente grosor. En la parte inferior del smbolo se representa
el mismo cdigo en cifras para que sea legible.
El smbolo es de tamao variable. Su tamao estndar es de 37,29*26,26 mm., pero este tamao puede variar en funcin de las
medidas del envase o de la etiqueta. En estos casos la variacin est entre el 0,8 y 2 veces el tamao del estndar.
El dgito de control
La utilizacin del dgito de control tiene por objetivo el establecer un mecanismo que evite errores en el tratamiento automtico de los
cdigos EAN.
Pgina1 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
El dgito de control es la ltima cifra del cdigo EAN de un producto. Su clculo se realiza automticamente en funcin del valor de las
posiciones que le preceden en el cdigo, mediante un sencillo algoritmo.
Algoritmo para calcular el dgito de control
Los pasos a seguir a la hora de calcular el dgito de control (para este tipo de simbolizacin EAN-13) son: Grafico 3
Posicin 13 12 11 10 9 8 7 6 5 4 3 2 1
Valores 8 4 1 2 3 4 5 6 7 8 9 0 Control
Corrector1 3 1 3 1 3 1 3 1 3 1 3
Valor*corrector 8 12 1 6 3 12 5 18 7 24 9 0
1.- Multiplicamos por 1 las posiciones impares y por 3 las posiciones pares del cdigo empezando de derecha a izquierda.
Tomemos como ejemplo el siguiente cdigo : 841234567890 sabiendo que el 84 corresponde con el pas, los siguientes 5 dgitos con
la empresa y los ltimos 5 dgitos con el artculo/producto.
2.- Sumamos los valores resultantes.
8+12+1+6+3+12+5+18+7+24+9+0 = 105
3.- Restamos de la decena superior ( es mdulo 10) el valor de la suma de los valores resultantes. El resultado de esta operacin es
el valor del cdigo de control (primera posicin del cdigo de barras).
110 - 105 = 5 ==> valor del cdigo de control.
Otra posibilidad es dividir la suma resultante (105) por 10 siendo el resto de sta divisin el valor del dgito de control.
105 / 10 = 10 Cociente y 5 de resto
El resultado final del cdigo es:
84 12345 67890 5 (EAN-13).
Cmo representar grficamente el cdigo?
Ya sabemos qu tipo de codificacin se utiliza mayoritariamente en Espaa y como averiguar su dgito de control. Pero, cmo
representar el cdigo resultante en forma de cdigo de barras ?
Cada carcter numrico debe tener obligatoriamente dos barras y dos espacios. Para conformar un carcter es necesario la unin de
7 mdulos. Un mdulo es la unidad mnima o bsica del cdigo. Visualmente, un carcter podra representarse como: Grafico 4
Este carcter se compone de 7 mdulos, 2 barras y 2 espacios de diferente grosor (casualmente el grosor de los espacios es el
mismo).
Por norma estndar la anchura de un mdulo es de 0,33 mm. De tal forma que si un carcter dispone de 7 mdulos la anchura total
de un carcter ser: 0,33 mm X 7 = 2,31 mm.
Los juegos de smbolos
Para poder identificar simblicamente los caracteres numricos usando los siete mdulos se definen 3 juegos de caracteres llamados
A, B y C. Cada uno de ellos tiene 10 valores (del 0 al 9), que combinan dos barras y dos espacios para los siete mdulos que
componen cada carcter numrico.
los juegos de caracteres se simbolizan de la siguiente maneraGrafico 5
: El juego A tiene un nmero impar de mdulos oscuros. Por esta razn se dice que el juego de simbolizacin A tiene paridad impar.
Los juegos B y C son juegos de simbolizacin con paridad par (el nmero de mdulos oscuros es par).
Los caracteres auxiliares
Los caracteres auxiliares se componen de la siguiente forma:
Caracteres Auxiliares Nmero de Mdulos
Separador lateral 3
Separador Central 5
Secuencia del mdulo del separador lateralGrafico 6:
Secuencia del mdulo del separador centralGrafico 7:
Como su nombre indica, el separador central est en el centro del smbolo, separando los doce caracteres simbolizados, en dos
grupos de seis. Los mdulos del principio y del final son claros, con lo que de sta forma, los caracteres situados a la izquierda y a la
derecha de este separador central, cambian la alineacin.
Los separadores laterales indican principio y fin de las barras del smbolo. El separador lateral izquierdo se representar con los 3
mdulos laterales ms 11 mdulos claros a la izquierdaGrafico 8.
El separador lateral derecho se representar con los tres mdulos laterales ms 7 mdulos claros a la derechaGrafico 9.
Pgina2 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
Estos mdulos claros deben de existir de tal forma que la omisin de estos, no garantizara la correcta lectura.
El formato del smbolo EAN-13
Volviendo a nuestro cdigo de ejemplo (84 12345 67890 5) veamos qu formato y qu simbolizacin tendra cada uno de los
caracteres dependiendo de la posicin de estos.
El formato, de izquierda a derecha y de mayor a menor posicin , es el siguiente:
Segn nuestro cdigo el carcter dcimo tercero es el 8 (Espaa), como comentbamos antes, el prefijo en Espaa es el 84. Este
carcter no ser representado mediante cdigos de barras quedando a la izquierda del cdigo de barras.
Segn el cuadro siguiente utilizaremos la tabla de simbolizacin A o B para las posiciones del 7 al 12 segn convenga. Del 1 al 6
utilizaremos la tabla C.
El cdigo queda a partir de este momento de la siguiente manera : 8 412345 678905
La tabla de uso de los juegos de caracteres de simbolizacin en el smbolo EAN-13 es la siguiente:
13 12 11 10 9 8 7 6 5 4 3 2 1
(1) (2) (3)
0 A A A A A A
1 A A B A B B
2 A A B B A B
3 A A B B B A
4 A B A A B B C
5 A B B A A B
6 A B B B A A
7 A B A B A B
8 A B A B B A
9 A B B A B A
(1) Valor del dcimo tercer carcter.
(2) J uegos de simbolizacin utilizados en los caracteres de la izquierda.
(3) J uego de simbolizacin utilizado en los caracteres de la derecha.
La parte del cdigo que es representada mediante barras tiene el siguiente formato:
1.- El separador lateral izquierdo incluyendo los 11 mdulos claros a la izquierda.
2.- 6 caracteres numricos, simbolizados por medio de los juegos A y B, que corresponde a los caracteres de la izquierda del
smbolo.
3.- El separador centralGrafico 10.
4.- 6 caracteres numricos, simbolizados por medio del juego de caracteres C, correspondientes a los caracteres de la derecha
del smbolo.
5.- El separador lateral derecho incluyendo los 7 mdulos claros por la derecha.
El siguiente cuadro detalla el nmero de mdulos: A partir de este momento ya tenemos creado nuestro cdigo de barras.
Seremos capaces de desarrollar un programa que imprima cdigos de barras ?
Un ejemplo
Supongamos que tenemos un producto y queremos simbolizarlo mediante cdigos de barras. Una vez tenemos creado y
calculado el cdigo completo el resultado es: 84 23455 01011 0
Comenzando por la izquierda, identificamos el primer carcter/ dgito que nos indica el pas. Con este nmero iremos a la tabla
de uso de los juegos de caracteres para la simbolizacin de los dems caracteres. Para saber el smbolo correspondiente al
carcter 3 del cdigo anterior (posicin 10) seguiremos los pasos siguientes:
1.- Averiguar el valor que corresponde al carcter dcimo tercero (en este caso 8).
2.- I r a la tabla de juegos de caracteres de simbolizacin y situarnos en la fila correspondiente al valor 8.
3.- Seguidamente, nos posicionaremos en la columna correspondiente a la posicin que ocupa el carcter dentro del cdigo.
4.- Esa posicin en la tabla correspondera a un valor (A o B) que identificar qu juego de caracteres he de utilizar; el A o el B.
En este caso, el juego a utilizar es el A.
5.- Vamos a la tabla de los juegos de caracteres y nos posicionamos en la fila correspondiente al valor del carcter a simbolizar
-el valor 3- y en la columna correspondiente al juego de caracteres A.
6.- El contenido de esa posicin en la tabla es la simbolizacin del carcter 3 de la posicin 10 del cdigo a representar. Si
tomamos el 0 como barra clara y el 1 como barra oscura, la simbolizacin del carcter 3 sera 0111101. Grafico 11
La funcin
La funcin cdbarras(...), cuyo cdigo ms adelante se describe, nos permite sacar por impresora el cdigo de barras del tipos
EAN-13A(el ms estndar en Espaa).
Esta funcin contiene una tabla llamada codigos.dbf con la siguiente descripcin de registroGrafico 12
Pgina3 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
El campo codigo contiene el tipo de descripcin de cdigos de barras utilizado (EAN-13). Este campo, en principio, es
puramente informativo a no ser que la funcin permitiera la impresin de distintos tipos de cdigos de barras en el que la
descripcin de este campo pudiera ser de utilidad.
El campo juego contiene la tabla de simbolizacin que se est utilizado para cada dgito, estos van del 0 al 9 como hemos
podido comprobar anteriormente.
Por ltimo, valor contiene la traduccin a 0 y 1 del dgito dependiendo de cada tabla de simbolizacin (juego).
Por qu la longitud del campo valor es 28 y no 7 que es el nmero de mdulos de representacin de cada dgito ?
Cojamos como ejemplo el dgito 9 de la tabla de simbolizacin A. La disposicin de los mdulos sera la siguienteGrafico 13:
Como consecuencia, el contenido del campo valor debera ser (como se explicaba antes) 0 y 1 dependiendo de si el mdulo es
claro u oscuro. El registro tendra que contener = 0001011.
Todo esto es cierto, y el programa funcionara perfectamente pero la visualizacin de cada barra del cdigo sera muy estrecha
(fina) y no se ajustara a las especificaciones propias del EAN-13. Por esta causa, cada uno de los mdulos al traducirlo a 0 y 1
se multiplica por 4 quedando el contenido del registro de esta manera = 0000000000001111000011111111
Parmetros y llamada desde Fox.
La funcin recibe tres parmetros que son :
- El pas al que pertenece, 2 caracteres numricos.
- El cdigo de la empresa , 5 caracteres numricos.
- El cdigo del artculo, 5 caracteres numricos.
Desde la ventana de comandos de FoxPro la llamada a la funcin sera de la siguiente forma:
pais=84
empresa=12345
codproducto=67890
=cdbarras(pais,empresa,codproducto)
El cdigo fuente.
El cdigo fuente de la funcin es el siguiente:
***********************************************************
** Funcin: cdbarras()
***********************************************************
** Objetivo: imprimir un cdigo de barras a partir
** de una especificaciones
***********************************************************
** Parametros :
** pais -->Cdigo del pais
** empresa --> Cdigo de la empresa
** producto --> Cdigo del producto
***********************************************************
** Funciones llamadas: convertir()
***********************************************************
** Procedimientos llamados: control()
***********************************************************
** Tablas utilizadas: codigos.dbf
***********************************************************
** Fecha de creacin: 25-Enero-1995
** Versin : 1.1
***********************************************************
** Autor : Luis Martnez Prez
***********************************************************
FUNCTI ON cdbarras
PARAMETERS pais, empresa, producto
*************************************
** Declara variable de entorno
*************************************
SET TALK OFF
*************************************
** Declara e inicializa variables
*************************************
STORE "" TO codigo, barrasep, codbarras, lin_codigo, lin_sep, lin_blanco, parte1, parte2, digito, vercod
esc = 27 && define el valor ASCI I chr() de la tecla ESC
alto_barra = 300 && Ancho de las barras
Pgina4 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
acumulado = 20 && Ancho de las barras que sobresalen
esp_numeros = 10 && Espacio para los caraceres
modulos = 7 && Nmero de mdulos por caracter
car_control = 0 && caracter de control
posicionh = 20 && posicion horizontal del cursor
tablaA = 1
* nmero de registro de comienzo de los digitos
* de la tabla de simbolizacion A
tablaB = 11 && idem al anterior pero de la tabla B
tablaC = 21 && idem al anterior pero de la tabla C
********************************************
** Define los separadores del cdigo
** de barras pasados a 0 y 1
********************************************
lat_izq = "000000000000111100001111"
lat_der = "111100001111000000000000000000000000000000"
sepcentral = "00001111000011110000"
vacio = "0000000000000000000000000000"
cPais = ALLTRI M(STR(pais))
* Define el parametro pais como una cadena
cPais1 = SUBSTR(cPais,1,1)
* Define cPais en dos partes
cPais2 = SUBSTR(cPais,2,1)
cEmpresa = ALLTRI M(STR(empresa))
*Define el parametro empresa como una cadena
cProducto = ALLTRI M(STR(producto))
* Define el parametro producto como una cadena
parte1 = cPais2 + cEmpresa
* Declara la primera parte del cdigo
parte2 = cProducto + ALLTRI M(STR(car_control))
*Declara y define la segunda parte del cdigo
***************************
** Restaura
***************************
CLOSE ALL
CLOSE DATABASE
CLEAR
**************************************
** Genera el carcter de control
**************************************
DO control
**********************************
** Abre a tabla codigos.dbf
**********************************
USE codigos ALI AS "barras"
SELECT barras
**************************************
** Activa la salida de impresora
**************************************
SET DEVI CE TO PRI NTER
SET CONSOLE OFF
***********************************************
** Clculo para la impresin del cdigo
***********************************************
codbarras = codbarras + lat_izq
barrasep = barrasep + lat_izq
FOR contador = 1 TO LEN(parte1)
I F contador = 1 OR contador = 3 OR contador = 6
go tablaA+val(SUBSTR(parte1,contador,1))
ELSE
go tablaB+val(SUBSTR(parte1,contador,1))
ENDI F
codbarras = codbarras + ALLTRI M(valor)
barrasep = barrasep + vacio
ENDFOR
codbarras = codbarras + sepcentral
barrasep = barrasep + sepcentral
FOR contador = 1 TO LEN(parte2)
Pgina5 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
go tablaC+val(SUBSTR(parte2,contador,1))
codbarras = codbarras + ALLTRIM(valor)
barrasep = barrasep + vacio
ENDFOR
codbarras = codbarras + lat_der
barrasep = barrasep + lat_der
FOR contador = 1 TO (LEN(codbarras)/modulos)
caracter = SUBSTR(codbarras, 1 + (modulos * (contador - 1)), modulos)
lin_codigo = lin_codigo + CHR(convertir(caracter))
ENDFOR
FOR contador = 1 TO (LEN(barrasep)/modulos)
caracter = SUBSTR(barrasep, 1 + (modulos * (contador - 1)), modulos)
lin_sep = lin_sep + CHR(convertir(caracter))
lin_blanco = lin_blanco + CHR(0)
ENDFOR
*****************************************************************
** Configura la impresora antes de empezar a imprimir
** Esta configuracion es propia de las HP II en adelante.
** Para otras impresoras mirar en el manual que acompaa
** a la impresora.
*****************************************************************
_PSCODE = CHR(esc) + "*t300R" + ;
CHR(esc) + "*r0F" + ;
CHR(esc) + "*r1A" + ;
CHR(esc) + "*b0M"
***********************************************************
** Define cada uno de los tipos de lnea que van a
** ser impresas
***********************************************************
lin_codigo = "*b" + LTRIM(STR((LEN(codbarras)/modulos),10,0)) + "W" + lin_codigo
lin_sep = "*b" + LTRIM(STR((LEN(barrasep)/modulos),10,0)) + "W" + lin_sep
lin_blanco = "*b" + LTRIM(STR((LEN(barrasep)/modulos),10,0)) + "W" + lin_blanco
***********************************************************
** Activa la impresora si no estamos en Windows
************************************************************
IF .NOT. _WINDOWS
SET PRINTER ON
ENDIF
************************************************************
** Realiza la impresion del cdigo de barras
************************************************************
** Imprime un linea en blanco
? SPACE(posicionh)
******************************************************************
** Imprime directamente a la impresora la configuracin
** preestablecida
******************************************************************
??? _PSCODE
*************************
** Imprime las barras
*************************
FOR contador = 1 TO alto_barra
??? CHR(esc) + lin_codigo
ENDFOR
************************************************************
** Imprime las barras que sobresalen por debajo
************************************************************
FOR contador = alto_barra TO (alto_barra + acumulado)
?? CHR(esc) + lin_sep
ENDFOR
**************************************************************
** Imprime en blanco 'esp_numeros' puntos
** para luego pode imprimir los numeros en el lugar
** correcto si sobreescribir ninguna linea de codigo
**************************************************************
FOR contador = (alto_barra + acumulado) TO (alto_barra + acumulado + esp_numeros)
??? CHR(esc) + lin_blanco
ENDFOR
**********************************************************
** Inicializa la posicin del cursor en la impresora
**********************************************************
_PCOLNO = posicionh -1
Pgina6 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
******************************************************************
** Define la variable vercod que contiene el cdigo entero
******************************************************************
vercod = cPais1 + space(1) + cPais2 + cEmpresa + space(1) + ;
cproducto + alltrim(str(car_control))
** Imprime en la linea actual de la impresora el codigo
?? vercod
***************************************************************
** Desactiva la impresora si no estamos en Windows
***************************************************************
IF .NOT. _WINDOWS
SET PRINTER OFF
ENDIF
******************************************************************
** Procedimiento : Control
** Objetivo : Calcula el dgito/cdigo de control segn las
** especificaciones EAN-13 y en su caso AECOC
**
** La formula utilizada es la detallada en el artculo
******************************************************************
PROCEDURE control
************************************************
** Inicializa las variables auxiliares para
** generar el dgito/cdigo de control
************************************************
STORE "" TO auxiliar
STORE 0 TO dividendo, posnum, resto
STORE 3 TO pospar
STORE 1 TO posimpar
STORE 10 TO divisor
auxiliar = cPais + cEmpresa + cProducto
* Calula el valor
FOR contador = 1 TO LEN(auxiliar)
posnum=VAL(SUBSTR(auxiliar, contador,1))
IF MOD(contador, 2) = 0
dividendo = dividendo + (posnum * pospar)
ELSE
dividendo = dividendo + (posnum * posimpar)
ENDIF
ENDFOR
resto = MOD(dividendo, divisor)
** car_control es el valor del caracter de control
car_control = divisor - resto
RETURN
****************************************************************
** Funcin : convertir
** Objetivo : Pasa los caracteres 0 y 1 tomados de
** 7 en 7 (nmero de mdulos por carcter)
** a un carcter ASCII
** Recibe como parmetro una cadena de 7 caracteres
** del tipo "0011010" por ejemplo
****************************************************************
FUNCTION convertir
PARAMETER caracter
***************************************
** Inicializa las variables locales
***************************************
STORE 0 TO val_chr
STORE 0 TO contador1
**********************************************************
** Gestiona uno a uno cada dgito pasado por la
** variable carcter.
**********************************************************
FOR contador1 = 1 TO LEN(caracter)
IF SUBSTR(caracter, contador1, 1) = "1"
val_chr = (2^(6 - (contador1-1))) + val_chr
ENDIF
ENDFOR
** En val_chr devuelve el valor ASCII
RETURN val_chr
Conclusin
Pgina7 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...
A partir de esta funcin cada uno puede crear su propio formato de cdigo de barras, o bien manipular la funcin para su uso
particular o profesional.
Luis Martnez es diplomado en informtica e Ingeniero Novell
Por Luis Martnez
Copyrights 1998 by FoxPress, All rights reserved
FoxPress, Noviembre 1998
Pgina8 de8 Cdigo de Barras
24/08/2014 file:///G:/Books/Docs%20Codigo%20de%20Barras/Fox%20Pro/Cdigo%20de%20Barra...

Das könnte Ihnen auch gefallen