Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2012.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erstellen Sie einen EAN-Strichcode direkt im Bericht und lernen Sie den Umgang mit und die Prüfung von EAN-13-Codes kennen.

Techniken

Berichte, VBA

Voraussetzungen

Access 2000 und höher

Beispieldateien

EAN13.mdb

Shortlink

www.access-im-unternehmen.de/853

EAN-Strichcode mit Bordmitteln

André Minhorst, Duisburg

Nicht selten fragen Access-Entwickler, wie sie Strichcodes in Berichten abbilden können. Das Internet bietet verschiedene Möglichkeiten von kostenpflichtigen Tools bis hin zu speziellen Schriftarten. Wir wollen am Beispiel von EAN-13 zeigen, wie Sie einen solchen Code mit ein wenig Handarbeit selbst generieren und in einem Bericht anzeigen können.

Die European Article Number

EAN steht für European Article Number, die wiederum die Globel Trade Item Number (GTIN) abgelöst hat. Es gibt zwei Varianten (mit acht und mit 13 Stellen), die von der Organisation Global Standards One (GT1) vergeben werden.

In diesem Beitrag konzentrieren wir uns auf die 13-stellige Variante, die als eindeutige Produktkennzeichnung dient - dies gilt ebenfalls für die achtstellige Version, die speziell für Artikel geringeren Ausmaßes und dementsprechend mit weniger Platz zum Platzieren des Codes auskommen müssen.

Anlass für diesen Beitrag ist übrigens die Veröffentlichung eines Buchs und damit der Wunsch, dieses auch mit einer ISBN und einem entsprechenden Strichcode auszustatten. Die ISBN wiederum ist ein Spezialfall eines EAN-Codes, wobei sich die Unterschiede auf die Notation (bei Büchern mit Bindestrichen, also etwa 978-3-944216-00-3 und beim EAN-Code ohne Bindestriche) und auf die ersten Ziffern beschränken, welche beim EAN-Code für Waren eigentlich als Länderkennzeichen dienen. Bei Waren besteht der EAN-13-Code also aus folgenden Bestandteilen:

  • Erste drei Stellen: Länderpräfix (in Deutschland 400 bis 440)
  • Folgende vier bis sechs Stellen: Unternehmensnummer des Herstellers
  • Folgende drei bis fünf Stellen: Artikelnummer, muss zusammen mit den vorherigen Stellen insgesamt 12 Stellen ergeben
  • Letzte Stelle: Prüfcode, der die Richtigkeit der vorherigen Stellen gewährleistet

Bei Büchern besteht die ISBN aus diesen Informationen:

  • Erste drei Stellen: Ein Code für Bücher (978 und 979, für Zeitschriften 977)
  • Folgende ein bis drei Stellen: Ländernummer (Gruppennummer), für Deutschland beispielsweise 3
  • Die folgenden sieben bis neun Stellen enthalten die Verlagsnummer und die Titelnummer.
  • Die letzte Stelle enthält wiederum die Prüfziffer.

Prüfziffer berechnen

Bevor wir uns an die Ausgabe des EAN-13-Codes in einem Access-Bericht begeben, schauen wir uns noch die Berechnung der Prüfziffer an, also der letzten Ziffer des Codes.

Diese erfolgt nach der Formel aus Abb. 1. Das bedeutet, dass Sie zunächst die erste, dritte, fünfte, siebte, neunte und elfte Ziffer addieren. Als Nächstes addieren Sie die zweite, vierte, sechste, achte, zehnte und zwölfte Ziffer und multiplizieren diese Summe mit 3. Danach berechnet man den Modulo für die Summe der beiden Zwischenergebnisse und die Zahl 10, was bedeutet, dass Sie den Rest der Division ermitteln. Angenommen, wir arbeiten mit der Zahl 978394421600, dann erhalten wir als erste Summe 9+8+9+4+1+0 gleich 31 und als zweite Summe 7+3+4+2+6+0 gleich 22. Die erste Summe zum Dreifachen der zweiten Summe addiert ergibt 97. Der Modulo aus 97 und 10 ist 7. Dieses Ergebnis wird schließlich noch von 10 subtrahiert und erneut mit mod 10 behandelt - dies sorgt dafür, dass der Wert 10 gegebenenfalls zum Ergebnis 0 führt und keine zweistellige Prüfziffer herauskommt.

pic001.png

Abb. 1: Formel zur Berechnung der Prüfziffer

