Mal ne andere Frage
Ich habe ein frmHF, in dem u.a. 10 Textfelder mit variablen Inhalten sind. Alle Textfelder enthalten jeweils einen Makro, der bei Doppelklick ein frmPOPUP öffnet. Aus den Flächen gebe ich die ID mit. Das frmPOPUP ist für alle 10 Textfelder gleich, zeigt aber jeweils andere Inhalte an.
Jetzt möchte ich, das frmPOPUP als Überschrift den jeweiligen Inhalt des doppelgeklickten Textfeldes in frmHF erbt, damit der Anwender nicht vergisst, welches Feld er mit dem frmPOPUP bearbeitet. Dazu habe ich in frmPOPUP ein Textfeld [=openargs] eingefügt, das auch keinen Fehler verursacht.
Ich möchte mit Makro arbeiten.
Frage:
Was muss ich als Öffnungsargument im Makro-Fenster wo eintragen?
Hallo,
schreib einfach bei der Openform-Methode (Makro) bei Öffnungsargumente den Namen des Textfeldes hin, dessen Inhalt an das Popup übergeben werden soll.
Der Steuerelementinhalt des Textfeldes im Popup muß so lauten:
=[Openargs]
evtl. heißt es auch
=[Öffnungsargumente]
(Makros werden hier eher nicht behandelt)
Hallo Carl,
Mit Macros kenne ich mich zwar nicht aus, ich vermute aber sowas wie
Formulare!frmHF!relevantesTextfeldDa musst du aber für jedes Textfeld ein eigenes Macro erstellen, -vermute ich.
Per VBA könnte man des PopUp so öffnen
Public Sub OpenPopUp()
DoCmd.OpenForm FormName:="NameDesPopUp", WindowMode:=acDialog, OpenArgs:=Me.Controls(Screen.ActiveControl.Name).Value
End Sub(zu faul zum Kommas zählen, und es kann sein, dass es eine Function
sein muss, nicht getestet)
Bei den Textfeldern schreibst du dann im Eigenschaftenblatt Ereignisse
"Bei Doppelklick"
=OpenPopUp()Und
ZitatDer Steuerelementinhalt des Textfeldes im Popup muß so lauten:
=[Openargs]
beachten.
gruss ekkehard
Ich komm hier irgendwie nicht weiter, vermutlich habe ich das falsche Fenster. (siehe Anhang)
Wo soll ich was rein schreiben?
Hallo Carl,
Sorry, aber wie bereits gesagt kenne ich mich mit Macros nicht aus. Und
den meisten hier geht es ähnlich. Macros sind wirklich nicht sehr beliebt.
Da meine Lösung per VBA nicht vollständig war, hier eine Schritt-für-Schritt-Anleitung das umzusetzen.
Vorab aber noch etwas Grundsätzliches, da du ja wohl noch nicht mit dem VBA-Editor gearbeitet hast.
- öffne ihn, - Menu Datenbanktools/Visual Basic
- öffne das Menu Extras/Optionen
- dort setzt du das Häkchen bei "Variablendeklaration erforderlich"
- "OK"
(das ist zwar für das aktuelle Problem nicht relevant, aber eine grundsätzliche Einstellung)
jetzt geht's los
- öffne dein frmHF in der Entwurfsansicht und wechsele in den VBA-Editor
- Formular auswählen und Code anzeigen
- den schon gezeigten Code dort einfügen
Public Sub OpenPopUp()
DoCmd.OpenForm FormName:="frmAngebotsnutzungMo", WindowMode:=acDialog, OpenArgs:=Me.Controls(Screen.ActiveControl.Name).Value
End Sub
- kompilieren und speichern
- zurück zur Entwurfsansicht
- die 10 Textfelder markieren
- das Eigenschaftenblatt einblenden (F4) -> Register "Ereignisse"
- in die Zeile "Bei Doppelklick" schreibst du nun
=OpenPopUp()
- speichern, dann sollte das hinterher in jedem Textfeld in der Eigenschaft stehen
jetzt der zuvor fehlende Teil
- dein PopUp in der Entwurfsansicht öffnen
- im Eigenschaftenfenster/Ereignisse in der Zeile "Beim Laden" den Button mit den ... klicken, - landest du wieder im Editor und der Prozedurrumpf ist schon angelegt.
da hinein (leere Zeile) schreibst du
Me!Caption = Me.OpenArgs
- kompilieren + speichern
Wenn ich jetzt keinen Fehler eingebaut habe und du alles richtig umsetzt sollte jetzt bei einem Doppelklick auf eines der Textfelder (natürlich jetzt in der Formularansicht) sich dein PopUp öffnen und den Wert im Textfeld als Formularnamen anzeigen.
gruss ekkehard
okay, ich setzt mich da dran :-)
Vielen Dank für die gute Erklärung. Aber das funktionierte nach vielen Versuchen nicht und ist auch zu aufwändig.
Mir wäre schon sehr geholfen, wenn mir jemand sagt, wo man in der oben geposteten Maske das Öffnungsargument des Textfeldes eingibt, das langt wahrscheinlich schon hin. :-)
Hallo,
offensichtlich gibt es den Parameter "Openargs" (Öffnungselemente) nicht (mehr) im ÖffnenFormular-Makro.
Versuch, nach dem Öffnen des Forms ein "SetzenWert"-Makro einzubauen.
Trotzdem ist dringend angeraten, sofern die DB vernünftig arbeiten soll, sich mit ein bisschen VBA zu beschäftigen.
Hallo Carl,
Zitatdas funktionierte nach vielen Versuchen nicht
Ein Standardtext, der aber für beide Seiten nicht hilfreich ist; - Fehlermeldungen, falsche Werte?
Zitatist auch zu aufwändig
Na ja, Sonderwünsche verlangen eben ein wenig Aufwand.
Bei welchem Schritt scheiterst du denn?
Vielleicht hilft ja schon folgende Ergänzung. Das hatte ich vergessen.
Zitat
Public Sub OpenPopUp()
Dim strOA as string
strOA = Nz(Me.Controls(Screen.ActiveControl.Name).Value, "leeres Feld")
DoCmd.OpenForm FormName:="frmAngebotsnutzungMo", WindowMode:=acDialog, OpenArgs:=strOA
End Sub
gruss ekkehard
Ich kriegs nicht hin. Er findet die Funktion nicht. Das blöde ist, dass ich auch nicht verstehen kann, was falsch ist. Ich habe einfach zu wenig Erfahrung und muss weiter lernen.
Wenn es mir jemand zeigen würde, könnte ich es am funktionierenden Beispiel besser verstehen und auch in anderen Zusammenhängen erfolgreich "nach bauen".
Carl
Hallo,
dann lad halt mal eine passende Beispiel-DB hier hoch...
mit
ZitatIch kriegs nicht hin. Er findet die Funktion nicht.
ergibt sich (für uns) auch keine neue Erkenntnis....
OK, also
Einsatzplan_HF, Text53
hier soll bei Doppelklick das Formular frmAngebotsnutzungMo geöffnet werden.
Im Formular frmAngebotsnutzungMo soll das Feld Text57 den Inhalt von Text53 anzeigen.
Den Code von Beaker habe ich schon eingefügt.
Die Tabellen mit den sich wiederholenden Spalten (ich meine z. Bsp. die nebeneinander aufgelisteten Tage oder die Berufe in der Mitarbeitertabelle) sollten dringend in die Normalisierundswerkstatt, bevor an Formularen, sofern sie danach noch verwendbar sind, weitergebastelt wird.
Hallo,
um in das gleiche Horn zu blasen, so gut wie alle Ja/Nein Felder zeugen von einem falschen Datenmodell.
Weil es so schön passt, hier noch ein Link:
http://allenbrowne.com/casu-23.html
Hallo,
nur zur Demonstration der Lösung (mit OpenPopUp() ) des Ausgangsproblems:
Aufruf der Funktion (nicht Sub) in einer passenden Ereignis-Eigenschaft:
=OpenPopUp([screen].[activecontrol])
Funktion in einem Standard-Modul(!) :
Public Function OpenPopUp(ctl As Control)
DoCmd.OpenForm "frmAngebotsnutzungMo", , , , , acDialog, ctl.Value
End Function
Form_Load-Ereignisprozedur:
Private Sub Form_Load()
Me!Text57 = Me.OpenArgs
End Sub
Ich schlage in dieselbe Kerbe und empfehle ebenfalls dringend, die Normalisierungsregeln anzuwenden UND eine vernünftige/aussagekräftige Benamsung zu verwenden.
Hallo Franz,
Danke für die Korrekturen.
Mal wieder so dahin geschrieben ohne es zu testen. >:(
gruss ekkehard
Vielen Dank, ich schaue mir das in Ruhe an.
Vielen Dank. Es funktioniert mit dem openarg!
Wie kann ich denn die Bedingung [mo01]=Ja übergeben? Schreibt man das zwischen die Kommas?
Wie kann man denn bei
DoCmd.OpenForm "frmAngebotsnutzungMo", , , , , acDialog, ctl.Value
(Die Kerbe kenne ich. Das Problem ist, wie immer, dass niemand alles auf einmal, sondern erst nach und nach lernen kann und ich habe ja schon ne Menge normalisiert in dieser Datenbank.)
Hallo,
ein Blick in die Hilfe bringt oftmals Klarheit....
Ebenso hilft IntelliSense, wenn die Codezeile bearbeitet wird.
ZitatSchreibt man das zwischen die Kommas?
Die Kommata sind die Abtrennungen für die Parameter, die der Openform-Methode übergeben werden (können) . Für die Bedingung ist der "Where-Condition"-Parameter zu benutzen, und der befindet sich zwischen dem 3. und 4. Komma und ein String sein muss. Beachte also die Anführungszeichen.
DoCmd.OpenForm "frmAngebotsnutzungMo", , ,"[mo01]=true" , , acDialog, ctl.Value
Zitat
schon ne Menge normalisiert
naja, für die Erkennung der "Menge" braucht es aber eine Lupe .. ;)
Vielen Danke!! Die Module sind so eine Art Ablage für übergreifende Befehle.
Kann man in ein Modul prinzipiell mehrere Befehle schreiben, zum Beispiel wenn sie von der Funktion her gleich gelagert sind?
Hallo,
in dieser Datenbank ist gar nix normalisiert.
Und die Module für übergreifende Befehle haben mit Normalisierung nichts zu tun.
Ich würde mal behaupten, je mehr normalisiert, je weniger Module.
Womit ist denn zu rechen, wenn man in ein Modul einen weiteren Befehl rein schreibt?
Hi Carl,
Zitat von: Carl am September 26, 2017, 19:12:02
Kann man in ein Modul prinzipiell mehrere Befehle schreiben, zum Beispiel wenn sie von der Funktion her gleich gelagert sind?
Im Modul kannst Du eine "wilde Mischung" von Befehlen eintragen, die rein gar nichts miteinander zu tun haben.
Besser wäre es allerdings die Module thematisch anzulegen:
- Datei-Operationen
- Grafik-Routinen
- usw.
Wie Klaus aber geschrieben hat, muss stets am Anfang das Datenmodell (Tabellen und die Relationen zwischen den Tabellen) sauber definiert sein als Basis für alles weitere (Abfragen, Formulare, Berichte). Es lohnt sich immer, dafür genügend Zeit einzuplanen (ich mache das am liebsten an einem verregneten Wochenende), um späteres Rumbasteln zu vermeiden.
Harald
Hallo,
@ Harald
Zitatich mache das am liebsten an einem verregneten Wochenende
Das schaffst du aber auch nur weil du die Regeln (NF) kennst.
Beim TS könnte dabei schon ein verregneter Urlaub draufgehen, -
bestenfalls.
@ Carl
Nicht verzagen, was Klaus und Harald schreiben ist aber essentiell
wichtig.
Die Zeit, die du in ein korrektes Datenmodell steckst, holst du später
mehrfach! wieder rein.
gruss ekkehard
Stell Dir folgendes Szenarium vor. Die DB im aktuellen Zustand läuft befriedigend. Der Vorstand Eurer Organisation hat beschlossen, 3 neue Berufsgruppen einzustellen und die Therapien in den Sommermonaten auch auf Samstage auszudehnen, dafür aber um eine Woche zu kürzen.
Na, dann geht die ganze Chose (Tabellen, Abfragen, Formulare und Berichte ändfern) wieder von vorne los (... und bezahlt werden muss diese Bastelei ja auch noch). Mit einem ordentlichen Datenmodell hingegen würde man einige neue Datensätze anlegen und gut ist.
Ich kann das aber nicht und da ich kein Programmierer bin, lerne ich erst nach und nach dazu.
Carl, ein Programmieren ist dafür unnötig - Normalisierung der Tabellen mit den sich wiederholenden Spalten ist angesagt. Was z. Bsp. die Berufsgruppen angeht, wäre eine Lösung wie in Don't use Yes/No fields to store preferences (http://allenbrowne.com/casu-23.html) anzustreben. Ähnlich verfährt man mit den Wochentagsgeschichten - danach kannst Du 80% (oder unter Umständen sogar alle) Deiner DLookupgeschichten (welche in Massen auftretend zu den großen Performance-Bremsen gehören) aus den Formularen (und Berichten) verbannen.
@Lachtaube
den Link zu der AllenBrowne Seite habe ich schon am 22.9. (#13) gepostet.
Hat scheinbar nichts genutzt. ;D
Das mit der Zuordnungstabelle für die Seminare habe ich aus bestimmten Gründen nicht weiter verfolgt. Zum einen werden nie neue Felder hinzu kommen. (Es sind ja bereits jetzt 4 mal mehr Felder da, als überhaupt gebraucht werden.) Zum anderen, und das ist das Wichtigere, sollen die Einträge nicht in einer Liste, sondern an bestimmten, immer gleich bleibenden Plätzen im Formular angezeigt werden. Hier kommen auch keine hinzu, weil ja der Tag immer nur 8 Stunden haben wird. Bei einer Anzeige über eine Zuordnungstabelle bräuchte ich daher ohnehin dlookup.
Die berufsgruppen könnte man über eine Zuordnungstabelle machen, aber derzeit habe ich da keinen Nerv dazu. Ich brauche erstmal ein funktionierendes Endlosformular.