Cómo generar códigos de barras EAN128 en Crystal Report
Mediante Crystal Report es posible generar códigos de barras Code128 y EAN128, aunque para ellos es necesario realizar los siguientes pasos:

1. Descargar e instalar la fuente ean128.ttf en servidor y los equipos desde donde se vayan a imprimir los códigos de barras.
2. En el taller de fórmulas de Crystal Report se deben crear dos funciones personalizadas (por ejemplo Generar_EAN128 y TestNum):
3. En las funciones deberemos descargar o copiar el siguiente código fuente:
Function TestNum (Codigo as string, i as number, mini as number) as Number 'Si los caracteres de la variable mini desde la variable i son numericos entonces se devuelve 0 mini = mini - 1 If i + mini <= Len(Codigo) Then Do While mini >= 0 If Asc(Mid(Codigo, i + mini, 1)) < 48 Or Asc(Mid(Codigo, i + mini, 1)) > 57 Then Exit Do mini = mini - 1 Loop End If TestNum = mini End Function
Function Generar_EAN128(Codigo as String) As String ' V 2.0.0 ' Esta función permite generar el código de barras para mostrarlo con la fuente CODE128.TTF ' - Parametros : cadenas del código ' - Retorno: retorna una cadena que permite representar generar el código de barras con la fuente CODE128.TTF ' retorna una cadena vacía si no se puede representar el código de barras dim i, checksum, mini, dummy as number dim code128 as string dim tableB As Boolean code128="" If Len(Codigo) > 0 Then ' Verificar si los caracteres son válidos For i = 1 To Len(Codigo) Select Case Asc(Mid(Codigo, i, 1)) Case 32 To 126, 203 Case Else Codigo="" Exit For End Select Next End If If Len(Codigo) > 0 Then 'Calcular de la cadena de código optimizando el uso de las tablas B y C tableB=true i = 1 ' Iniciar el indice de la cadena Do While i <= Len(Codigo) If tableB Then 'Ver si interesa cambiar a la tabla C si para 4 dígitos de inicio o final sino 6 dígitos mini = IIf(i = 1 Or i + 3 = Len(Codigo), 4, 6) mini = TestNum (Codigo, i, mini) If mini < 0 Then 'Cambiando a la tabla C If i = 1 Then 'Iniciando con la tabla C code128 = Chr(210) Else 'Cambiar a la tabla C code128 = code128 & Chr(204) End If tableB = False Else If i = 1 Then code128 = Chr(209) 'Iniciando con la tabla B End If End If If Not tableB Then 'Si estabamos en la tabla C se intentan procesar 2 dígitos mini = 2 mini = TestNum (Codigo, i, mini) If mini < 0 Then 'Procesar 2 dígitos dummy = Val(Mid(Codigo, i, 2)) dummy = IIf(dummy < 95, dummy + 32, dummy + 105) code128 = code128 & Chr(dummy) i = i + 2 Else 'Si no tiene 2 dígitos se cambia a la tabla B code128 = code128 & Chr(205) tableB = True End If End If If tableB Then 'Procesar 1 dígito con la tabla B code128 = code128 & Mid(Codigo, i, 1) i = i + 1 End If Loop 'Calcular el checksum For i = 1 To Len(code128) dummy = Asc(Mid(code128, i, 1)) dummy = IIf(dummy < 127, dummy - 32, dummy - 105) If i = 1 Then checksum = dummy checksum = (checksum + (i - 1) * dummy) Mod 103 Next 'Calculando el código ASCII de checksum checksum = IIf(checksum < 95, checksum + 32, checksum + 105) 'Añadir el checksum y parar code128 = code128 & Chr(checksum) & Chr(211) End If Generar_EAN128=code128 End Function
Nota: si se utilizan otros nombres de función entonces es necesario cambiarlo en todo el código fuente.
4. Posteriormente crearemos una fórmula (por ejemplo Code128) que haga referencia a la función creada, donde le pasaremos como parámetro un campo, fórmula o una cadena que contenga el código EAN128 y dicha fórmula devolverá una expresión que generará el código de barras:

5. Por último, diseñaremos el informe insertando la fórmula en la posición que deseemos y estableciéndole la fuente Code128, además si deseamos que figure el texto del código de barras entonces debemos insertar el código de barras en la posición deseada.
