EPC-QR-Code per COM-DLL erstellen

Spätestens seit sich das Onlinebanking immer mehr auf das Smartphone verschiebt, wird das Eingeben von Rechnungsdaten wie langen IBANs oder Verwendungszwecken zu einer undankbaren Aufgabe. Und auch wenn die Papierrechnungen weniger werden und sich die Daten von PDF-Rechnungen leicht per Copy und Paste übertragen lassen, so ist doch der EPC-QR-Code eine tolle Erleichterung: Dieser QR-Code enthält alle für eine Überweisung benötigten Daten und viele Onlinebanking-Apps bieten mittlerweile die Möglichkeit, solche Codes mithilfe der Smartphone-Kamera einzulesen. Um dieses Feature in Access-Berichten bereitzustellen, benötigen wir erst einmal eines: Ein Tool, mit dem wir solche QR-Codes erstellen können. Dieser Beitrag zeigt, wie wir eine .NET-DLL programmieren, die uns diese Aufgabe abnimmt.

Für viele Anwendungsbereiche bietet .NET Bibliotheken und Tools, die dem VBA-Entwickler auf direktem Wege nicht zugänglich sind. Zum Glück wird es immer einfacher, diese Helferlein in Form beispielsweise von COM-DLLs auf der Basis von .NET zu programmieren und diese mit einer Schnittstelle auszustatten, auf die wir auch von Access aus leicht zugreifen können.

Für die Aufgabe, die wir uns in diesem Beitrag vornehmen, benötigen wir die folgenden Dinge:

  • eine Definition, wie die Informationen zusammengestellt werden, die für das Einlesen in eine Überweisung nötig sind,
  • eine Bibliothek, die das Erstellen von QR-Codes erlaubt und
  • ein VB.NET-Projekt, das die ersten beiden zusammenführt und in Form einer COM-DLL für den Zugriff von VBA aus verfügbar macht.

