CrystalReports: Barcode-Etikett für Artikel/Geräte

Aus GEVITAS
Wechseln zu: Navigation, Suche

Hier beschrieben, wie man ein Formular für ein Artikel-Etikett erstellt oder ändert.

1 Voraussetzungen:

Sie benötigen:

  • Crystal-Reports© 8.5: Mit diesem Programm wird das Formular bearbeitet.
    • Crystal-Reports 2008 kann nicht verwendet werden, weil die Crystal-Reports-Runtime einen Bug hat: Bei sehr kleinen Formaten wird immer eine Standard-Rand berechnet und das restliche Formular so verkleinert, dass es auf die Seite passt. Ergebnis: Das Etikett wird incl. Schriften, Barcode usw. viel kleiner dargestellt, als es eigentlich ist!
    • Wenn Sie "nur" über Crystal-Reports 2008 oder höher verfügen und eine Etiketten-Anpassung brauchen, müssen Sie sich Crystal-Reports 8.5 besorgen oder die Anpassung von GEVITAS machen lassen.
  • Einen Etikettendrucker: Im Normalfall handelt es sich dabei um einen speziellen Drucker, der (nur) Etiketten bedrucken kann, z.B. einen Thermotransfer-Drucker mit Kunststoffetiketten.
  • Den Treiber für den Etikettendrucker: Auch wenn der Etikettendrucker nicht direkt an Ihrem PC angeschlossen ist, müssen Sie den Treiber für den Etikettendrucker auf Ihrem PC installieren. Nur dann können Sie in CrystalReports das Format des Etiketts auswählen/einstellen!
  • Eine Barcode-Schriftart für die Inventarnummer: Wenn Ihr Etikettendrucker eingebaute Barcodes hat, können Sie diese ggf. verwenden. Einzelheiten dazu entnehmen Sie der Beschreibung des Druckers. Alternativ dazu können Sie auch eine True-Type-Schriftart verwenden.
    • Die Schriftart für den Barcode-Typ "i2of5Gevitas.ttf" können Sie von unserem Support erhalten.
    • In diesem Fall benötigen Sie auch noch eine CrystalReports-Formel, die die benötigten Zeichen für den 2of5i-Barcode und ggf. eine Prüfziffer errechnet.
    • Ein entsprechendes Muster-Formular können Sie auch von unserem Support erhalten.
    • Am Besten fordern Sie vom Support das GEVITAS Barcode-Package 2of5 Interleaved 2012 an.

2 Vorgehensweise

An einem Beispiel sollen die einzelnen Schritte erläutert werden. So soll das Etikett aussehen:

Etikett

Dies entspricht dem Standard-Etikett von GEVITAS. Sie können dieses als Basis für Ihr eigenes Etikett benutzen.

2.1 Drucker einrichten in CrystalReports

Öffnen Sie CrystalReports und das Musteretikett. Klicken Sie dann auf "Datei->Drucker einrichten". Wählen Sie Ihren Etikettendrucker und das Etikettenformat aus. Beispiel:

Drucker

Erst danach können Sie im CrystalReports-Editor sehen, welche Dimensionen das Etikett hat.

Es empfiehlt sich, mit "Datei->Seite einrichten" die Seitenränder auf 0 zu stellen:

Seitenränder

In der Entwurfsansicht sieht das ganze dann z.B. so aus:

Entwurf

Wenn die Inventarnummer bei Ihnen nicht als Barcode erscheint sondern im Klartext, so haben Sie vergessen, die Schriftart "i2of5Gevitas.ttf" zu installieren!

2.2 Einfügen der Formel für den 2/5i-Barcode

Wenn Sie das GEVITAS-Standardformular benutzen, ist eine Formel für den Barcode i2of5Gevitas schon vorhanden. Wenn nicht, müssen Sie diese selbst erstellen. Sie müssen keine Formel verwenden, wenn...

  • ...Sie einen anderen Barcode verwenden
  • ...Sie einen eingebauten Barcode des Etikettendruckers verwenden

Die Formel lautet:

// Formel für Berechnung der Inventarnummer für Schriftart "I2OF5GEVITAS"

// ------------------------------------------------------------------ // Diese Formel kann zusätzlich eine Prüfziffer generieren. // Bei nicht korrekter Anzahl der Stellen wird eine "0" vorrangestellt

