Los códigos 128
Como ya vimos en el artículo "Códigos de barras en reportes de Visual FoxPro", los códigos de barras 128 se dividen en 3 subconjutos:
- El subconjunto A incluye: los dígitos, las letras mayúsculas, y los códigos de control.
- El subconjunto B incluye: los dígitos, las letras mayúsculas y minúsculas, y los códigos de control.
- El subconjunto C incluye: solo los dígitos y comprime dos dígitos numéricos en cada carácter, proporcionando una muy buena densidad de impresión.
CaracterInicial + CadenaTexto + DigitoControl + CaracterFinalLas funciones descritas al final del artículo calculan el dígito de control y añaden los caracteres de inicio y final de cada tipo de código de barra 128, a la cadena de texto.
Las fuentes TrueType
Las siguientes son una descripción de las fuentes disponibles en este artículo:
- Code 128AB (Bc128ab.ttf): Código 128 A y B Normal
- Code 128AB Short (Bc128abs.ttf): Código 128 A y B Bajo
- Code 128AB Tall (Bc128abt.ttf): Código 128 A y B Alto
- Code 128AB HR (Bh128ab.ttf): Código 128 A y B Normal con Lectura Humana
- Code 128AB Short HR (Bh128abs.ttf): Código 128 A y B Bajo con Lectura Humana
- Code 128AB Tall HR (Bh128ab.ttf): Código 128 A y B Alto con Lectura Humana
- Code 128C (Bc128c.ttf): Código 128 C Normal
- Code 128C Short (Bc128cs.ttf): Código 128 C Bajo
- Code 128C Tall (Bc128ct.ttf): Código 128 C Alto
- Code 128C HR (Bh128c.ttf): Código 128 C Normal con Lectura Humana
- Code 128C HR Short (Bh128cs.ttf): Código 128 C Bajo con Lectura Humana
- Code 128C HR Tall (Bh128ct.ttf): Código 128 C Alto con Lectura Humana
- Codigo de barras CyT (codigo_barras_cyt.ttf): Código 128 A y B Alto
Los requisitos para los envíos a Correos de España son:
- Código 128 A
- Densidad entre 0,38 mm. y 0,63 mm.
- Composición del código:
- Tipo de producto en 2 posiciones: Consultar con Correos los tipos admitidos
- Código de cliente en 8 posiciones: Solicitar el código a Correos
- Número de envío en 13 posiciones: No puede repetirse antes de 5 años. Puede incluir el año como las 4 primeras posiciones
Independientemente de lo expresado anteriormente, estas fuentes TrueType se pueden adaptar a cualquier necesidad de impresión de códigos de barras 128, por las diversas combinaciones posibles entre tipo, tamaño e impresión de la cadena para la lectura humana.
Las funciones en VFP
Las funciones en Visual FoxPro para cada uno de los tres tipo de código de barra 128 son las siguientes:
FUNCTION Codigo128A LPARAMETERS m.cadena *** Convierte una cadena para ser impresa en un *** código de barras de tipo 128 A *** Fuentes True Type válidas: *** "Code 128AB", "Code 128AB HR", *** "Code 128AB Short", "Code 128AB Short HR", *** "Code 128AB Tall", "Code 128AB Tall HR" y *** "Codigo de barras CyT" IF PCOUNT() = 0 RETURN "" ENDIF IF TYPE("m.cadena") = "N" m.cadena = TRANSFORM(m.cadena) ENDIF IF TYPE("m.cadena") != "C" RETURN "" ENDIF m.cadena = ALLTRIM(m.cadena) LOCAL m.vuelta, m.suma, m.caracterinicial, m.co, m.letra, ; m.valorascii, m.checksum, m.caracterfinal m.suma = 103 m.caracterinicial = CHR(123) m.vuelta = m.caracterinicial m.caracterfinal = CHR(126) FOR m.co = 1 TO LEN(m.cadena) m.letra = SUBSTR(m.cadena, m.co, 1) m.valorascii = ASC(m.letra) m.valorascii = m.valorascii - IIF(m.valorascii < 123, 32, 70) m.suma = m.suma + (m.valorascii * m.co) m.vuelta = m.vuelta + IIF(m.letra = " ", CHR(174), m.letra) NEXT m.co m.checksum = MAX(MOD(m.suma, 103), 0) m.checksum = m.checksum + IIF(m.checksum > 90, 70, IIF(m.checksum = 0, 174, 32)) m.checksum = CHR(m.checksum) m.vuelta = m.vuelta + m.checksum + m.caracterfinal RETURN m.vuelta ENDFUNC
FUNCTION Codigo128B LPARAMETERS m.cadena *** Convierte una cadena para ser impresa en un *** código de barras de tipo 128 B *** Fuentes True Type válidas: *** "Code 128AB", "Code 128AB HR", *** "Code 128AB Short", "Code 128AB Short HR", *** "Code 128AB Tall", "Code 128AB Tall HR" y *** "Codigo de barras CyT" IF PCOUNT() = 0 RETURN "" ENDIF IF TYPE("m.cadena") = "N" m.cadena = TRANSFORM(m.cadena) ENDIF IF TYPE("m.cadena") != "C" RETURN "" ENDIF m.cadena = ALLTRIM(m.cadena) LOCAL m.vuelta, m.suma, m.caracterinicial, m.co, m.letra, m.valorascii, ; m.checksum, m.caracterfinal m.suma = 104 m.caracterinicial = CHR(124) m.vuelta = m.caracterinicial m.caracterfinal = CHR(126) FOR m.co = 1 TO LEN(m.cadena) m.letra = SUBSTR(m.cadena, m.co, 1) m.valorascii = ASC(m.letra) m.valorascii = m.valorascii - IIF(m.valorascii < 123, 32, 70) m.suma = m.suma + (m.valorascii * m.co) m.vuelta = m.vuelta + IIF(m.letra = " ", CHR(174), m.letra) NEXT m.co m.checksum = MAX(MOD(m.suma, 103), 0) m.checksum = m.checksum + IIF(m.checksum > 90, 70, IIF(m.checksum = 0, 174, 32)) m.checksum = CHR(m.checksum) m.vuelta = m.vuelta + m.checksum + m.caracterfinal RETURN m.vuelta ENDFUNC
FUNCTION Codigo128C LPARAMETERS m.cadena *** Convierte una cadena para ser impresa en un *** código de barras de tipo 128 C *** Fuentes True Type válidas: *** "Code 128C", "Code 128C HR", *** "Code 128C Short", "Code 128C HR Short", *** "Code 128C Tall", "Code 128C HR Tall" IF PCOUNT() = 0 RETURN "" ENDIF IF TYPE("m.cadena") = "N" m.cadena = TRANSFORM(m.cadena) ENDIF IF TYPE("m.cadena") != "C" RETURN "" ENDIF m.cadena = ALLTRIM(m.cadena) LOCAL m.vuelta, m.suma, m.caracterinicial, m.co, m.letra, ; m.valorascii, m.valorreal, m.checksum, m.caracterfinal m.suma = 105 m.caracterinicial = CHR(125) m.vuelta = m.caracterinicial m.caracterfinal = CHR(126) IF LEN(m.cadena) % 2 # 0 m.cadena = "0" + m.Cadena ENDIF FOR m.co = 1 TO LEN(m.cadena) STEP 2 m.letra = SUBSTR(m.cadena, m.co, 2) m.valorreal = VAL(m.letra) m.valorascii = m.valorreal + IIF(m.valorreal < 90, 33, 71) m.suma = m.suma + (m.valorreal * CEILING(m.co/2)) m.vuelta = m.vuelta + CHR(m.valorascii) NEXT m.co m.checksum = MAX(MOD(m.suma, 103), 0) m.checksum = m.checksum + IIF(m.checksum < 90, 33, 71) m.checksum = CHR(m.checksum) *-- Reemplazo CheckSum m.checksum = CHRTRAN(m.checksum, ; CHR(171)+CHR(172)+CHR(173), CHR(176)+CHR(177)+CHR(178)) m.vuelta = m.vuelta + m.checksum + m.caracterfinal RETURN m.vuelta ENDFUNC
Nota importante: Estas funciones solo se corresponden con las fuentes TrueType de este artículo. Las funciones de los artículos "Códigos de barras en reportes de Visual FoxPro" y "Resolución General 1702 de la AFIP (Argentina)" se corresponden a las fuentes disponibles para descarga de cada artículo. Cada fuente tiene su función asociada para la correcta generación de los distintas simbologías de códigos de barras.
Ejemplos
Para utilizar las funciones se debe pasar como parámetro la cadena a codificar:
lc128A = Codigo128A("CODIGO128A") lc128B = Codigo128B("codigo128b") lc128C = Codigo128C("16886271")Para la impresión se debe seleccionar la fuente correspondiente a cada función:
CLEAR ? Codigo128A("CODIGO128A") FONT "Code 128AB Short HR",36 ? Codigo128B("codigo128b") FONT "Code 128AB Tall HR",36 ? Codigo128C("16886271") FONT "Code 128C HR",60 ? ? Codigo128A("PortalFox") FONT "Codigo de barras CyT",48
Descargas
Estos son los enlaces para las descargas disponibles de este artículo:
- Para descargar las fuentes TrueType haga clic aquí. (fuentes128.zip 81,5 KB)
- Para descargar las funciones para código 128 haga clic aquí. (funciones128.zip 6,6 KB)
Carlos Yohn Zubiria (España) y Luis María Guayán (Argentina)
Este las fuentes y las funciones, puede servir para codigo de barra Ean128 asi:
ResponderBorrar(415)7701234567897(8020)8000473260(3900)355000(96)19980728
Donde el identificador 8020 y 3900 son variables, hay que usar un separador entre campos, cuando en un símbolo se concatenan varios campos de longitud variable