Dies müssen Sie nun nur noch in VBA-Code gießen. Kein Problem - das Ergebnis sieht wie in Listing 1 aus. Die Funktion Pruefziffer erwartet eine zwölfstellige Zeichenkette, anderenfalls wird sie gleich mit einer entsprechenden Meldung beendet. Die beiden Summen über die Ziffern auf den ungeraden und den geraden Positionen bildet die Funktion in einer Schleife, wobei der Faktor drei bei den Ziffern auf den geraden Positionen gleich mit einfließt. Die letzte Anweisung der Prozedur führt die beiden Modulo-Operationen durch und gibt das Endergebnis als Funktionswert zurück.

Listing 1: Ermitteln der Prüfziffer für einen EAN-Code

Public Function Pruefziffer(strEANOhne) As String

    Dim intSummeEinfach As Integer

    Dim intSummeDreifach As Integer

    Dim i As Integer

    If Not Len(strEANOhne) = 12 Then

        MsgBox "Die zu prüfende Ziffernfolge muss zwölf Ziffern enthalten."

        Exit Function

    End If

    For i = 1 To 6

        intSummeEinfach = intSummeEinfach + Mid(strEANOhne, i * 2 - 1, 1)

        intSummeDreifach = intSummeDreifach + 3 * Mid(strEANOhne, i * 2, 1)

    Next i

    Pruefziffer = (10 - (intSummeEinfach + intSummeDreifach) Mod 10) Mod 10

End Function

Wenn Sie eine solche Funktion erstellen und testen, helfen einige Testaufrufe mit Beispielwerten weiter. Dies kann etwa wie in Listing 2 aussehen und liefert eine entsprechende Ausgabe an das Direktfenster.

Listing 2: Testaufrufe der Prüfziffern-Berechnung

Public Sub Test_Pruefziffer()

    Debug.Print "978382732950", Pruefziffer("978382732950") = "9", Pruefziffer("978382732950")

    Debug.Print "978394421600", Pruefziffer("978394421600") = "3", Pruefziffer("978394421600")

    Debug.Print "978394421601", Pruefziffer("978394421601") = "0", Pruefziffer("978394421601")

    ...

End Sub

Nachdem diese Funktion schon recht einfach zu erstellen war, setzen wir noch eine weitere Funktion oben drauf, mit der Sie einen 13-stelligen EAN-Code auf seine Gültigkeit prüfen können. Diese Funktion heißt EANPruefen und sieht wie in Listing 3 aus. Die Funktion prüft wiederum die korrekte Länge des zu prüfenden Codes und teilt diesen dann zunächst in den eigentlichen Code (also die ersten zwölf Ziffern) und die Prüfziffer auf. Wenn die an der letzten Stelle des Codes enthaltene Prüfziffer mit der Prüfziffer übereinstimmt, welche die Funktion Pruefziffer für die ersten zwölf Stellen ermittelt, dann ist der EAN-Code inklusive Prüfziffer korrekt.

Listing 3: Prüfung kompletter EAN-Codes inklusive Prüfziffer

Public Function EANPruefen(strEAN) As Boolean

    Dim strEANOhne As String

    Dim strPruefziffer As String

    If Not Len(strEAN) = 13 Then

        MsgBox "Die zu prüfende Ziffernfolge muss 13 Ziffern enthalten."

        Exit Function

    End If

    strEANOhne = Left(strEAN, 12)

    strPruefziffer = Right(strEAN, 1)

    EANPruefen = strPruefziffer = Pruefziffer(strEANOhne)

End Function

EAN-Strichcode

Wenn Sie denken, damit wäre der komplizierteste Teil erledigt, irren Sie. Verglichen mit dem Aufwand, der zum Ausdrucken des Strichcodes für einen EAN-Code nötig ist, war dies ein Kinderspiel. In Abb. 2 haben wir einen solchen Strichcode schematisch abgebildet. Der Strichcode unterteilt sich grob in die folgenden Bereiche:

pic002.png

Abb. 2: Aufbau des Strichcodes

  • Strich 1 bis 3: Startbegrenzung
  • Strich 4 bis 45: Code für die Ziffern 2 bis 7
  • Strich 46 bis 50: Markierung zum Aufteilen der ersten und zweiten Hälfte des tatsächlichen Codes
  • Strich 51 bis 92: Code für die Ziffern 8 bis 13
  • Strich 93 bis 95: Abschlussbegrenzung

Die erste Ziffer wird nicht als Strichcode abgebildet, sie entscheidet jedoch, wie die ersten sechs Ziffern als Strichcode dargestellt werden. Und das geht so: Sie schauen in die Tabelle aus Abb. 3 und suchen die Zeile heraus, die der ersten Ziffer entspricht. Bei Büchern ist das immer die Ziffer 9, also verwenden wir die unterste Zeile.

pic003.png