Schließlich benötigen wir noch eine Datenbank, welche die damit zu erstellenden Bilddateien mit QR-Codes nutzt und in Rechnungsberichte einbettet, sodass diese vom Rechnungsempfänger per Smartphone-Kamera erfasst und für das schnelle Eintragen der Rechnungsdaten in das Überweisungsformular genutzt werden kann. Diese beschreiben wir in einem weiteren Beitrag namens Rechnungsbericht mit EPC-QR-Code (www.access-im-unternehmen.de/****).

Wie sieht der Inhalt des EPC-QR-Codes aus?

Als Erstes schauen wir uns an, welchen Aufbau der Text hat, der als Grundlage für das Erstellen des EPC-QR-Codes genutzt wird. EPC steht übrigens für European Payment Code.

Ein Beispiel für den Inhalt finden wir auf Wikipedia, die praktischerweise direkt die Bezahldaten für eine Spende an Wikipedia selbst im Beispielcode untergebracht haben. Der Inhalt sieht wie folgt aus:

BCD
001
1
SCT
BFSWDE33BER
Wikimedia Foerdergesellschaft
DE33100205000001194700
EUR123.45
Spende fuer Wikipedia

In diesem Beispiel sehen Sie einige Leerzeilen, und auch die letzte Zeile könnte noch mit Inhalt gefüllt sein. Daher hier die Zeilen mit der Beschreibung der Inhalte:

  • Zeile 1 (Beispiel: BCD): Service Tag (fester Wert)
  • Zeile 2 (Beispielwert: 002): Version (001 oder 002)
  • Zeile 3 (Beispielwert: 2): Zeichencodierung (1=UTF-8, 2=ISO 8859-1, 3=ISO 8859-2, 4=ISO 8859-4, 5=ISO 8859-5, 6=ISO 8859-7, 7=ISO 8859-10, 8=ISO 8859-15)
  • Zeile 4 (Beispielwert: SCT): Identifikation, dreistelliger Code – derzeit nur SCT (SEPA Credit Transfer)
  • Zeile 5 (Beispielwert: BFSWDE33BER): BIC der Empfängerbank (in Version 001 erforderlich; in Version 002 innerhalb des EWR optional)
  • Zeile 6 (Beispielwert: Wikimedia Foerdergesellschaft): Name des Zahlungsempfängers (maximal 70 Zeichen Text)
  • Zeile 7 (Beispielwert: DE33100205000001194700): Internationale Bankkontonummer (IBAN) des Zahlungsempfängers
  • Zeile 8 (Beispielwert: EUR123.45): Zahlungsbetrag (Format EUR#.##, zwischen 0.01 und 999999999.99, optional)
  • Zeile 9 (Beispielwert: CHAR): Zweck (max. vierstelliger Code analog dem Textschlüssel nach DTA-Verfahren, optional)
  • Zeile 10 (Beispielwert RF18 5390 0754 7034): Referenz (strukturierter 35-Zeichen-Code gem. ISO 116 RF Creditor Reference, optional)
  • Zeile 11 (Beispielwert: Spende fuer Wikipedia): Verwendungszweck (unstrukturierter maximal 140 Zeichen langer Text, optional)
  • Zeile 12 (Beispielwert: ./.): Hinweis an den Nutzer (maximal 70 Zeichen, optional)

Wir wollen in diesem Beispielprojekt lediglich die wichtigsten Daten unterbringen. Wie Sie oben gesehen haben, legt man in der zweiten Zeile die Version des EPC-QR-Codes fest, der eigentlich nur einen Unterschied bewirkt: Die erste Version verlangt nach einem BIC, die zweite tut das nicht. Um das Beispiel einfach zu halten, nutzen wir hier die Version 2 und geben den BIC nicht an. Die ersten vier Zeilen enthalten Standardwerte, einige Zeilen bleiben leer, so müssen wir nur die folgenden Daten mit der zu erstellenden COM-DLL entgegennehmen:

  • Zahlungsempfänger
  • IBAN
  • Zahlungsbetrag
  • Zweck

.NET-Projekt für die COM-DLL erstellen

Damit können wir direkt mit der Erstellung der COM-DLL in Visual Studio beginnen. Visual Studio ist in der Community-Edition schon seit einer ganzen Weile kostenlos. Scheuen Sie sich also nicht, es auszuprobieren – es macht Spaß, mal mit einer alternativen Entwicklungsumgebung zu arbeiten!

Nachdem Visual Studio gestartet ist, hier in der Version 2019, legen Sie ein neues Projekt an. Dazu verwenden wir die Vorlage Klassenbibliothek (.NET-Framework), die Sie wie in Bild 1 auswählen und mit einem Klick auf die Weiter-Schaltfläche bestätigen.

Auswahl des geeigneten Projekttyps

Bild 1: Auswahl des geeigneten Projekttyps

Mit dem folgenden Dialog ist das Erstellen des Projekts bereits abgeschlossen: Hier geben sie noch den Namen für das Projekt ein und legen den Zielordner fest. Sie müssen keinen neuen Ordner anlegen, Visual Studio legt einen Ordner mit dem zuvor festgelegten Namen des Projekts an (siehe Bild 2).

Eingabe von Zielordner und Projektname

Bild 2: Eingabe von Zielordner und Projektname

Klassennamen ändern

Wenn Sie den Projektmappen-Explorer einsehen, finden Sie hier eine einzige Klasse namens Class1.vb. Den Namen dieser Klasse ändern wir auf EPCQRCodeGenerator.vb (siehe Bild 3).

Ändern des Namens der einzigen Klasse

Bild 3: Ändern des Namens der einzigen Klasse

Die anschließende Meldung, ob auch alle Verweise darauf geändert werden sollen, akzeptieren wir mit Ja. Damit ändert sich auch gleich der Name der Klassenbezeichnung im Modul selbst auf EPCQRCodeGenerator.

NuGet-Paket mit QR-Code-Bibliothek importieren

Bevor wir uns an das Programmieren begeben, fügen wir die für das eigentliche Erstellen des QR-Codes notwendige Bibliothek zum Projekt hinzu. Dazu rufen Sie mit dem Menübefehl Projekt|NuGet-Pakete verwalten … den NuGet-Manager auf. Hier klicken Sie auf den Bereich Durchsuchen und geben im Suchen-Feld den Text QRCode ein.

Daraufhin erscheint das Paket QrCode.Net, das wir anklicken und mit einem Klick auf die nun erscheinende Schaltfläche Installieren zum Projekt hinzufügen (siehe Bild 4). Dies legt ein paar Elemente im Projekt an, um die wir uns aber nicht weiter kümmern müssen.

Hinzufügen des NuGet-Pakets QrCode.Net

Bild 4: Hinzufügen des NuGet-Pakets QrCode.Net

Namespaces importieren

Um in der Datei EPCQRCodeGenerator.vb auf die Elemente des hinzugefügten NuGet-Pakets und auf einige andere Elemente zugreifen zu können, machen wir diese mit einigen Imports-Anweisungen verfügbar.

Diese landen direkt ganz oben in der Datei, also noch über der Public Class-Anweisung, und sehen wir folgt aus:

Imports System.Runtime.InteropServices
Imports Gma.QrCodeNet.Encoding
Imports Gma.QrCodeNet.Encoding.Windows.Render
Imports System.Drawing

Für den Import des Namespaces System.Drawing müssen wir überdies noch einen entsprechenden Verweis auf die gleichnamige Bibliothek hinzufügen. Dazu öffnen Sie mit dem Menübefehl Projekt|Verweis hinzufügen… den Dialog Verweis-Manager und suchen dort unter Assemblys nach dem Suchbegriff System.Drawing. Den gefundenen Eintrag fügen Sie durch Setzen eines Hakens zum Projekt hinzu (siehe Bild 5).

Hinzufügen von Verweisen zum Projekt

Bild 5: Hinzufügen von Verweisen zum Projekt

Klasse zum Aufnehmen der Überweisungseigenschaften

Normalerweise würden wir nun einfach eine Klasse erstellen, welche einige öffentlich deklarierte Eigenschaften enthält, über die Sie vom VBA-Editor aus die für die Überweisung notwendigen Informationen an die DLL übergeben können. Diese Klasse würde jedoch auch einige Standardmember von .NET-Klassen bereitstellen wie GetType oder ToString.

Diese benötigen wir aber unter VBA nicht, also gehen wir einen kleinen Umweg. Dazu definieren wir eine öffentliche Schnittstelle, die wir dann implementieren.

Die Schnittstelle wird als solche mit dem Schlüsselwort Public Interface definiert, erhält eine spezielle Auszeichnung, damit sie über die COM-Schnittstelle für den Zugriff von außen bereitgestellt wird und sieht wie folgt aus:

<InterfaceType(ComInterfaceType.InterfaceIsDual)>
Public Interface IEPCQRCode
     Property Verwendungszweck As String
     Property IBAN As String
     Property Betrag As <Runtime.InteropServices. MarshalAs(Runtime.InteropServices. UnmanagedType.Currency)> Decimal
     Property Empfaenger As String
     Function Generate(strPfad As String,  ByRef strErgebnis As String) As Boolean
End Interface

Wir stellen also genau die gefragten Eigenschaften bereit plus eine Funktion namens Generate, mit der wir den QR-Code generieren und unter dem angegebenen Pfad speichern können.

Implementierung der Schnittstelle

Die Schnittstelle implementieren wir unter VB.NET genauso, wie Sie es auch von VBA kennen. Sie erstellen eine Klasse und zeigen hier mit dem Schlüsselwort Implements und Angabe der Schnittstellenbezeichnung an, dass diese Klasse die Schnittstelle implementiert. Sollte dieses Thema noch neu für Sie sein: Die Implementierung einer Schnittstelle muss alle in der Schnittstellendefinition vorgegebenen Member umsetzen, also beispielsweise wie hier die Property-Eigenschaften und die Funktion Generate.

Den ersten Teil dieser Schnittstelle finden Sie in Listing 1. Wenn Sie schon einmal Property-Eigenschaften in Klassenmodulen mit VBA abgebildet haben, vermissen Sie möglicherweise die einzelnen Property Get…– und Property Set/Let…-Prozeduren.

<ClassInterface(ClassInterfaceType.None)>
Public Class EPCQRCodeGenerator
         Implements IEPCQRCode
     Public Property Verwendungszweck As String Implements IEPCQRCode.Verwendungszweck
     Public Property BIC As String Implements IEPCQRCode.BIC
     Public Property IBAN As String Implements IEPCQRCode.IBAN
     Public Property Betrag As Decimal Implements IEPCQRCode.Betrag
     Public Property Empfaenger As String Implements IEPCQRCode.Empfaenger
     ...

Listing 1: Erster Teil der Schnittstellen-Implementation

Unter VB.NET könnte man eine solche Eigenschaft auch wie folgt definieren:

Dim _Verwendungszweck As String
Public Property Verwendungszweck As String _
         Implements IEPCQRCode.Verwendungszweck
     Get
         Return _Verwendungszweck
     End Get
     Set(value As String)
         _Verwendungszweck = value
     End Set
End Property

Sie würden also auch hier eine privat deklarierte Member-Variable wie _Verwendungszweck deklarieren und dazu eine einzige Property-Prozedur, die dann die Get– und die Set-Prozedur untergeordnet darstellt und _Verwendungzweck zurückgibt oder setzt.

Wenn diese Property aber keinen weiteren Code enthält wie beispielsweise eine Validierung, dann können Sie auch wie hier die folgende verkürzte Schreibweise nutzen:

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