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).
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.
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).
Bild 3: Entwurf der Tabelle tblErrorCorrectionLevels
Bild 4 zeigt die Tabelle tblErrorCorrectionLevels mit den vier verfügbaren 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.
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.
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.
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.
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.
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.
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.
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.
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