Klasse für die Übergabe von Parametern an Access Formulare und Berichte

Die Softwareentwicklung ist eines der vielen Betätigungsfelder, wo man eigentlich nie sagen kann, dass man eine Programmiersprache oder Technologie in sämtlichen Facetten zu 100% beherrscht. Wenn ich mal ein Projekt, an dem ich vor einer Weile gearbeitet habe, hervorkrame, den Staub und Spinnenweben weg puste, dann fallen mir oft Stellen im Quellcode auf, die ich nicht optimal umgesetzt habe. In der Regel einfach deswegen, weil ich zum damaligen Zeitpunkt weniger Erfahrung hatte. Oder auch, weil der gedankliche und zeitliche Abstand manchmal ganz gut tut, um auf bessere Lösungsansätze zu kommen.

Um genau so eine Verbesserung geht es in diesem Beitrag, nämlich um die Art und Weise, wie ich mehrere Parameter in Access Formularen übergeben kann.

Parameterübergabe per OpenArgs mit Split

Bisher war meine Vorgehensweise die, dass das Quellformular aus den zu übergebenden Schlüsselwerten eine Zeichenkette (getrennt durch Semikolons) erzeugt und als OpenArgs-Übergabeparameter an das Zielformular übergeben hat.

Dim strRechnungID As String
Dim strPositionID As String

strRechnungID ="1"
strPositionID ="2"

DoCmd.OpenForm FormName:="frmDatumErfassen", OpenArgs:=strRechnungID & ";" & strPositionID

Im Zielformular wurden diese Übergabeparameter aus seinem OpenArgs-Attribut ausgelesen und mit Hilfe der Funktion Split wieder in einzelne Attribute getrennt.

uebergabeparameter = Split(Me.OpenArgs, ";")
'uebergabeparameter(0) - hier war die RechnungID enthalten (Ausprägung 1)
'uebergabeparameter(1) - hier war die PositionID enthalten (Ausprägung 2)

Das Ganze hat auch soweit gut funktioniert, war jedoch nicht optimal. Denn zum einen sah man im Debugmodus den Werten in Me.OpenArgs ihre fachliche Bedeutung gar nicht an. Zum anderen war die Reihenfolge der Übergabeparameter ausschlaggebend. Habe ich die Parameter, sei es mit Absicht, oder aus Versehen, im Quellformular in einer anderen Reihenfolge zusammengesetzt und übergeben, musste natürlich die Reihenfolge beim Zielformular ebenfalls angepasst werden. Ohne diese Anpassung würden schwer zu findende Fehler entstehen – beispielsweisen weil die Rechnungstabelle nicht mit der RechnungsID sondern mit der PositionID gelesen werden würde.

Da ich Parameterübergaben zwischen Formularen und Berichten in nahezu jeder Access-Anwendung einsetze, habe ich mir etwas Zeit genommen, eine bessere Lösung zu entwickeln. Im Nachhinein stellte sich diese auch als nicht sonderlich komplex dar– sie war einfach besser durchdacht.

Parameterübergabe mit openArgs und Parameter-Klasse

Der zentrale Punkt der neuen Lösung ist eine neue Klasse namens ParameterTransmitter. Die interne Datenverwaltung der Klasse basiert auf der Datenstruktur vom Typ Dictionary. Darin fungieren die übergebenen Parameternamen als Keys und deren Ausprägungen als Values. Um die Funktionsweise der Klasse und ihrer Methoden besser nachvollziehen zu können, spielen wir einfach den Prozess der Parameterübergabe und -übernahme einmal durch.

Aufruf für die Datenübergabe

Stellen wir uns vor, wir befinden uns im Formular, welches ein anderes Formular aufrufen und ihm die RechnungsID und die PositionsID übergeben soll. Dafür benötigen wir erstmal ein Objekt der ParameterTransmitter-Klasse. Diesem Objekt übergeben wir mit Hilfe der AddParmeterNode-Methode die beiden benötigen Werte samt derer Parameternamen. Die Reihenfolge der Parameterübergabe ist nicht mehr wichtig. Ich kann sowohl die RechnungsID als erstes übergeben, kann aber auch die PositionID zuerst mitgeben. Um die Parameter ans nächste Formular weiterzureichen, übergebe ich ans OpenArgs-Attribut der OpenForm-Methode lediglich den Methodenauruf getOpenArgs(), der die gespeicherte interne Struktur zur Zeichenkette RechnungID=1;PositionID=2 serialisiert.

Dim objTransmitter As New ParameterTransmitter 

Call objTransmitter.AddParameterNode(“RechnungID“,"1")
Call objTransmitter.AddParameterNode(“PositionID“,"2")

