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 Docmd.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.
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
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
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
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
Hallo Michael, klar, das kann ich gerne machen. Die Mail ist bereits unterwegs 🙂
Viele Grüße
Tony
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
Hallo Tobias, klar, kann ich gerne machen. Die Mail mit der Klasse unterwegs
Viele Grüße
Tony
Hallo Harald,
ich würde sehr gerne Deinen Quellcode zur Übergabe von mehreren Parametern an ein Formular verwenden.
Hallo Sonja, vermutlich meinst du nicht Harald, sondern mich :). Ich stelle dir die Klasse gerne zur Verfügung. Die Mail ist unterwegs.
Viele Grüße
Tony
Hallo Tony,
vielen Dank für den Artikel!
Darf ich auch deine Klasse verwenden, würde mich darüber sehr freuen.
LG Joachim
Hallo Joachim, vielen Dank, freut mich, dass der dir Beitrag weitergeholfen hat. Klaro, ich sende dir die Klasse gleich per Mail zu
Viele Grüße
Tony
Hallo Tony, danke für Deinen interessanten Artikel.
Das ist ein Ansatz, den ich gerne ausprobieren würde. Um das Ganze noch besser zu verstehen bzw. um zu sehen bei welchen meiner „Hausgebrauch“-Anwendungen ich das Einsetzen könnte, würde ich mir Deine Klasse gerne ansehen und hoffe, dass du sie mir zuschicken wirst.
Viele Grüße,
Detlef
Hallo Detlef, klar, gerne, freut mich, dass dir der Beitrag bzw. Ansatz zugesagt hat.
Der Quellcode der Klasse schicke ich dir gleich per Mail zu, kannst also diese einfach per Drag and Drop in dein Projekt reinziehen.
Viele Grüße
Anton
Hi Anton,
würde deine Klasse gerne verwenden, könntest du sie mir auch mailen?
danke
gruss
pascal
Hallo Pascal, klar, kannst gerne verwenden. Kommt gleich per Mail
Viele Grüße
Anton
Hallo!
Ich bin zwar noch Anfänger aber dein Artikel ließt sich gut. Gerne darfst du mir die Klasse zuschicken.
Viele Grüße
Michael
Hi Michael, geht klar, kommt per Mail
Viele Grüße
Anton