Sei sulla pagina 1di 9

Cdigos de barra en reportes de Visual FoxPro

1 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

Cdigos de barra en reportes de Visual FoxPro


Por Luis Mara Guayn - Tucumn - Argentina

Contenido
En este documento se describe la forma de aadir cdigos de barra a los reportes de Visual FoxPro, para su
impresin con fuentes True Type. Los cdigos de barra tratados aqu son los siguientes:
Cdigo 39
Cdigo 128
EAN-13
EAN-8
Para lograr esto, aparte de las fuentes True Type, se necesitan funciones definidas por el usuario en VFP,
que conviertan el texto a codificar en el formato adecuado segn cada cdigo y cada fuente True Type. Las
fuentes True Type y las funciones se encuentran mas abajo.
Al final del documento se encuentran ejemplos de uso de las funciones, una muestra de los resultados
obtenidos en reportes de VFP, y notas para su mejor implementacin.

Cdigos de Barra
Solo haremos una breve descripcin de cada uno de los posibles cdigos, para elegir el mas adecuado para
la aplicacin que vamos a implementar.
Cdigo 39
Este cdigo es de longitud variable, cuya limitacin en el largo la da el espacio disponible para imprimir y la
capacidad del lector de cdigo de barra que usaremos.
El juego de caracteres del cdigo 39 incluye 43 caracteres: los dgitos 0-9, las letras A-Z (mayscula
solamente), el espacio y los siguientes smbolos: - + . $ / *. El "*" es el carcter de inicio y final del
cdigo, por lo que no deber usarse en un texto a codificar.
Cada caracter se compone de 5 barras y 4 espacios. 3 de estos 9 elementos son anchos (de all el nombre
"3 de 9") y 6 angostos.
El cdigo 39 se forma de la siguiente manera:
Start + Cadena + End
Cdigo 128
Este tambin es un cdigo de longitud variable, y menos largo que el cdigo 39.
El cdigo 128 incluye los dgito 0-9, letras A-Z (maysculas y minsculas), y todos los caracteres
estndares ASCII (en total 128 caracteres, de all su nombre).
El cdigo 128 se divide en tres subconjuntos A, B, y C.
El subconjunto A incluye: los dgitos, las letras maysculas, y los cdigos de control.
El subconjunto B incluye: los dgitos, las letras maysculas y minsculas, y los cdigos de control.
El subconjunto C incluye: solo los dgitos y comprime dos dgitos numricos en cada carcter,

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

2 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

proporcionando una densidad excelente.


