QR-Codes mit Access erzeugen, Teil I

Wohin man schaut, überall findet man QR-Codes. Falls Sie es nicht wissen: Das sind diese Kästchen, die mit mehr oder weniger chaotisch angeordneten Pixeln daherkommen. QR steht für Quick Response und der QR-Code ist im Gegensatz zu den Strichcodes ein zweidimensionaler Code. Er wurde 1994 von der japanischen Firma Denso Wave entwickelt und genießt eine immer größere Verbreitung. Da man darin beliebige Texte unterbringen kann, sind die Anwendungszwecke vielfältig und reichen von der Kennzeichnung von Bauteilen bis hin zur Kodierung von URLS, Telefonnummern oder kompletten Visitenkarten.

Und da heutzutage jedes bessere Smartphone mit einer Kamera ausgestattet ist und Apps einsetzen kann, die sich zum Auslesen von QR-Codes eignen, wollen wir nicht hintenanstehen und eine eigene Implementierung zum Erstellen und Drucken von QR-Codes liefern. Diese können Sie dann etwa zur Codierung von Bestellnummern auf Rechnungen et cetera nutzen.

Obwohl der QR-Code von einem einzelnen Unternehmen entwickelt wurde, ist dieser lizenzfrei und kann frei verwendet werden.

Grundsätzlich bildet der QR-Code einen Text im Binärformat ab, also als Folgen der Zeichen 0 und 1. Eine 0 entspricht einer weißen Stelle im Code, eine 1 einer schwarzen.

Größe der Matrix

Die Größe der Codes reicht von 21 x 21 bis 177 x 177 Pixeln. Die verschiedenen Größen werden mit einer Version versehen. 21 x 21 entspricht Version 1, 25 x 25 Version 2 und so weiter – bis hin zu 177 x 177 mit Version 40. Die Seitenlänge der Matrix für den Code wächst also abhängig vom benötigten Platz in Viererschritten.

Fehlerkorrektur

Neben dem eigentlichen codierten Text enthält der QR-Code noch eine Fehlerkorrektur. Es kann vorkommen, dass Teile des Codes unlesbar sind – beispielsweise weil an einem Aufkleber ein Teil des Codes beschädigt wurde. Deshalb wird der Text redundant im Code untergebracht. Es gibt vier verschiedene Stufen der möglichen Fehlerkorrektur:

  • L: Erlaubt das Wiederherstellen des Textes, wenn 7% des Codes unlesbar sind.
  • M: Stellt den Text bei bis zu 15% unlesbarem Code wieder her.
  • Q: 25%
  • H: 30%

Codierung

Je nach den zu codierenden Daten können Sie eine unterschiedliche Codierung verwenden. Es gibt die folgenden vier Möglichkeiten:

  • numerisch,
  • alphanumerisch,
  • binär und
  • Kanji (japanische Version chinesischer Schriftzeichen).

Für unsere Belange sind vor allem numerische und alphanumerische Zeichen interessant. Wenn Sie beispielsweise nur numerische Zeichen verwenden möchten, benötigen Sie dazu weniger Platz als etwa für alphanumerische Zeichen.

Welche Codierung Sie verwenden, wird wiederum an geeigneter Stelle im QR-Code abgebildet, damit das Lesegerät den Code entsprechend interpretieren kann.

QR-Code generieren

Ein QR-Code besteht aus verschiedenen Elementen. Einige davon sind Markierungen, die notwendig sind, damit das Lesegerät die Position zum Einlesen bestimmen kann. Weitere liefern Informationen darüber, welche Codierung und welche Fehlerkorrektur verwendet wurde. Den restlichen Platz füllt der eigentliche codierte Text sowie weitere speziell definierte Pixel, um den verbleibenden Platz aufzufüllen.

Allgemeiner Ablauf

Die Erstellung eines QR-Codes erfolgt in den folgenden Schritten:

  • Schritt 1: Datenanalyse. In diesem Schritt prüfen Sie, welche Zeichen der abzubildende Text enthält, und wählen eine geeignete Codierung.
  • Schritt 2: Codierung der Daten. Auf Basis der zu codierenden Zeichen und der gewählten Codierung wird der Text in eine Zeichenkette aus 0 und 1 umgewandelt.
  • Schritt 3: Codierung des Codes zur Fehlerkorrektur. Mit der sogenannten Reed-Solomon-Codierung wird der Code erneut codiert.
  • Schritt 4: Zusammenstellen des Codes für die eigentlichen Daten und den Fehlerkorrektur-Code.
  • Schritt 5: Platzieren der Module in der Matrix. In diesem Schritt werden die einzelnen codierten Texte, also die Markierungen, die Informationen etwa über die Codierung und den Grad der Fehlerkorrektur sowie der eigentliche Text und die Fehlerkorrektur in die Matrix eingearbeitet. Dies geschieht in einer speziellen Reihenfolge.
  • Schritt 6: Maske festlegen. Es kann sein, dass die Bits sehr ungleichmäßig über die Matrix verteilt sind, was ein Einlesen erschwert. Zu diesem Zweck bieten QR-Codes acht verschiedene Masken, die über die Matrix gelegt werden können, um die beste Maske nach verschiedenen Kriterien zu finden. Diese Maske wird schließlich über die Matrix gelegt, wobei die Matrix natürlich auch wieder einen Hinweis auf die verwendete Maske enthalten muss.
  • Schritt 7: Weitere Informationen hinzufügen. Hier werden noch vorbestimmte Bereiche der Matrix mit Informationen etwa über den Grad der Fehlerkorrektur et cetera gelegt.

Vereinfachte Variante

Wir werden in diesem Beitrag einfache QR-Codes erstellen und gegebenenfalls das eine oder andere Feature auslassen.

Tabellen der Anwendung

Um dem Charakter einer Access-Anwendung als Datenbank gerecht zu werden, speichern wir einige für die Konfiguration notwendigen Daten in Tabellen. Die erste Tabelle heißt tblVersions und enthält die vier Versionen. Neben dem Primärschlüsselfeld liefert es noch die beiden Felder Version, die den Kennbuchstaben für diese Version aufnehmen, sowie das Feld VersionWidth, das die Kantenlänge für den QR-Code dieser Version speichert (siehe Bild 1).

Entwurf der Tabelle tblVersions

Bild 1: Entwurf der Tabelle tblVersions

In Bild 2 finden Sie die Tabelle tblVersions mit den enthaltenen Daten. Diese enthält alle 40 vorgesehenen Versionen.

Die Tabelle tblVersions mit den benötigten Datensätzen

Bild 2: Die Tabelle tblVersions mit den benötigten Datensätzen

Die nächste Tabelle heißt ErrorCorrectionLevels und enthält die Felder ErrorCorrectionLevelID als Primärschlüsselfeld, ErrorCorrectionLevel mit dem entsprechenden Buchstaben (also L, M, Q oder H) und das Feld ErrorCorrectionPercent mit dem ausgleichbaren Fehler in Prozent (siehe Bild 3).

Entwurf der Tabelle tblErrorCorrectionLevels

Bild 3: Entwurf der Tabelle tblErrorCorrectionLevels

Bild 4 zeigt die Tabelle tblErrorCorrectionLevels mit den vier verfügbaren Werten.

Die Tabelle tblErrorCorrectionLevels mit ihren Werten

Bild 4: Die Tabelle tblErrorCorrectionLevels mit ihren Werten

Die Tabelle tblCharacterCapacities führt die bisherigen Tabellen zusammen und liefert für jede dieser Tabellen die Kapazität für die vier Kodierungsarten Numerisch, Alphanumerisch, Binär und Kanji. Der Entwurf dieser Tabelle sieht wie in Bild 5 aus.

Entwurf der Tabelle tblCharacterCapacities

Bild 5: Entwurf der Tabelle tblCharacterCapacities

Die Tabelle enthält die Felder CharacterCapacity als Primärschlüsselfeld, VersionID als Fremdschlüsselfeld zur Tabelle tblVersions und ErrorCorrectionLevelID als Fremdschlüsselfeld zur Tabelle tblErrorCorrectionLevel. Außerdem finden Sie hier die vier Felder CharactersNumericMode, CharactersAlphanumericMode, CharactersByteMode und CharactersKanjiMode. Diese nehmen die Anzahl der verfügbaren Zeichen für die entsprechende Konstellation auf.

Auch die Werte dieser Tabelle haben wir der Datenbank hinzugefügt. Bild 6 zeigt einen Ausschnitt der zur Verfügung stehenden Kombinationen.

Inhalt der Tabelle tblCharacterCapacities

Bild 6: Inhalt der Tabelle tblCharacterCapacities

Nun habe ich diese Form der Tabelle gewählt, da sich so die Daten aus der entsprechenden Tabelle unter http://www.thonky.com/qr-code-tutorial/character-capacities/ leicht hineinkopieren lassen. In der Tat ist für unsere Zwecke jedoch eine weitere Normalisierung dieser Tabele sinnvoll. So erstellen wir eine weitere Tabelle namens tblModes, welche die drei Felder ModeID, Mode und ModeIndicator enthält. Mode enthält eine Bezeichnung, ModeIndicator wird später erläutert.

Dieser fügen wir vier Datensätze mit den Werten aus Bild 7 hinzu.

Inhalt der Tabelle tblModes

Bild 7: Inhalt der Tabelle tblModes

Dadurch müssen wir die Tabelle tblCharacterCapabilities ebenfalls anpassen beziehungsweise neu erstellen. Dazu ändern wir den Namen dieser Tabelle in tblCharacterCapacities_Alt. Die neue Tabelle sieht im Entwurf wie in Bild 8 aus. Sie enthält nicht mehr den Wert für die zulässigen Zeichen für die vier verschiedenen Modes, sondern erlaubt die Kombination aus Version, ErrorCorrectionLevel und Mode, um die dieser Kombination entsprechende CharacterCapability in das gleichnamige Feld einzutragen.

Neuer Entwurf der Tabelle tblCharacterCapabilities

Bild 8: Neuer Entwurf der Tabelle tblCharacterCapabilities

Nun benötigen wir noch eine kleine Routine, welche die Daten aus der alten in die neue Tabelle überträgt. Diese sieht wie in Listing 1 aus und durchläuft alle Datensätze der Tabelle tblCharacterCapacities_Alt.

Public Sub TabelleUebertragen()
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Dim lngModeID As Long
     Dim intCharacterCapacity
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM tblCharacterCapacities_Alt", dbOpenDynaset)
     Do While Not rst.EOF
         intCharacterCapacity = DLookup("CharactersNumericMode", "tblCharacterCapacities_Alt", _
             "CharacterCapacityID = " & rst!CharacterCapacityID)
         lngModeID = DLookup("ModeID", "tblModes", "Mode=''Numeric''")
         db.Execute "INSERT INTO tblCharacterCapacities(VersionID, ErrorCorrectionLevelID, ModeID, " _
             & "CharacterCapacity) VALUES(" & rst!VersionID & ", " & rst!ErrorCorrectionLevelID _
             & ", " & lngModeID & ", " & intCharacterCapacity & ")", dbFailOnError
         ''... übrige drei ModeIDs
         rst.MoveNext
     Loop
End Sub

Listing 1: Umwandeln der Daten der Tabelle tblCharacterCapacities_Alt zu tblCharacterCapacities

Dabei legt sie für jeden der Datensätze vier neue in der Tabelle tblCharacterCapacities an – je einen für jeden Mode.

Der Mode landet in Form des entsprechenden Primärschlüsselwertes der Tabelle tblModes im Fremdschlüsselfeld ModeID, der ehemalige Wert der Felder CharactersNumericMode, CharactersAlphanumericMode et cetera landen im Feld CharacterCapacity. Das Ergebnis sieht schließlich wie in Bild 9 aus. Hier können wir nun durch Filtern nach den entsprechenden Parametern die richtige optimale Version für die benötigte Anzahl Zeichen, den Fehlerkorrektur-Grad und den Mode auswählen.

Alle Kombinationen aus Version, ErrorCorrectionLevel und Mode samt CharacterCapacity in einer Tabelle

Bild 9: Alle Kombinationen aus Version, ErrorCorrectionLevel und Mode samt CharacterCapacity in einer Tabelle

Formular zum Ermitteln der richtigen Version

Dazu bereiten wir ein kleines Formular vor, das im Entwurf wie in Bild 10 aussieht.

Formular zur Eingabe von Text, Mode, Fehlerkorrektur und Version

Bild 10: Formular zur Eingabe von Text, Mode, Fehlerkorrektur und Version

Das Formular ist an die Tabelle tblQRCodes aus Bild 11 gebunden, das soweit alle notwendigen Informationen aufnimmt. Neben dem zu codierenden Text sind das zunächst der Modus, der Grad der Fehlerkorrektur sowie die darauf basierende Version des QR-Codes.

Tabelle zum Speichern der QR-Code-Informationen

Bild 11: Tabelle zum Speichern der QR-Code-Informationen

Um die richtige Version zu ermitteln, muss der Benutzer zunächst den zu codierenden Text in das Textfeld txtAusgangstext eingeben. Aus diesem ermittelt das Formular später die Anzahl der zu codierenden Zeichen. Außerdem ist die Auswahl des Modus mit dem Kombinationsfeld cboModeID und die Auswahl des Grades der Fehlerkorrektur mit dem Kombinationsfeld cboErrorCorrectionLevelID nötig.

Die Aktualisierung aller drei Steuerelemente löst jeweils das Ereignis Nach Aktualisierung und somit eine entsprechende Ereignisprozedur aus. Diese enthalten allesamt den Aufruf einer weiteren Prozedur namens VersionAktualisieren. Diese Prozedur sorgt dafür, dass das Kombinationsfeld cboVersionID nur die möglichen Einträge anzeigt, wobei die Zeichenanzahl des zu codierenden Textes, der gewählte Modus sowie die gewählte Fehlerkorrektur berücksichtigt werden. Die Werte des Kombinationsfeldes cboVersionID sehen danach etwa wie in Bild 12 aus.

Formular zur Auswahl der Parameter

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar