Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Xoar am Juni 14, 2017, 17:35:34

Titel: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 14, 2017, 17:35:34
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: markusxy am Juni 14, 2017, 17:53:05
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 14, 2017, 18:41:19
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: daolix am Juni 14, 2017, 19:54:11
Hallo
sind denn alle deine "von(X)_AfterUpdate" überhaupt public?
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 14, 2017, 21:46:43
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: markusxy am Juni 14, 2017, 22:33:30
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 15, 2017, 00:13:40
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 15, 2017, 03:30:23
Hallo, ja sind natürlich alle public.
Wie würde der Aufruf mit der Übergabe des Controls denn aussehen?

Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 15, 2017, 10:20:51
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"))
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Lachtaube am Juni 15, 2017, 11:23:11
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.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 15, 2017, 11:37:59
Stimmt.

Komme leider erst Dienstag dazu das zu testen... hoffe es klappt :D
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 15, 2017, 13:44:49
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
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 15, 2017, 14:46:21
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. ;)
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 15, 2017, 18:16:14
Meine Bemerkung bezog sich nicht auf die Function sondern auf die Ereignisprozedur "AfterUpdate"
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 15, 2017, 23:12:16
Ja genau so hab ich es ja geschrieben, zumindest hab ich gedacht das man es auch so versteht ;D

Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 15, 2017, 23:23:00
Ja, hast recht. Habe ich überlesen.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: markusxy am Juni 19, 2017, 08:08:38
Zitat von: Beaker s.a. am Juni 15, 2017, 00:13:40
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,

Bereits in der ersten Antwort steht schon, dass es dafür die CallByName Methode gibt.
Lesen könnte helfen

LG Markus
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 19, 2017, 11:49:51
Hab etwas über die CallbyName Methode gelesen , aber noch nicht richtig verstanden.

Allgemein Methoden verstehe ich noch nicht, was genau die machen.

Wie würde ich damit denn das After_Update-Ereignis aufrufen?

Oder wie ist das gedacht?

Grüße
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: markusxy am Juni 19, 2017, 12:40:45
Was ist dir unklar?
Lies mal in der VBA Hilfe nach.
Mach einen Versuch und poste ihn.
Dann schauen wir weiter.

Falls ein Mitwirkendender es nicht aushalten sollten, dass ein User es zuerst selbst versucht, kann er natürlich einen fertigen Code posten.
LG Markus
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 19, 2017, 13:01:09
Mach ich morgen, dann bin ich wieder an meinem Arbeitsrechner....

also eine Möglichkeit die ich mir vorstelle könnte ca. so lauten:

Dim VariableObjekt as objekt
Dim VariableProzedure as string
  VariableObjekt = "txtvon" & SteuerelementNr 'ergibt z.B. den Namen des Textfeldes txtvon1
  VariableProzedure = "von" & SteuerelementNr & "_afterUpdate" 'ergibt z.B. von1_afterUpdate

  CallByName VariableObjekt, VariableProzedure
wird dann so aufgerufen und sollte die AfterUpdate Prozedure aufrufen?



Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: DF6GL am Juni 19, 2017, 14:25:48
Hallo,


dieses Getöns mit "CallByName"  würde ich nicht weiter verfolgen, derweil Du damit ja gar nicht  die eigentliche Prozedur anpasst.


Zeig mal ein Beispiel der Afterupdate-Prozedur, die von anderen Stellen aus aufgerufen werden soll.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 19, 2017, 14:47:54
außer einer Fehlerbehandlung steht nur dies in dem AfterUpdate-Ereignis
public sub bis1_afterUpdate
Me!bis1Datum = ZeitwertZuDatumTragenBis(Me!von1, Me!bis1, Me!DatumID_F, Me!von1Datum)
end sub


me! bezieht sich auf Forms!frmDienstplan!ufrmDienstplan.form!

hatte ja schon angedacht dies jetzt direkt aufzurufen über den Recordset.
Die vonVariable wird mit übergeben sobald ich die Function aufrufe, deshalb müsste ich immer auf das richtige Feld zugreifen.

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

Grüße
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: daolix am Juni 19, 2017, 14:59:41
Zitat von: Xoar am Juni 19, 2017, 13:01:09
Mach ich morgen, dann bin ich wieder an meinem Arbeitsrechner....

also eine Möglichkeit die ich mir vorstelle könnte ca. so lauten:

Dim VariableObjekt as objekt
Dim VariableProzedure as string
  VariableObjekt = "txtvon" & SteuerelementNr 'ergibt z.B. den Namen des Textfeldes txtvon1
  VariableProzedure = "von" & SteuerelementNr & "_afterUpdate" 'ergibt z.B. von1_afterUpdate

  CallByName VariableObjekt, VariableProzedure
wird dann so aufgerufen und sollte die AfterUpdate Prozedure aufrufen?

nöö
VariableObjekt = Ist die Form/UForm welche die Public xyz_Afteupdate beinhaltet (Typ Object), also eher wie in deinem EP  Forms("frmdienstplan").Controls("ufrmDienstplan").Form
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Lachtaube am Juni 19, 2017, 15:08:18
Nöö, so auch nicht. In der OL-Hilfe steht die richtige Syntax.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: daolix am Juni 19, 2017, 15:14:24
weil?
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: DF6GL am Juni 19, 2017, 15:21:06
Hallo,



ich versteh jetzt nicht mehr die anfängliche Aufgabenstellung...

Die Afterupdate-Prozedur eines "Bis"-Feldes ruft doch schon eine (globale?) Funktion (spezifische Berechnung für das "bis1Datum"-Feld) auf.  Was soll hierbei noch zusammengefasst werden? Und welches Ereignis  soll den (vermuteten) Berechnungsvorgang für alle Felder anstoßen?
Allenfalls könnten in der Form_BeforeUpdate-Ereignisprozedur die 5(?)   "bisXdatum"-Felder in einer For/Next-Schleife gesetzt werden  (nötiger Errorhandler nicht enthalten)

Sub Form_BeforeUpdate(Cancel as Integer)
Dim i as long
For i=1 to 5
  Me("bis" & i & "Datum") = ZeitwertZuDatumTragenBis(Me("von" & i), Me("bis" & i), Me!DatumID_F, Me("von" & i & "Datum")
Next
End Sub


Die eigentliche Krux an der Geschichte, so wie es sich für mich darstellt, ist die fehlende Normalisierung (Aufzählungsfelder gehören in eine separate Tabelle).

(Soweit ich mich erinnere, ist darauf schon einige Male hingewiesen worden.)


Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 19, 2017, 16:29:01
Hallo Xoar,
Zitatsteht nur dies in dem AfterUpdate-Ereignis
Vielleicht zeigst du uns auch mal, was in der Function
"ZeitwertZuDatumTragenBis" passiert, und von wo
überhaupt die Function "PositionenZeitenEintragen"
aufgerufen wird.
Auch ist, mir zumindest, nicht klar von wo aus das
AfterUpdate-Ereignis ausgelöst werden soll.
Falls das in "PositionenZeitenEintragen" passiert, würde
ich deren Parameter anders gestalten.
ZitatPublic Function PositionenZeitenEintragen(ByVal Datum As Date, _
ByVal MitarbeiterID As Integer, ByVal PositionID As Integer, ByRef welchesForm As Form)
Über "welchesForm" hast du dann auch Zugriff auf alle
Controls des Forms.

ZitatDie eigentliche Krux an der Geschichte, so wie es sich für mich darstellt, ist die fehlende Normalisierung (Aufzählungsfelder gehören in eine separate Tabelle).
Daran habe ich noch gar nicht gedacht, bzw. ist mir gar
nicht aufgefallen, sonst hätte ich auch schon in diese Kerbe
geschlagen ;)

gruss ekkehard

Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Lachtaube am Juni 19, 2017, 16:55:19
@Daolix,

weil das Argument für den CallType (in diesem Fall vbMethod) fehlt.

Ansonsten bin ich auch sehr verwirrt und vermute nebenbei noch ein suboptimales Tabellendesign. :(
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 19, 2017, 17:33:24
Hallo,

das es diese von1 - von5 Felder gibt, muss man so hin nehmen, ist ein Kompromiss zwischen Darstellung und Aufwand und wird sich NIE, NIEMALS, NEVER EVER erhöhen.

In ZeitwertZuDatumTragenBis wird nur der korrekte Datumsteil dem Uhrzeitteil dazugeschrieben.
Da man als Eingabe im Textfeld nur die Uhrzeit 00:00 sieht und zur korrekten Berechnung auch den Datumsanteil braucht (Tagübergreifend), aber das soll nicht das Thema sein :D

@ ekkehard
ja genau so ist es, es passiert in der PositionszeitenEintragen Funktion.

Ich versuch mal zu erklären warum das so eigenartig erscheint, oder ist??

Ich habe ein Hauptformular wo ich von1(00:00), bis1(00:00) und Position1(Zahl) sichtbar habe. Im Hintergrund gibt es noch von1Datum, bis1Datum.
Gebe ich nun in von1 "09:00" ein, wird dem Feld "von1Datum" einfach das heutige Datum mit dem in von1 eingegebenen Zeitanteil zugewiesen und zwar durch das AfterUpdateEreignis von "von1".
Das ganze gibt es auch noch leicht erweitert für bis1 -> bis1Datum.

Jetzt gibt es halt noch die Option bis zu 5 Zeiteingaben diesem einen Datensatz hinzuzufügen, falls sich die Position mal nach x Stunden ändert. z.B. 09:00 - 10:00 = Position1, 10:00 - 15:00 = Position2....
Das dies nicht optimal ist weiß ich selbst, war aber der bestmöglich Kompromiss für mich.

Ich habe im Hauptformular ein Button, der mir ein kleines Zusatzformular anzeigt, wo ich für den ausgewählten DS diese 5 möglichen Eintragungen machen kann.

Da mir für die Positionsauswahl eine Combobox zu unübersichtlich war, habe ich mir ein Formular gebaut, wo alle Positionen nach Kategorien etc. sortiert in Endlosunterformularen angezeigt werden. Klicke ich jetzt auf eine Position (Textfeld) wird die Funktion "PositionsZeitenEintragen" aufgerufen.
Diese füllt die von1 - bis1 Felder mit einer vordefinierten Uhrzeit vor, trägt die passende PositionsID ein und sollte eigentlich diese von1_AfterUpdate Prozedure aufrufen, damit die von1Datum - bis1Datum Felder korrekt beschrieben werden. Aber genau das ging nicht mit Variablen in den Aufrufen. Deshalb werd ich es wohl mal wie in #8 gezeigt probieren, nur mit rs(.. anstatt rs!(...

Viel Text, schwierig zu verstehen. Wollte eigentlich nur etwas Zeit sparen, indem ich einfach dieses AfterUpdateEreignis aufrufe, aber das war wohl nichts ;)

Falls das doch irgendwie klappt, durch die Übergabe des Forms ist das toll.

So jetzt ist die Verwirrung komplett :D
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Lachtaube am Juni 19, 2017, 19:18:08
Gibt es denn Regeln und/oder Zyklen, nach denen die Uhrzeiten (für einen Schicht- bzw. Arbeitsplan?) geschrieben werden?

PS: wenn Du ein Formular quasi zur Dateneingabe fernsteuerst, das datengebundene Steuerelemente enthält, so wirkt sich das negativ auf die Ausführungsgeschwindigkeit aus, weil ja jedesmal die Steuerelementinhalte aktualisiert werden müssen. Trägst Du hingegen die Daten direkt über ein Recordset oder eine Anfügeabfrage ein, so wird der Ablauf nicht durch Bildschirmaktualisierungen behindert.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 19, 2017, 20:04:59
Ok, danke für den Tipp/Hinweis.

Die Urzeiten zu den Positionen sind alle mit in der tblDienstposten versorgt, daraus lese ich diese immer aus.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Lachtaube am Juni 19, 2017, 21:09:01
Ich fragte nach einer Regel der Dienstzeiten und sich wiederholenden Zyklen - nicht woher Du die Zeiten beziehst. Hintergrund der Fragerei ist, zu prüfen, ob Du ggf. ein Konzept wie deses (http://office-loesung.de/ftopic593668_0_0_asc.php) verwenden kannst.
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 19, 2017, 23:25:18
Hallo Xoar,
Zitatsollte eigentlich diese von1_AfterUpdate Prozedure aufrufen, damit die von1Datum - bis1Datum Felder korrekt beschrieben werden.
Dann finde ich, unbeachtet Lachtaubes Argument bezügl. Recordset,
meinen Ansatz aber nicht verkehrt. Da kannst du dann das AfterUpdate
ganz vergessen und die Zeile in "PositionsZeitenEintragen" ausführen.
Wie gesagt, das passende Control (1-5) findest du in der Controls-
Auflistung des übergebenen Forms. Evtl. musst du die Nummer auch als
Parameter übergeben.

gruss ekkehard
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 20, 2017, 20:46:11
so, hat leider etwas länger gedauert. Heute ist hier die Hölle los....

also ich hab es jetzt so gelöst, dass ich direkt im Recordset die Daten ändere, und die ehemals in dem AfterUpdate-Ereignis stehende Function direkt in der PositionsZeitenUpdate ausführe. Das klappt auch mit zusammengesetzten Variablen super  :D

@ekkehard
dein Ansatz find ich trotzdem super, hab es auch mal ausprobiert. Bin aber gescheitert, mangels Kenntniss.
ich habe die Funktion um
Public Function PositionenZeitenEintragen(Datum As Date, MitarbeiterID As Integer, PositionID As Integer, welchesForm As Form, Optional welchesSteuerelement As String) eweitert.

Beim Aufruf habe ich dann für diesen Parameter ganz einfach den Namen des Formulares eingetragen, wovon die Controlls übergeben werden sollen. PositionenZeitenEintragen("01.01.2017",1,2,frmMehrereDienstpostenAuswahl,2
Da gab es zwar kein Fehler, aber in der Funktion selbst war dem FormParameter beim Aufruf nichts zugeordnet. Hab ich da was falsch gemacht?

Muss das Formular außerdem zu dem Zeitpunkt geöffnet sein und bleiben?

nen gutes Beispiel hab ich bis jetzt dafür noch nicht gefunden....

Grüße
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Beaker s.a. am Juni 20, 2017, 23:18:04
Hallo Xoar,
Du must das Formular als Form übergeben, der Name reicht nicht *).
Wenn du auf dem Form bist, das du übergeben willst reicht ein einfaches
"Me". Wenn's ein anderes ist Forms!frmMehrereDienstpostenAuswahl.
gruss ekkehard

*) Bevor berechtige Einwände kommen; - es geht natürlich auch mit dem
Formnamen als String. Dann musst du in der Prozedur allerdings eine
Variable einrichten
Dim frm As Form
Set frm = Forms(Parameter)

Aber wozu dieser Umweg?
Titel: Re: Prozedure mit Variable im Namen aufrufen
Beitrag von: Xoar am Juni 21, 2017, 05:43:02
super klappt :D