Rückruffunktionen (Callback Functions) in Access anwenden
Hallo liebe Leser,
beim Schmökern in diversen Foren bin ich auf Rückruffunktionen gestoßen, die ich bislang selbst nicht einsetzte. Eine Rückruffunktion ist eine Funktion, die als Parameter einer anderen Prozedur übergeben wird. Die Rückruffunktion selbst kann auch eigene Parameter haben die auch übergeben werden. Dadurch kann man eine allgemeine Prozedur erstellen, deren Verhalten erst durch die übergebene Rückruffunktion bestimmt wird. Das Verhalten dieser allgemeinen Prozedur kann sich mit jedem Aufruf ändern.
Dadurch kann man eine Access-Anwendung erstellen, mit einer Art Programm-Schnittstelle – bei PHP Entwicklern auch als Hook bekannt – die später hinzugefügte Module nutzen können, um eigene Funktionen auszuführen. Dies bedeutet aber auch, dass eine vom Entwickler ungewollte Prozedur ausgeführt werden könnte die auch Schadcode enthalten kann. Man sollte den Einsatz nachfolgend vorgestellter Methode also genau planen.
Da beim Übergeben von Parametern Access nicht den Datentyp „Funktion“ kennt, muss man da ein wenig tricksen. Statt dessen übergibt man den Funktionsname als String und den/die erforderlichen Parameter. Wie genau das geht zeigt nachfolgender Code.
Erstellen Sie zu erst ein Standardmodul. Beginnen wir anschließend mit der „neutralen“ Prozedur.
Function apply_to(ByVal funktion As String, ByVal werte As Variant) AS Variant Dim ergebnis() As Variant Dim i As Long Dim e As Variant For i = LBound(werte) To UBound(werte) 'Schleife über alle Werte e = Eval(funktion & "(" & werte(i) & ")") 'rufe die Rückruffunktion mit Parameter auf ReDim Preserve ergebnis(i) 'Wertebereich des Rückgabearrays erweitern ergebnis(i) = e 'und hänge den Rückgabewert an das Array an. Next i apply_to = ergebnis End Function
Der interessante Teil ist wie der Aufruf der Rückruffunktion zusammengesetzt wird. Ich benutze dazu die Funktion Eval() – der Name sagt doch alles – welche aus der Stringvariable funktion einen richtigen Funktionsaufruf macht. Per Stringaddition werden Klammern und Parameter zusammengesetzt und an den Funktionsaufruf angehängt. Wie man sieht wird immer genau 1 Wert aus dem – an die neutrale Prozedur übergebenem – Array an die Rückruffunktion übergeben. Das Ergebnis wird in einem Array gespeichert, welches dann, wenn die Schleife über alle Array-Werte fertig ist, zurückgegeben wird.
Betrachten wir nun die Rückruffunktionen:
Function verdoppeln(ByVal wert As Double) As Double verdoppeln = wert * 2 End Function Function quadrat(ByVal wert As Double) As Double quadrat = wert * wert End Function
Ich denke diese brauchen keine weiteren Erläuterungen.
Also auf zur Prozedur die das ganze ins Rollen bringt. Dazu hab ich eine kleine Test-Routiene erstellt:
Sub Test() Dim doppelte_Werte() As Variant Dim quadrierte_Werte() As Variant Dim werte As Variant werte = Array(1, 2, 3, 4) doppelte_Werte = apply_to("verdoppeln", werte) 'Rückgabe: Array(2, 4, 6, 8) quadrierte_Werte = apply_to("quadrat", werte) 'Rückgabe: Array(1, 4, 9, 16) End Sub
An die neutrale Prozedur wird als Parameter der jeweilige Funktionsname und ein Array mit Zahlen 1 bis 4 übergeben. Dahinter steht als Kommentar was die neutrale Prozedur jeweils zurückliefert.
Zum Testen rate ich dass Ihr zuerst einen Haltepunkt bei „Sub Test“ setzt und dann „Test“ markiert und F8 klickt. Dann könnt Ihr genau verfolgen wie die neutrale Prozedur die Rückruffunktionen aufruft.
Die Beispieldaten und teilweise Bezeichnungen habe ich aus dem entsprechenden Wikipedia-Artikel entnommen und nach VBA übersetzt.
Bis dahin
© Andreas Vogt 2012