DoCmd.OpenForm FormName:="frmDatumErfassen", OpenArgs:=objTransmitter.getOpenArgs()

Aufruf für die Datenübernahme

Im OpenEvent des Zielformulars platzieren wir dann den untenstehenden Code.

Dim objTransmitter As New ParameterTransmitter

objTransmitter.loadOpenArgs (Me.OpenArgs)

msgbox objTransmitter.GetParameterValue(“PositionID“)

Die loadOpenArgs-Methode nimmt die übergebene Parameterzeichenkette aus der OpenArgs-Eigenschaft des Zielformulars entgegen und deserialisiert sie und legt sie im internen Dictionary des Klassenobjektes ab. Der eine Knoten mit dem Schlüssel RechnungID und der Ausprägung 1 und einen anderen mit dem Schlüssel PositionID und der Ausprägung 2.

Will ich im Formular beispielsweise den übergebenen Wert der RechnungID auslesen, nutze ich einfach die Methode getParameterValue(RechnungID“), die mir den Wert 1 zurückgibt. Der Vorteil dieser zentralen, auf Dictionary basierten Datenhaltung, liegt darin, dass ich mich als Entwickler gar nicht mehr darum kümmern muss, wie die interne Datenhaltung organisiert ist und an welcher Stelle das jeweilige Parameter übergeben wurde. Die Methode getParameterValue abstrahiert für mich die Zugriffslogik.

Wenn die übergebenen Parameter ausgelesen und verarbeitet wurden, so ist es ohne Weiteres möglich, sie bei Bedarf um weitere Parameter z.b EinheitID zu ergänzen und die komplette Parameterliste ans nächste Formular zu übergeben:

Call objTransmitter.AddParameterNode(„EinheitID“,9)

Ich habe die Klasse so implementiert, dass beim Versuch, auf einen nicht bekannten Attributsnamen zuzugreifen eine Exception geworfen wird. So erkenne ich dann als Entwickler bereits beim Test, dass ich mich bei der Attributbenennung vertippt habe. Ebenso löst auch der Versuch, ein Attribut mehrfach zu übergeben, eine Exception aus.

Fazit

Diese Klasse hat mir bisher echt gute und zuverlässige Dienste geleistet, sodass ich sie mittlerweile in allen meinen Access-Anwendungen integriert habe. Bei Bedarf stelle ich die Klasse gerne kostenfrei zur Verfügung.

9 thoughts on “mehrere Parameter in Access Formularen übergeben

  1. Hallo Anton Ristau,
    ich bin auch leidenschaftlicher Access-Programmierer, komme aber nicht an die Fähigkeiten eines Diplom-Wirtschaftsinformatikers ran.
    Mit großem Interesse habe ich den Artikel über „Mehrere Parameter In Access Formularen Übergeben“ gelesen und würde mich freuen, wenn ich die Klasse in meinen Anwendungen benutzen dürfte.

    Mit freundlichen Grüßen
    Harald Litzenburger

    1. Hallo Harald, vielen Dank für deinen Kommentar. Ich freue mich, dass dir der Artikel gefallen und du die Klasse einsetzen möchtest. Ich stelle sie dir als Quellcodedatei gerne bereit, sodass du sie einfach in deinen Access-Projekten direkt importieren und anhand der Beispiele im Artikel aufrufen kannst.
      In Access-Kenntnissen bist du mir mit Sicherheit im Voraus – ich bin eher ein Access-Entwickler für Anwendungen für meinen eigenen „Hausgebrauch“ 🙂 Das Gute ist aber natürlich, dass gesammelte VBA-Erfahrung unter Excel sich zu sehr großen Teilen auch auf VBA-Access übertragen lässt.

      Viele Grüße
      Tony

      1. Hallo Tony, danke für die Klasse, habe sie nun per DragandDrop eingefügt und auch gleich verstanden wie es funktioniert.
        Viele Grüße Harald

  2. Hallo Anton,

    Auf der Suche nach einer Möglichkeit, mehrere Werte mit OpenArgs zu übergeben, bin ich auf deine Lösung gestoßen.
    Unter den verschiedenen Ansätzen, die ich gefunden habe, gefällt mir deine Variante am besten.
    Würdest du mir bitte auch den Quellcode zur Verfügung stellen?

    Beste Grüße,
    Michael

  3. Hallo Tony,

    Ich bin eher gerade erst beim Einstieg in die Accesswelt, jedoch ist dieses Problem gleich mal hier. Würde mich freuen wenn ich deine Lösung auch mal ausprobieren könnte.

    Danke im Voraus, LG aus Österreich

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert