Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Prozedure mit Variable im Namen aufrufen

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

⏪ vorheriges - nächstes ⏩

Beaker s.a.

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 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

Xoar

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

markusxy

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

Xoar

#19
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?




DF6GL

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.

Xoar

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

daolix

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

Lachtaube

Nöö, so auch nicht. In der OL-Hilfe steht die richtige Syntax.
Grüße von der (⌒▽⌒)

daolix


DF6GL

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.)



Beaker s.a.

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

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)

Lachtaube

@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. :(
Grüße von der (⌒▽⌒)

Xoar

#28
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

Lachtaube

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.
Grüße von der (⌒▽⌒)