Abb. 3: Festlegung der zu verwendende Spalte für die Strichcodes

Damit und mit der Tabelle aus Abb. 4 betrachten wir nun die folgenden zwölf Ziffern. Für unser Beispiel 978-3-8273-2950-9 (der besseren Übersicht halber als ISBN formatiert) kommt also als Erstes die Ziffer 7 an die Reihe. Dies ist die zweite Ziffer, also verwenden wir Spalte A. Spalte A liefert für die Ziffer 7 den Wert 0111011.

pic004.png

Abb. 4: Je nach dem Wert der ersten Ziffer wird die aktuelle Ziffer durch eine dieser Ziffernfolgen ersetzt.

Die dritte Ziffer ist die 8 und soll durch den entsprechenden Wert aus Spalte B ersetzt werden - also 0001001. So gehen wir weiter vor und finden für die zweite bis siebte Ziffer diese Werte:

  • Die zweite Ziffer 7 entspricht 0111011 (aus Spalte A),
  • die dritte Ziffer 8 entspricht 0001001 (aus Spalte B),
  • die vierte Ziffer 3 entspricht 0100001 (aus Spalte B),
  • die fünfte Ziffer 8 entspricht 0110111 (aus Spalte A),
  • die sechste Ziffer 2 entspricht 0011011 (aus Spalte B) und
  • die siebte Ziffer 7 entspricht 0111011 (aus Spalte A).

Bei der achten bis dreizehnten Ziffer ist es einfacher, da die entsprechenden Werte alle aus Spalte C der zweiten Tabelle stammen. Für die Ziffern 329509 kommt so der Ausdruck 1000010-1101100-1110100-1001110-1110010-1110100 zusammen (der besseren Übersicht wegen durch Bindestriche getrennt).

Damit hätten wir zwei sehr längliche Ausdrücke, die aus 1 und 0 bestehen. Vor dem ersten Ausdruck (also den 42 Zeichen für die ersten sechs Ziffern) schieben wir nun die Startbegrenzung 101 ein, zwischen den Ausdrücken für die Ziffern zwei bis sieben und acht bis dreizehn fügen wir als Unterteilung 01010 ein und am Ende hängen wir nochmals als Endbegrenzung die Folge 101 an.

Dies ergibt 101_0111011_0001001_0100001_0110111_0011011_0111011_01010_1000010_1101100_1110100_1001110_1110010_1110100_101, wobei die einzelnen Elemente für die Übersicht durch Unterstriche voneinander getrennt wurden.

Und das ist auch schon die Grundlage für den Strichcode! Sie müssen nun nur noch für jede 1 einen Strich markieren und für jede 0 einen Leerraum, wobei Striche und Leerräume natürlich die gleiche Breite aufweisen müssen. Die Striche für die Start- und die Endbegrenzungen 101 sowie den Mittelteil 01010 müssen unten länger sein, die Zahlen werden davor beziehungsweise dazwischen platziert.

Nun kommen zwei Aufgaben auf uns zu: Erstens die Erstellung einer Prozedur, die aus den 13 Ziffern eines EAN-Codes den aus 1 und 0 bestehenden und in Form eines Strichcodes anzeigbaren Ausdruck zu ermitteln und - noch interessanter - das Erstellen eines Access-Berichts, der diese Striche auf den Bericht zaubert.

Strichcode aus EAN-Code berechnen

Die Funktion ConvertEAN ermittelt die aus 1 und 0 bestehende Zeichenfolge, die es ermöglicht, einen EAN-Code als Strichcode anzuzeigen (siehe Listing 4). Die Funktion nimmt den EAN-Code als String-Parameter entgegen, sodass ein Aufruf etwa im Direktfenster wie in Abb. 5 erfolgt.

Listing 4: Ermitteln der Binärzeichenfolge aus einem EAN-Code

Public Function ConvertEAN(strEAN As String) As String

    Dim i As Integer

    Dim intNumber As Integer

    Dim strResult As String

    Const cTA As String = "0001101001100100100110111101010001101100010101111011101101101110001011"

    Const cTB As String = "0100111011001100110110100001001110101110010000101001000100010010010111"

    Const cTC As String = "1110010110011011011001000010101110010011101010000100010010010001110100"

    strResult = strResult & "101"

    For i = 2 To 7 'Ziffern 2 bis 13

        intNumber = Mid(strEAN, i, 1)

        Select Case i

            Case 2

                Select Case Left(strEAN, 1)

                    Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

                        strResult = strResult & Mid(cTA, (intNumber) * 7 + 1, 7)

                End Select

        Case 3

            Select Case Left(strEAN, 1)

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.