Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Prozedure mit Variable im Namen aufrufen

Begonnen von Xoar, Juni 14, 2017, 17:35:34

⏪ vorheriges - nächstes ⏩

Xoar

Hallo Leute, ich hab ein Problem....
ich hab zur Zeit in einer Funktion einen Aufruf einer Public Subvon einem Steuerelement eines Formularmoduls .
Forms!frmzeiterfassung!ufrmZeiterfassung.Form.von1_AfterUpdate
das klappt wunderbar, jetzt hab ich allerdings von diesen von1 Feld insg. 5, also von1, von2....
Jetzt übergebe ich in meiner Funktion einen Parameter um welches von Feld es sich handelt.   

Public Function PositionenZeitenEintragen(Datum As Date, MitarbeiterID As Integer, PositionID As Integer, welchesForm As String, Optional welchesSteuerelement As String) 'integer und Variant auch schon probiert

Jetzt muss ich meinen Prozedureaufruf ja umschreiben, sodass die Variable angibt welche von(1-5)_afterUpdate Prozedure aufgerufen wird.

Da hab ich schon einige Varianten probiert, aber keine klappt.
Dim vonVariable as variant
vonVariable = "von" & welchesSteuerelement & "_AfterUpdate"
Call Forms("frmdienstplan").Controls("ufrmDienstplan").Form(vonVariable)


Forms!frmdienstplan!ufrmDienstplan.Form ("von" & welchesSteuerelement & "_AfterUpdate")

klappen aber alle nicht, kommt immer die Fehlermeldung 438, Objekt unterstützt diese Eigenschaft oder Methode nicht.

könnt ihr mir da helfen?

PS: in den after_update Prozeduren wird immer diese Sub aufgerufen
Me!bis1Datum = ZeitwertZuDatumTragenBis(Me!von1, Me!bis1, Me!DatumID_F, Me!von1Datum)
natürlich mit angepassten Feldern (Nummern)

Grüße

markusxy

Da gibt es viele Möglichkeiten.
Wenn alle diese Methoden das gleiche machen, dann erstelle eine Methode an die du entsprechenden Argumente übergibst.

Alternativ kannst du bei Objekten wie einem Form mit der CallByName Methode, Code ausführen.

LG Markus

Beaker s.a.

Hallo Xoar,
Ist ja alles ein bisschen kurz dargestellt, aber warum der Umweg über
das AfterUpdate-Ereignis?
Die letzte Sub kannst du doch auch direkt aufrufen. Und dabei auch
gleich den richtigen Namen des Controls übergeben.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

daolix

Hallo
sind denn alle deine "von(X)_AfterUpdate" überhaupt public?

Beaker s.a.

Hallo Xoar,
Zitatsind denn alle deine "von(X)_AfterUpdate" überhaupt public
Das ist wichtig, normal sind Ereignisprozeduren ja Private.
Und dann kannst du es mit
Call Forms("frmdienstplan").Controls("ufrmDienstplan").Form.Controls("von" & Variable).AfterUpdate
versuchen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

markusxy

Zitat von: Beaker s.a. am Juni 14, 2017, 21:46:43
Call Forms("frmdienstplan").Controls("ufrmDienstplan").Form.Controls("von" & Variable).AfterUpdate

Hast du das getestet?
AfterUpdate ist eine Eigenschaft.
Mich würde es wundern, wenn das aufrufen einer Eigenschaft ganz was anderes macht als es sollte.

LG M

Beaker s.a.

Hallo Markus,
Getestet, - nein.
Aber du hast natürlich recht, so würde es wohl nur "[Ereignisprozedur]"
zurück geben.
Dann wird das Vorhaben wohl in der Form scheitern, da man den Namen
der Prozedur, der da ja hin müsste, nicht als String übergeben kann.
Bleibt also nur die angesprochene Lösung mit Übergabe des Controls.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Xoar

Hallo, ja sind natürlich alle public.
Wie würde der Aufruf mit der Übergabe des Controls denn aussehen?


Xoar

War gestern etwas spät ;)
Also anstatt in meiner Funktion das afterUpdate-Ereignis aufzurufen, direkt die Prezedure mit den übergebenen Wert.

rs!("Datum" & vonVariable) = ZeitwertZuDatumTragenBis(rs!("von" & vonVariable) ,rs!("bis" & vonVariable), rs!DatumID_F, rs!("von" & vonVariable & "datum"))

Lachtaube

Du musst schon die Syntaxregeln von VBA beachten, um auf die Auflistung Fields eines Recordsets zuzugreifen. Gültig wäre Objectvariable!Itemname (hier kann aber keine Variable für !Itemname verwendet werden) oder Objektvariable("Itemname") (hier kann Itemname aus Variablen und/oder Konstanten zusammengesetzt werden).

Ob man seine Ereignisprozeduren öffnentlich macht, ist letztendlich eine Frage des Stils. Ich selbst lege mir lieber eine Public Sub oder Public Function an, die sowohl vom Event als auch extern über eine Objektinstanz des Formulars erreichbar ist.
Grüße von der (⌒▽⌒)

Xoar

Stimmt.

Komme leider erst Dienstag dazu das zu testen... hoffe es klappt :D

Beaker s.a.

Hallo Xoar,
Zitatsind natürlich alle public
Ereignisprozeduren von Formularen/Berichten sind natürlich Private.
Das Umstellen auf Public ist also nicht natürlich; - siehe dazu auch #9.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Xoar

Siehe #1 erster Abschnitt. Da hatte ich es beigeschrieben.

Da ich es aber erst Dienstag testen kann, lass ihn den Thread solange noch ruhen.

Habt mir ja schon sehr geholfen. ;)

Beaker s.a.

Meine Bemerkung bezog sich nicht auf die Function sondern auf die Ereignisprozedur "AfterUpdate"
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Xoar

Ja genau so hab ich es ja geschrieben, zumindest hab ich gedacht das man es auch so versteht ;D