WhilePrintingRecords;

   NumberVar iMitPruefZiff := 1; // Bei 1 wird die Prüfziffer mit generiert
   StringVar sInv; // Inventarnummer
   StringVar sBar; // Barcode- Nummer
   NumberVar i; 
   NumberVar k;
   NumberVar iq1; // Quersumme aus den ungeraden Positionen
   NumberVar iq2; // Quersumme aus den geraden Positionen
   NumberVar i_Pruefziffer;                    
   NumberVar i_Das_Ergebnis_der_Berechnung;    
   StringVar s_BarcodeNummer_Helfer;            
   StringVar s_Paarweise_Darstellung;
   //_________________________________
   //
   // Schritt 1.) Die zu kodierende Inventarnummer holen: 
   sInv := {MARTEINZ.InventarNr}; // Inventarnummer aus Datenbank holen
   //_________________________________
   //
   // Schritt 2.) Die zu kodierende Inventarnummer holen:                                 
   // Überprüfen, ob überhaupt gültige werte in der Inventarnummer sind
   // Eine zu kodierende Nummer (hier: Inventarnummer) darf nur Ziffern enthalten:
   For i := 1 To Len(sInv) Do // Alle Zeichen einzeln überprüfen
   (
       k := Asc(Mid(sInv, i, 1));
   	If (k < Asc("0")) Or (k > Asc("9"))	Then
            sInv := ""; // Inventarnummer ungültig > löschen
   );
   //_________________________________
   //
   // Schritt 3.) Ausgabestring leeren:
   sBar := ""; 
   //_________________________________
   //
   // Schritt 4.) Falls erwünscht Prüfziffer anhängen::
   If (sInv <> "") Then // Inventarnummer ist ein gültiger String > Berechnung starten
   (
       If (iMitPruefZiff = 1) Then
       (
   		iq1 := 0; // Quersummenzähler leeren
   		iq2 := 0;
   
   		i_Pruefziffer := 1;                   //PMB//120710//
   		i_Das_Ergebnis_der_Berechnung := 0;   //PMB//120710//
   
   		s_BarcodeNummer_Helfer := "";         //PMB//120710//
   
   
           // Bei Interleaved 2 aus 5 Code wird jede Ziffer die an einer ungerade STELLE steht(von RECHTS!!! nach LINKS!!! gesehen -> DOWNTO)
       	// zuerst miteinander addiert und dann die so entstandene Quersumme mal 3 multipliziert.
           // Danach wird das Ergebnis durch 10 geteilt. Der Rest stellt die Prüfziffer dar 
   
       	// Weil von RECHTS nach LINKS gesehen muss die Reihenfolge umgedreht werden!
   
           // Beispiel:  eine Barcodenummer '245138' hat an der 1 Position von Rechts nach Links gesehen eine 8.
           //  					Zählt die erste ungearde Stelle (1) hat eine 8:
   
           //						Schaut man jedoch von Links nach Rechts ist die 8 an einer GERADEN Stelle (6).
           //						Also ein Konstrukt wie etwa:
           //							for i := i_String_Laenge downto 1 do
           //								if (i mod 2) = 1 then // Ungerade Stelle hat immer als REST eine 1
           //						kann hier richtig NICHT funktionieren.
   
           //						Um Fehler zu vermeiden MUSS man der GESAMMTEN String zuerst UMDREHEN:
           // String zuerst UMDREHEN:
   		For i := 1 To Len(sInv) Do
   		( s_BarcodeNummer_Helfer := s_BarcodeNummer_Helfer + Mid(sInv, i, 1); //PMB//120710//
   
   		);
   
           // Zuerst werden zwei Quersummen der ungeraden (iq1) und geraden (iq2) Stellen gebildet:
   		For i := 1 To Len(s_BarcodeNummer_Helfer) Do // Quersumme errechnen
   		(
               If (i Mod 2) = 1 Then
   				// Quersumme aus den ungeraden Positionen
   				iq1 := iq1 + (Asc(Mid(s_BarcodeNummer_Helfer, i, 1)) - Asc("0"))
   			Else
   				// Quersumme aus den geraden Positionen
   				iq2 := iq2 + (Asc(Mid(s_BarcodeNummer_Helfer, i, 1)) - Asc("0"));
   		); 
   
   		// Die Quersumme der ungeraden (iq1) Stellen wird jetzt mal 3 multipliziert (3 * iq1)
   		// und dazu wird die Quersumme der geraden (iq2) addiert:
   		k := (3 * iq1) + iq2; // Summe errechnen
   
           // Jetzt wird das Ergebnis durch 10 geteilt.
   		i_Das_Ergebnis_der_Berechnung := k mod 10;  
   
   		// Das Ergebnis der Substruktion ist die Prüfzahll die an s_BarcodeNummer angehängt wird (Wenn Rest gleich 0 ist, so ist die Prüfziffer 0 *)
   	   (if ((i_Das_Ergebnis_der_Berechnung > 0) and (i_Das_Ergebnis_der_Berechnung < 10)) then
   			i_Pruefziffer := 10 - i_Das_Ergebnis_der_Berechnung
   		else
   			i_Pruefziffer := 0;
   	   );
   
   		sInv := sInv + Chr(Asc("0") + i_Pruefziffer); // zu Inventarnummer die Prüfziffer anhängen
   
   	); // für If (iMitPruefZiff = 1) Then
   
   
   	//_________________________________
   	//
   	// Schritt 5.) Eine Barcodenummer muss eine gerade Anzahl von Stellen haben
   
   	// Im 2/5 interleaved System kann aufgrund der Codierungstechnik nur eine gerade
   	//  Anzahl von Stellen verschlüsselt werden. Will man eine ungerade Anzahl von Zeichen darstellen,
   	// so muss man dem Code eine Null voranstellen (aus 123 wird 0123)oder eine selbsterstellte Prüfziffer anhängen.
   	// Da hier schon eventuel eine Prüfziffer angehängt wurde zählt nur ob die Anzahl der Ziffer gerade oder ungerade ist.
   	// Ist diese ungerade, dann wird eine Null '0' dazu addiert
   	If (Len(sInv) Mod 2) = 1 Then
   		sInv := "0" + sInv; // Eine Barcodenummer muss eine gerade Anzahl von Stellen haben
   
   	//_________________________________
   	//
   	// Schritt 6.) Decodierung
   
   	// Zielsetzung ist es durch eine paarweise Darstellung der zu codierenden Ziffern eine Platzersparnis zu erzielen.
   	// Der Code ist aus 2 breiten und 3 schmalen Strichen, bzw. 2 breiten und 3 schmalen Lücken aufgebaut.
   	// Zwei Ziffern bilden immer ein Paar: Die erste Ziffer wird aus 5 Strichen dargestellt,
   	// die zweite Ziffer wird durch die unmittelbar folgenden Lücken der ersten Ziffer dargestellt.
   	// Fünf Striche und Lücken stellen also ein Ziffernpaar dar.
   
   	s_BarcodeNummer_Helfer := "";       
       s_Paarweise_Darstellung := "";      
   
      	For i := 1 To Len(sInv) Do
   	(
   		s_Paarweise_Darstellung := s_Paarweise_Darstellung + Mid(sInv, i, 1);
   		If (i Mod 2) = 0 Then
   		(
               // Hier sind 2 Ziffern im String s_Paarweise_Darstellung:
               // Diese werden nun in das entsprechende ANSI-Zeichen umgewandelt.
               IF ToNumber(s_Paarweise_Darstellung) < 50 then
             		s_BarcodeNummer_Helfer := s_BarcodeNummer_Helfer + Chr(ToNumber(s_Paarweise_Darstellung) + 48)
               else
             		s_BarcodeNummer_Helfer := s_BarcodeNummer_Helfer + Chr(ToNumber(s_Paarweise_Darstellung) + 142);
   
   			s_Paarweise_Darstellung := "";
   
   		);
   
   	 );
   
   
   	//_________________________________
   	//
   	// Schritt 7.) Start - Stop Zeichen
   
   	// Als Result bekommt man hier eine Barcode für die Schriftart 'I2OF5GEVITAS.TTF'
   	If s_BarcodeNummer_Helfer <> "" Then
   		sBar := "(" + s_BarcodeNummer_Helfer + ")"; // Inventarnummer mit Start und Stop- Zeichen versehen
   );
   
   sBar; // Ausgeben der Zeichenfolge als Text für Schriftart "I2OF5GEVITAS"
      

