Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenido
Código 39
Código 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
según cada código 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
implementación.
Códigos de Barra
Solo haremos una breve descripción de cada uno de los posibles códigos, para elegir
el mas adecuado para la aplicación que vamos a implementar.
Código 39
El juego de caracteres del código 39 incluye 43 caracteres: los dígitos 0-9, las letras
A-Z (mayúscula solamente), el espacio y los siguientes símbolos: - + . $ / *. El "*"
es el carácter de inicio y final del código, por lo que no deberá usarse en un texto a
codificar.
Código 128
Este también es un código de longitud variable, y menos largo que el código 39.
El código 128 incluye los dígito 0-9, letras A-Z (mayúsculas y minúsculas), y todos
los caracteres estándares ASCII (en total 128 caracteres, de allí su nombre).
Este código tiene un dígito de control que ofrece mas seguridad en la lectura. Dicho
dígito de control se calcula con el siguiente algoritmo:
El EAN-13 se utiliza por todo el mundo para las mercaderías de venta al por menor.
Es de longitud fija (13 caracteres). El EAN-8 es una versión acortada del código EAN-
13 e incluye solo 8 caracteres.
Suma = 0
Por cada uno de los 12 ó 7 dígitos a codificar
Valor corrector = 1 si la posición del dígito es impar ó 3 si la
posición es par
Suma = Suma + Valor del dígito * Valor corrector
Final de los dígitos
Digito de control = 10 - módulo 10 de Suma
Si Digito de control = 10
Digito de control = 0
Final Si
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 impresión y lectura de los códigos, se aconseja utilizar los tamaños
de fuentes que a continuación se detallan:
Funciones en VFP
*-----------------------------------------------------------------------
---
* 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 María Guayán
*-----------------------------------------------------------------------
---
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 numéricos y alfabéticos (solo mayúsculas)
* Si un caracter es no válido lo reemplaza por espacio
* USO: _StrTo128A("CODIGO 128")
* RETORNA: Caracter
* AUTOR: Luis María Guayán
*-----------------------------------------------------------------------
---
FUNCTION _StrTo128A(tcString)
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)
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 numéricos y alfabéticos (mayúsculas y minúsculas)
* Si un caracter es no válido lo reemplaza por espacio
* USO: _StrTo128B("Codigo 128")
* RETORNA: Caracter
* AUTOR: Luis María Guayán
*-----------------------------------------------------------------------
---
FUNCTION _StrTo128B(tcString)
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 numéricos
* USO: _StrTo128C("01234567")
* RETORNA: Caracter
* AUTOR: Luis María Guayán
*-----------------------------------------------------------------------
---
FUNCTION _StrTo128C(tcString)
lcRet = ALLTRIM(tcString)
lnLong = LEN(lcRet)
*--- La longitud debe ser par
IF MOD(lnLong,2) # 0
lcRet = "0" + lcRet
lnLong = LEN(lcRet)
ENDIF
*-----------------------------------------------------------------------
---
* FUNCTION _StrToEan13(tcString, .T.)
*-----------------------------------------------------------------------
---
* Convierte un string para ser impreso con
* fuente True Type EAN-13
* PARAMETROS:
* tcString: Caracter de 12 dígitos (0..9)
* tlCheckD: .T. Solo genera el dígito de control
* .F. Genera dígito y caracteres a imprimir
* USO: _StrToEan13("123456789012")
* RETORNA: Caracter
* AUTOR: Luis María Guayán
*-----------------------------------------------------------------------
---
FUNCTION _StrToEan13(tcString, tlCheckD)
lcRet=ALLTRIM(tcString)
IF LEN(lcRet) # 12
*--- Error en parámetro
*--- debe tener un len = 12
RETURN ""
ENDIF
*--- Genero dígito de control
lnCheckSum=0
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 dígito de control
RETURN lcRet
ENDIF
*-----------------------------------------------------------------------
---
* FUNCTION _StrToEan8(tcString, .T.)
*-----------------------------------------------------------------------
---
* Convierte un string para ser impreso con
* fuente True Type EAN-8
* PARAMETROS:
* tcString: Caracter de 7 dígitos (0..9)
* tlCheckD: .T. Solo genera el dígito de control
* .F. Genera dígito y caracteres a imprimir
* USO: _StrToEan8("1234567")
* RETORNA: Caracter
* AUTOR: Luis María Guayán
*-----------------------------------------------------------------------
---
FUNCTION _StrToEan8(tcString, tlCheckD)
lcRet=ALLTRIM(tcString)
IF LEN(lcRet) # 7
*--- Error en parámetro
*--- debe tener un len = 7
RETURN ""
ENDIF
IF tlCheckD
*--- Si solo genero dígito de control
RETURN lcRet
ENDIF
*--- 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
*-----------------------------------------------------------------------
---
Ejemplos de uso
Estos son algunos ejemplos de cómo utilizar las funciones de conversión. Todas las
funciones reciben como parámetro el texto a codificar en formato CARACTER.
lcTexto = "12345678"
lcCodBar = _StrTo128C(lcTexto)
lcTexto = "779123401234"
lcCodBar = _StrToEAN13(lcTexto)
Para utilizar estos códigos en reportes de VFP, se debe formatear el campo con la
fuente True Type elegida, y en la expresión se debe invocar a la función
correspondiente pasándole como parámetro el texto a codificar.
Estos gráficos fueron generados usando las funciones y las fuentes de este
documento, en reportes de Visual FoxPro:
Notas finales
Una vez generados los reportes con códigos de barra es conveniente imprimirlos en
impresoras láser por su excelente definición, con esto no habrá ningún problema con
la lectura del código de barra.
Con las impresoras de inyección de tinta, los resultados no son óptimos y quizás
algunos lectores de código de barra no podrán leer el código en el primer "escaneo".
Estos códigos también se pueden colocar en formularios de VFP, pero solo para su
visualización, ya que ningún lector de código 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 próxima.