Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Carl am September 15, 2017, 16:23:58

Titel: openargs
Beitrag von: Carl am September 15, 2017, 16:23:58
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?
Titel: Re: openargs
Beitrag von: DF6GL am September 15, 2017, 16:35:48
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)
Titel: Re: openargs
Beitrag von: Beaker s.a. am September 15, 2017, 16:43:48
Hallo Carl,
Mit Macros kenne ich mich zwar nicht aus, ich vermute aber sowas wie
Formulare!frmHF!relevantesTextfeld
Da 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
Titel: Re: openargs
Beitrag von: Carl am September 16, 2017, 11:43:52
Ich komm hier irgendwie nicht weiter, vermutlich habe ich das falsche Fenster. (siehe Anhang)

Wo soll ich was rein schreiben?
Titel: Re: openargs
Beitrag von: Beaker s.a. am September 16, 2017, 13:42:21
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
Titel: Re: openargs
Beitrag von: Carl am September 16, 2017, 19:17:53
okay, ich setzt mich da dran :-)
Titel: Re: openargs
Beitrag von: Carl am September 18, 2017, 18:32:24
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. :-)
Titel: Re: openargs
Beitrag von: DF6GL am September 19, 2017, 08:03:07
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.
Titel: Re: openargs
Beitrag von: Beaker s.a. am September 19, 2017, 15:42:26
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
Titel: Re: openargs
Beitrag von: Carl am September 21, 2017, 17:48:46
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
Titel: Re: openargs
Beitrag von: DF6GL am September 21, 2017, 19:00:47
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....
Titel: Re: openargs
Beitrag von: Carl am September 21, 2017, 19:48:34
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.
Titel: Re: openargs
Beitrag von: Lachtaube am September 21, 2017, 21:04:38
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.
Titel: Re: openargs
Beitrag von: MzKlMu am September 22, 2017, 09:33:29
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
Titel: Re: openargs
Beitrag von: DF6GL am September 22, 2017, 10:11:54
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.




Titel: Re: openargs
Beitrag von: Beaker s.a. am September 22, 2017, 11:54:09
Hallo Franz,
Danke für die Korrekturen.
Mal wieder so dahin geschrieben ohne es zu testen.  >:(
gruss ekkehard
Titel: Re: openargs
Beitrag von: Carl am September 24, 2017, 09:06:03
Vielen Dank, ich schaue mir das in Ruhe an.
Titel: Re: openargs
Beitrag von: Carl am September 25, 2017, 21:29:33
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.)

Titel: Re: openargs
Beitrag von: DF6GL am September 26, 2017, 08:14:49
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  .. ;)
Titel: Re: openargs
Beitrag von: Carl am September 26, 2017, 19:12:02
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?
Titel: Re: openargs
Beitrag von: MzKlMu am September 26, 2017, 19:17:07
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.
Titel: Re: openargs
Beitrag von: Carl am September 26, 2017, 20:16:42
Womit ist denn zu rechen, wenn man in ein Modul einen weiteren Befehl rein schreibt?
Titel: Re: openargs
Beitrag von: bahasu am September 26, 2017, 20:24:27
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
Titel: Re: openargs
Beitrag von: Beaker s.a. am September 27, 2017, 12:28:47
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
Titel: Re: openargs
Beitrag von: Lachtaube am September 27, 2017, 12:54:54
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.
Titel: Re: openargs
Beitrag von: Carl am September 28, 2017, 09:39:21
Ich kann das aber nicht und da ich kein Programmierer bin, lerne ich erst nach und nach dazu.
Titel: Re: openargs
Beitrag von: Lachtaube am September 28, 2017, 10:49:56
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.
Titel: Re: openargs
Beitrag von: MzKlMu am September 28, 2017, 11:09:22
@Lachtaube
den Link zu der AllenBrowne Seite habe ich schon am 22.9. (#13) gepostet.

Hat scheinbar nichts genutzt.  ;D
Titel: Re: openargs
Beitrag von: Carl am September 28, 2017, 13:26:22
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.