Beachten Sie, dass Kommentare in CrystalReports mit // beginnen!

Fügen Sie die Formel in Ihr Formular ein. Wenn Sie das Ergebnis der Formel lesen wollen, stellen Sie z.B. die Schriftart „Arial“ ein. Wenn der Barcode angezeigt werden soll, stellen Sie die Schriftart "I2OF5GEVITAS.TTF" ein!

2.3 Einfügen der Formel für den Code39-Barcode

Diese Barcode verwendet als Start- und Stopp-Zeichen das Sternchen ( * ). Um einen korrekten Barcode zu erhalten, müssen Sie diese Formel erstellen:

  • "*" + {MARTEINZ.INVENTARNR} + "'*"

...und in Ihr Formular ziehen. Hierfür benötigen Sie dann eine spezielle Schriftart, die man z.B. im Internet beziehen kann.

2.4 Formatieren des Detail-Bereichs

Da ja jedes Etikett eine Seite (wenn auch eine kleine!) darstellt, müssen Sie den Detail-Bereich noch folgendrmaßen formatieren:

  • Klicken Sie mit der rechten Maustaste auf den Detail-Bereich und wählen „Bereich formatieren“ aus.
  • Stellen Sie folgendes ein: Danach fügen Sie die gewünschten weiteren Felder in das Formular ein, z.B. Artikelbezeichnung {MART.BEZEICHNUNG} Artikeltyp {MART.TYP} Einzelartikel-Ser.Nr. {MARTEINZ.IDENTNR} usw.

3 Wichtig!

CrystalReports 12 hat einen Bug, der für den Etikettendruck elementar ist: Bei sehr kleinen Seiten versucht es, die Inhalte an das Formular anzupassen. Das Ergebnis ist ein mini-kleiner Druck, oft auch noch versetzt und gedreht! Bis heute (Ende 2012) gibt dafür noch keine Lösung. Deshalb müssen derzeit die Etiketten-Formulare (Reports) mit CrystalReports 8.5 erstellt werden! Im Etiketten-Druck-Dialog muss diese Version angegeben werden!

4 Links