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:
![](https://www.aliquo.software/wp-content/uploads/2010/05/image_2D33542D.png)
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):
![](https://www.aliquo.software/wp-content/uploads/2010/05/image_169105E6.png)
3. En la función deberemos copiar el código del apartado funciones de Crystal Report.
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:
![](https://www.aliquo.software/wp-content/uploads/2010/05/image_78067962.png)
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.
![](https://www.aliquo.software/wp-content/uploads/2010/05/image_0EB043FB.png)
Funciones de Crystal Report
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.