Este cdigo tiene un dgito de control que ofrece mas seguridad en la lectura. Dicho dgito de control se
calcula con el siguiente algoritmo:
* Valor de inicio del subconjunto A = 203
* Valor de inicio del subconjunto B = 204
* Valor de inicio del subconjunto C = 205
* Valor de final de todos los subconjuntos = 206
Suma = valor del caracter de inicio del subconjunto
Por cada caracter a codificar
Suma = Suma + (valor de cada caracter * posicion)
Final de los caracteres
Dgito de control = mdulo 103 de Suma
Los cdigos 128 se forman de la siguiente manera:
Start + Cadena + Check_Digit + End
Cdigo EAN-13 y EAN-8 (European Article Numbering)
El EAN-13 se utiliza por todo el mundo para las mercaderas de venta al por menor. Es de longitud fija (13
caracteres). El EAN-8 es una versin acortada del cdigo EAN-13 e incluye solo 8 caracteres.
Estos cdigos los asigna y controla EAN International (http://www.ean.be) y las entidades autorizadas por
EAN en cada pas.
En el cdigo Ean-13, los primeros 6 dgitos representan el pas y la empresa, los siguientes 6 dgitos
representan el producto, y el restante es el dgito de control. Aparte del pas, los primeros dos o tres
dgitos pueden representar por ejemplo: libros (ISBN), peridicos (ISSN), usos internos, etc.
En el cdigo Ean-8, los primeros 4 dgitos representan el pas y la empresa, los siguientes 3 dgitos
representan el producto, y el restante es el dgito de control.
El dgito de control se calcula con el siguiente algoritmo:
Suma = 0
Por cada uno de los 12
Valor corrector = 1
Suma = Suma + Valor
Final de los dgitos
Digito de control = 10
Si Digito de control =
Digito de control =
Final Si

7 dgitos a codificar
si la posicin del dgito es impar 3 si la posicin es par
del dgito * Valor corrector
- mdulo 10 de Suma
10
0

Los cdigos EAN se forman de la siguiente manera:


Cdigo_Pas + Cdigo_Empresa + Codigo_Artculo + Check_Digit

Fuentes True Type


Las fuentes True Type que se usan en estos ejemplo, son archivos shareware descargados de Internet y
funcionan perfectamente con las funciones para VFP descritas mas abajo.
A las fuentes utilizadas se las puede descargar de: fuentes.zip (11,9 Kb.)
Para una mejor impresin y lectura de los cdigos, se aconseja utilizar los tamaos de fuentes que a
continuacin se detallan:

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

3 de 9

Fuente True Type

http://www.fpress.com/revista/Num9905/Barras.htm

Archivo

Tamao

3 of 9 Barcode

3of9.ttf

20 22

Barcode128

Bcode128.ttf

22

EanP36Tt

Ean13_36.ttf

36

EanP72Tt

Ean13_72.ttf

72

Funciones en VFP
A continuacin se detallan las funciones en VFP que transforman un texto al formato de cdigo de barra
elegido.
Estas funciones se las puede descargar de: funcion.zip (1,9 Kb.)
*-------------------------------------------------------------------------* FUNCTION _StrTo39(tcString)
*-------------------------------------------------------------------------* Convierte un string para ser impreso con
* fuente True Type Barcode 3 of 9
* USO: _StrTo39("Codigo 39")
* RETORNA: Caracter
* AUTOR: Luis Mara Guayn
*-------------------------------------------------------------------------FUNCTION _StrTo39(tcString)
lcRet = "*"+tcString+"*"
RETURN lcRet
ENDFUNC
*-------------------------------------------------------------------------* FUNCTION _StrTo128A(tcString)
*-------------------------------------------------------------------------* Convierte un string para ser impreso con
* fuente True Type Barcode 128 A
* Caracteres numricos y alfabticos (solo maysculas)
* Si un caracter es no vlido lo reemplaza por espacio
* USO: _StrTo128A("CODIGO 128")
* RETORNA: Caracter
* AUTOR: Luis Mara Guayn
*-------------------------------------------------------------------------FUNCTION _StrTo128A(tcString)
LOCAL lcStart, lcStop, lcRet, lcCheck, ;
lnLong, lnI, lnCheckSum, lnAsc
lcStart = CHR(103 + 32)
lcStop = CHR(106 + 32)
lnCheckSum = ASC(lcStart) - 32
lcRet = tcString
lnLong = LEN(lcRet)
FOR lnI = 1 TO lnLong
lnAsc = ASC(SUBS(lcRet,lnI,1)) - 32
IF NOT BETWEEN(lnAsc, 0, 64)
lcRet = STUFF(lcRet,lnI,1,CHR(32))
lnAsc = ASC(SUBS(lcRet,lnI,1)) - 32
ENDIF
lnCheckSum = lnCheckSum + (lnAsc * lnI)
ENDFOR
lcCheck = CHR(MOD(lnCheckSum,103) + 32)

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

4 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

lcRet = lcStart + lcRet + lcCheck + lcStop


*--- Esto es para cambiar los espacios y caracteres invalidos
lcRet = STRTRAN(lcRet, CHR(32), CHR(232))
lcRet = STRTRAN(lcRet, CHR(127), CHR(192))
*--RETURN lcRet
ENDFUNC
*-------------------------------------------------------------------------* FUNCTION _StrTo128B(tcString)
*-------------------------------------------------------------------------* Convierte un string para ser impreso con
* fuente True Type Barcode 128 B
* Caracteres numricos y alfabticos (maysculas y minsculas)
* Si un caracter es no vlido lo reemplaza por espacio
* USO: _StrTo128B("Codigo 128")
* RETORNA: Caracter
* AUTOR: Luis Mara Guayn
*-------------------------------------------------------------------------FUNCTION _StrTo128B(tcString)
LOCAL lcStart, lcStop, lcRet, lcCheck, ;
lnLong, lnI, lnCheckSum, lnAsc
lcStart = CHR(104 + 32)
lcStop = CHR(106 + 32)
lnCheckSum = ASC(lcStart) - 32
lcRet = tcString
lnLong = LEN(lcRet)
FOR lnI = 1 TO lnLong
lnAsc = ASC(SUBS(lcRet,lnI,1)) - 32
IF NOT BETWEEN(lnAsc, 0, 99)
lcRet = STUFF(lcRet,lnI,1,CHR(32))
lnAsc = ASC(SUBS(lcRet,lnI,1)) - 32
ENDIF
lnCheckSum = lnCheckSum + (lnAsc * lnI)
ENDFOR
lcCheck = CHR(MOD(lnCheckSum,103) + 32)
lcRet = lcStart + lcRet + lcCheck + lcStop
*--- Esto es para cambiar los espacios y caracteres invalidos
lcRet = STRTRAN(lcRet, CHR(32), CHR(232))
lcRet = STRTRAN(lcRet, CHR(127), CHR(192))
*--RETURN lcRet
ENDFUNC
*-------------------------------------------------------------------------* FUNCTION _StrTo128C(tcString)
*-------------------------------------------------------------------------* Convierte un string para ser impreso con
* fuente True Type Barcode 128 C
* Solo caracteres numricos
* USO: _StrTo128C("01234567")
* RETORNA: Caracter
* AUTOR: Luis Mara Guayn
*-------------------------------------------------------------------------FUNCTION _StrTo128C(tcString)
LOCAL lcStart, lcStop, lcRet, lcCheck, lcCar;
lnLong, lnI, lnCheckSum, lnAsc

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

5 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

lcStart = CHR(105 + 32)


lcStop = CHR(106 + 32)
lnCheckSum = ASC(lcStart) - 32
lcRet = ALLTRIM(tcString)
lnLong = LEN(lcRet)
*--- La longitud debe ser par
IF MOD(lnLong,2) # 0
lcRet = "0" + lcRet
lnLong = LEN(lcRet)
ENDIF
*--- Convierto los pares a caracteres
lcCar = ""
FOR lnI = 1 TO lnLong STEP 2
lcCar = lcCar + CHR(VAL(SUBS(lcRet,lnI,2)) + 32)
ENDFOR
lcRet = lcCar
lnLong = LEN(lcRet)
FOR lnI = 1 TO lnLong
lnAsc = ASC(SUBS(lcRet,lnI,1)) - 32
lnCheckSum = lnCheckSum + (lnAsc * lnI)
ENDFOR
lcCheck = CHR(MOD(lnCheckSum,103) + 32)
lcRet = lcStart + lcRet + lcCheck + lcStop
*--- Esto es para cambiar los espacios y caracteres invalidos
lcRet = STRTRAN(lcRet, CHR(32), CHR(232))
lcRet = STRTRAN(lcRet, CHR(127), CHR(192))
*--RETURN lcRet
ENDFUNC
*-------------------------------------------------------------------------* FUNCTION _StrToEan13(tcString, .T.)
*-------------------------------------------------------------------------* Convierte un string para ser impreso con
* fuente True Type EAN-13
* PARAMETROS:
*
tcString: Caracter de 12 dgitos (0..9)
*
tlCheckD: .T. Solo genera el dgito de control
*
.F. Genera dgito y caracteres a imprimir
* USO: _StrToEan13("123456789012")
* RETORNA: Caracter
* AUTOR: Luis Mara Guayn
*-------------------------------------------------------------------------FUNCTION _StrToEan13(tcString, tlCheckD)
LOCAL lcLat, lcMed, lcRet, lcJuego, ;
lcIni, lcResto, lcCod, ;
lnI, lnCheckSum, lnAux, laJuego(10), lnPri
lcRet=ALLTRIM(tcString)
IF LEN(lcRet) # 12
*--- Error en parmetro
*--- debe tener un len = 12
RETURN ""
ENDIF
*--- Genero dgito de control
lnCheckSum=0

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

6 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

FOR lnI = 1 TO 12
IF MOD(lnI,2) = 0
lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 3
ELSE
lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 1
ENDIF
ENDFOR
lnAux = MOD(lnCheckSum,10)
lcRet = lcRet + ALLTRIM(STR(IIF(lnAux = 0, 0, 10-lnAux)))
IF tlCheckD
*--- Si solo genero dgito de control
RETURN lcRet
ENDIF
*--- Para imprimir con fuente True Type EAN13
*--- 1er. dgito (lnPri)
lnPri = VAL(LEFT(lcRet, 1))
*--- Tabla de Juegos de Caracteres
*--- segn "lnPri" (NO CAMBIAR!)
laJuego(1) = "AAAAAACCCCCC"
&& 0
laJuego(2) = "AABABBCCCCCC"
&& 1
laJuego(3) = "AABBABCCCCCC"
&& 2
laJuego(4) = "AABBBACCCCCC"
&& 3
laJuego(5) = "ABAABBCCCCCC"
&& 4
laJuego(6) = "ABBAABCCCCCC"
&& 5
laJuego(7) = "ABBBAACCCCCC"
&& 6
laJuego(8) = "ABABABCCCCCC"
&& 7
laJuego(9) = "ABABBACCCCCC"
&& 8
laJuego(10) = "ABBABACCCCCC"
&& 9
*--- Caracter inicial (fuera del cdigo)
lcIni = CHR(lnPri + 35)
*--- Caracteres lateral y central
lcLat = CHR(33)
lcMed = CHR(45)
*--- Resto de los caracteres
lcResto = SUBS(lcRet, 2, 12)
FOR lnI = 1 TO 12
lcJuego = SUBS(laJuego(lnPri +
DO CASE
CASE lcJuego = "A"
lcResto = STUFF(lcResto,
CASE lcJuego = "B"
lcResto = STUFF(lcResto,
CASE lcJuego = "C"
lcResto = STUFF(lcResto,
ENDCASE
ENDFOR

1), lnI, 1)

lnI, 1, CHR(VAL(SUBS(lcResto, lnI, 1))+48))


lnI, 1, CHR(VAL(SUBS(lcResto, lnI, 1))+65))
lnI, 1, CHR(VAL(SUBS(lcResto, lnI, 1))+97))

*--- Armo cdigo


lcCod = lcIni + lcLat + SUBS(lcResto,1,6) + lcMed + SUBS(lcResto,7,6) + lcLat
RETURN lcCod
ENDFUNC

*-------------------------------------------------------------------------* FUNCTION _StrToEan8(tcString, .T.)


*-------------------------------------------------------------------------* Convierte un string para ser impreso con
* fuente True Type EAN-8

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

7 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

* PARAMETROS:
*
tcString: Caracter de 7 dgitos (0..9)
*
tlCheckD: .T. Solo genera el dgito de control
*
.F. Genera dgito y caracteres a imprimir
* USO: _StrToEan8("1234567")
* RETORNA: Caracter
* AUTOR: Luis Mara Guayn
*-------------------------------------------------------------------------FUNCTION _StrToEan8(tcString, tlCheckD)
LOCAL lcLat, lcMed, lcRet, ;
lcIni, lcCod, ;
lnI, lnCheckSum, lnAux
lcRet=ALLTRIM(tcString)
IF LEN(lcRet) # 7
*--- Error en parmetro
*--- debe tener un len = 7
RETURN ""
ENDIF
*--- Genero dgito de control
lnCheckSum=0
FOR lnI = 1 TO 7
IF MOD(lnI,2) = 0
lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 1
ELSE
lnCheckSum = lnCheckSum + VAL(SUBS(lcRet,lnI,1)) * 3
ENDIF
ENDFOR
lnAux = MOD(lnCheckSum,10)
lcRet = lcRet + ALLTRIM(STR(IIF(lnAux = 0, 0, 10-lnAux)))
IF tlCheckD
*--- Si solo genero dgito de control
RETURN lcRet
ENDIF
*--- Para imprimir con fuente True Type EAN8
*--- Caracteres lateral y central
lcLat = CHR(33)
lcMed = CHR(45)
*--- Caracteres
FOR lnI = 1 TO 8
IF lnI <= 4
lcRet = STUFF(lcRet, lnI, 1, CHR(VAL(SUBS(lcRet, lnI, 1))+48))
ELSE
lcRet = STUFF(lcRet, lnI, 1, CHR(VAL(SUBS(lcRet, lnI, 1))+97))
ENDIF
ENDFOR
*--- Armo cdigo
lcCod = lcLat + SUBS(lcRet,1,4) + lcMed + SUBS(lcRet,5,4) + lcLat
RETURN lcCod
ENDFUNC
*--------------------------------------------------------------------------

Ejemplos de uso

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

8 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

Estos son algunos ejemplos de cmo utilizar las funciones de conversin. Todas las funciones reciben como
parmetro el texto a codificar en formato CARACTER.
Ejemplo 1: Para pasar el texto "Esto es un ejemplo" al formato de cdigo de barra Cdigo 128 B:
lcTexto = "Esto es un ejemplo"
lcCodBar = _StrTo128B(lcTexto)
Ejemplo 2: Para pasar el nmero 12345678 al formato de cdigo de barra Cdigo 128 C (este cdigo solo
acepta nmeros de longitud par, si la longitud es impar, justifica con un "0" (cero) a la izquierda):
lcTexto = "12345678"
lcCodBar = _StrTo128C(lcTexto)
Ejemplo 3: Para pasar el pas Argentina ("779"), la empresa "1234" y el producto "01234" al formato de
cdigo de barra Cdigo EAN-13 (solo paso 12 caracteres, ya que la funcin agrega y codifica el dgito de
control):
lcTexto = "779123401234"
lcCodBar = _StrToEAN13(lcTexto)
Para utilizar estos cdigos en reportes de VFP, se debe formatear el campo con la fuente True Type elegida,
y en la expresin se debe invocar a la funcin correspondiente pasndole como parmetro el texto a
codificar.
Para codificar y mostrar el campo MiCodigo de la tabla MiTabla en un campo del reporte, en el cuadro de
dilogo del campo, debemos poner por ejemplo en Expresin: _StrTo128B(MiTabla.MiCampo).
Otra forma es crear un cursor mediante un SELECT con un campo con los datos ya formateados y generar
el informe a partir del cursor:
SELECT *, _StrTo39(MiTabla.MiCampo) as CodBar FROM MiTabla INTO CURSOR MiCursor

Muestra de los resultados


Estos grficos fueron generados usando las funciones y las fuentes de este documento, en reportes de
Visual FoxPro:

Notas finales

07/06/2016 15:19

Cdigos de barra en reportes de Visual FoxPro

9 de 9

http://www.fpress.com/revista/Num9905/Barras.htm

Una vez generados los reportes con cdigos de barra es conveniente imprimirlos en impresoras lser por su
excelente definicin, con esto no habr ningn problema con la lectura del cdigo de barra.
Con las impresoras de inyeccin de tinta, los resultados no son ptimos y quizs algunos lectores de cdigo
de barra no podrn leer el cdigo en el primer "escaneo".
Estos cdigos tambin se pueden colocar en formularios de VFP, pero solo para su visualizacin, ya que
ningn lector de cdigo de barra los podr leer del monitor.
Para usar estas funciones en FoxPro para Windows, hay que modificar algunas sentencias que FPW no
soporta.
Hasta la prxima.
Luis Mara

07/06/2016 15:19

Potrebbero piacerti anche