Vereinfachter Zugriff auf Microtech büro+ per .NET

Die COM-Aktiv-Schnittstelle von Büro Plus Next bietet nur unkomfortablen, untypisierten Zugriff auf die Daten von Büro Plus Next. Abhilfe schafft eine mit T4 generierte Wrapper-API.

Für die Implementierung individueller Schnittstellen zu Büro Plus Next stellt Microtech die sogenannte COM-Activ-Schnittstelle Bereich. Es handelt sich hierbei um ein COM-Server Objekt, das im Executable des Büro Plus Next-Client BpNext.exe enthalten ist. Das .Net-Framework wiederrum macht den Zugriff auf COM-Dienste per Interop sehr einfach.

So weit, so gut. Jedoch ist die API der COM-Aktiv-Schnittstelle, die von .Net Interop bei Referenzierung des COM-Servers automatisch generiert wird, unkomfortabel und untypisiert. Sie erfordert Kenntnis der Namen und Typen der DataSets, Felder und Indices von Büro Plus Next.

Jedoch hat die API auch ihre Stärken: Über einen Introspektion-Mechanismus (z.B. die Interfaces BpNT.AutoDataSetInfo, BpNT.AutoFieldInfo, etc.) stehen Informationen über das Schema der Tabellen zur Verfügung. Dies kann genutzt werden, um einen stark-typisierten Wrapper um die Basis-Klassen des COM-Dienstes zu erstellen.

Aufgrund der grossen Anzahl an DataSets, Felder und Indices von Büro Plus Next bietet es sich an den Quellcode für die Wrapper-Klassen automatisch zu generieren. Hierzu bietet sich das sogenannte Text Template Transformation Toolkit (T4), das seit Visual Studio 2008 standardmäßig in der IDE enthalten ist, an. T4 transformiert textuelle Vorlagen/Templates unter Einbeziehung externen Daten in eine textuelle Ausgabe-Datei (z.B. C#-Quelltext). Diese Transformationsvorgänge sind nichts Besonderes; z.B. werden in der Webprogrammierung PHP- bzw. ASP.Net-Vorlagen (textuelles Template) in HTML (Ausgabe-Datei), das Daten aus einer Datenbank darstellt, überführt. Eine gute Quelle für weitere Informationen zu T4 ist die Homepage von Oleg Sych.

Wir haben uns für eine Lösung entschieden, bei der für jedes DataSet (z.B. Adressen) mehrere Dateien generiert werden. Es gibt eine Datei, die den Zugriff auf die Menge alle Datensätze regelt (z.B. AdressenSet.generated.cs), eine Datei für den Zugriff auf die einzelnen Felder als .Net-Eigenschaften (z.B. Adressen.generated.cs und jeweils eine Datei für die Indices der Tabelle.

Mit Hilfe dieser Wrapper vereinfacht sich z.B. die Selektierung von Datensätzen ungemein. Was jedoch noch viel wichtiger ist, der Quelltext wird viel leichter lesbar, da die Abstraktion durch die COM-Api entfällt. Im folgenden z.B. zwei Testmethoden für das selektieren von Datensätzten per Index:

[TestMethod]
public void CanApplyRangeWithSingleArgument()
{
    BpnConnection con = new BpnConnection("Firma", "Mandant", "User", "Passwd");
    var adressenSet = AdressenSet.CreateInstance(con);

    int count = adressenSet.Indices.NrIndex.ApplyRange(
        new AdressenSetNrIndex.IndexFields() { AdrNr = "EBAY840" }
    );

    Assert.AreEqual(1, count, "Falsche Anzahl von Anschriften selektiert");    
    foreach (var adresse in adressenSet)
        Assert.AreEqual(16326, adresse.ID, "Ids stimmen nicht");
}

[TestMethod]
public void CanApplyRangeWithBeginAndEnd()
{
    BpnConnection con = new BpnConnection("Firma", "Mandant", "User", "Passwd");
    var postleitzahlenSet = PostleitzahlenSet.CreateInstance(con);

    int count = postleitzahlenSet.Indices.PLZIndex.ApplyRange(
        new PostleitzahlenSetPLZIndex.IndexFields() { PLZ = "86600" }, 
        new PostleitzahlenSetPLZIndex.IndexFields() { PLZ = "86699" }
    );

    Assert.AreEqual(37, count, "Falschen Anzahl PLZs selektiert");
}

Einen weiteren Produktivitätsgewinn erhält man durch Intellisense/Code-Vervollständigung und die Dokumentation von Feld-Eigenschaften. So enthält z.B. das Anschriften-Objekt alle Felder, die in diesem DataSet definiert sind. Im Kommentar, wird der Anzeige-Name des Feldes wie im Büro Plus Next-Client sowie der interne Datentyp angegeben. Man kann quasi durch die DataSets von Büro Plus Next navigieren.

Die Bibliothek zum Zugriff auf alle Büro Plus Next-DataSets kann im Quelltext und als DLL als Visual Studio 2010 Projekt hier heruntergeladen werden. Falls Sie Interesse am Code-Generator haben, oder zusätzliche Funktionalität in den generierten Klassen wünschen, kontaktieren Sie mich unverbindlich unter joachim.rosskopf@lx-networking.de oder hinterlassen einen Kommentar.