Code 128 liefert im Vergleich zum häufig eingesetzten Code 39 kürzere Barcodes und eignet sich daher gut für den Einsatz in kleineren Ausgabeformaten wie Etiketten oder Karten. Das Einlesen ist mit den allermeisten Barcodelesern problemlos möglich. Im Gegensatz zum Code 39, für den viele frei verfügbare Schriftarten verfügbar sind wie z.B. der bekannte Free 3-of-9-Font, gibt es für Code 128 kaum freie Varianten.

Glücklicherweise gibt es bei CodePlex das Barcode Rendering Framework, dass die Erstellung verschiedener Barcodeformate ermöglicht, darunter Code 128. Um einen solchen Barcode in einem SQL Report auszugeben, muss zuerst die Zen.Barcode.Core DLL aus dem Barcode Rendering Framework im GAC bereitgestellt werden. Dies muss sowohl auf dem Entwicklungs-, als auch auf dem Produktivsystem geschehen.

Im SQL Report selber muss über die Report Properties eine Funktion als Custom Code hinterlegt werden (im Menü Report > Report Properties… > Code).

Public Function CreateBarcode(ByVal barcodeText As String) As Byte()

  Dim barcodeMetrics as Zen.Barcode.BarcodeMetrics1d=new Zen.Barcode.BarcodeMetrics1d(1, 40)

  Dim image as System.Drawing.Image

  image = Zen.Barcode.BarcodeDrawFactory.GetSymbology(Zen.Barcode.BarcodeSymbology.Code128).Draw(barcodeText, barcodeMetrics)

  Dim format AS System.Drawing.Imaging.ImageFormat = System.Drawing.Imaging.ImageFormat.Bmp

  Dim stream as System.IO.MemoryStream = new System.IO.MemoryStream()

  image.Save(stream, format)

  image.Dispose()

  Dim byteArray as Byte() = stream.ToArray()

  stream.Close()

  stream.Dispose()

  Return byteArray

End Function

Leider handelt es sich an der Stelle um eine simple TextBox in der die VB.NET-Funktion eingetragen werden muss, daher gibt es keine Codeunterstützung wie z.B. in Visual Studio.

Das Imports-Statement kann im Custom Code auch nicht eingesetzt werden, darum müssen die Funktionen und Typen etwas umständlich Full Qualified angegeben werden, z.B. System.Drawing.Image statt nur Image.

Damit die Funktionen und Typen im Custom Code aufgelöst werden können, ist es wichtig die Referenzen zur Zen.Barcode.Core- und zur System.Drawing-Assembly anzugeben. Dies geschieht im gleichen Dialogfenster unter References:

References

Wie im Custom Code erkennbar ist, wird der Barcode als Image gerendert und der Bildinhalt als Byte-Array zurückgegeben. Per BarcodeMetrics1d(1, 40) wird dabei die Breite eines Barcodestriches (1) und die Höhe des Barcodes (40) definiert.

Nach dem Schließen der Report Properties kann dann aus der Toolbox ein Image in den Report gezogen und per Rechtsklick > Image Properties… eine Expression (per fx-Button) für Use this field angegeben werden:

imageFx

In der Expression wird die CreateBarcode-Funktion aufgerufen:

=Code.CreateBarcode(Fields!MyBarcodetextField.Value)

MyBarcodetextField muss natürlich durch das passende Feld aus der Reportdatenquelle ersetzt werden in dem der als Barcode zu druckende Wert steht. Wenn der Barcode Zeilenumbrüche enthalten soll, um z.B. beim Einscannen automatisch mehrere Felder befüllen zu können, dann können diese per CHR(13) eingefügt werden:

=Code.CreateBarcode(Fields!MyBarcodetextField1.Value & CHR(13) & Fields!MyBarcodetextField2.Value)

Das CHR(13) wird vom Barcode Rendering Framework passend übersetzt, d.h. es wird nicht der Barcode selber umgebrochen, sondern im Barcode eine Anweisung für den Carriage Return codiert, die vom Scanner während des Lesens entsprechend umgesetzt wird.