Neuigkeiten:

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

Mobiles Hauptmenü

Steuerelementtyp eines bestimmten Formulars ermitteln

Begonnen von KonradR, Januar 20, 2024, 09:02:35

⏪ vorheriges - nächstes ⏩

KonradR

Hallo liebe Accessfreund,

ich habe ein Formular mit drei Unterformularen und möchte aus einem dieser Unterformulare den Wert eines bestimmten Steuerelements ermitteln. Das möchte ich mit einer For Each Next-Schleife machen, weil sich mit den Ausgangsbedingungen auch das Textfeld ändert, von dem die Daten ausgelesen werden. Da es in dem Unterformular Bezeichnungsfelder und Textfelder gibt, darf ich erst mal festlegen, dass nur die Textfelder nach ihrem Namen (Name -weil hier ein wichtiges Entscheidungskriterium einer vorrausgegangenen If then Else Bedinung drin steht) und dann nach ihrem Inhalt (Value) durchsucht werden.

Leider scheitert es bei mir schon ziemlich früh, weil ich nicht weis, wie ich per VBA auf die Steuerelemente des Unterformulars zugreifen kann. Auf die Name-Eigenschaft eines Elements der Auflistung Controls kann ich bereits zugreifen. Aber das geht nur für das Hauptformular. Wie kann ich den nächsten Schritt gehen und auf die Steuerelemente des Unterformulars zugreifen? Hier mein bisheriger Code mit MSG-Box zur Probe: Private Sub cmdProduEinheFinden_Click()
    Dim KE As Control

    For Each KE In Controls
            MsgBox KE.Name
    Next KE

End Sub

PhilS


    Dim ctl As Control
    For Each ctl In Me.DeinUnterformularSteuerelement.Form.Controls
            MsgBox ctl.Name
    Next ctl

Aber wozu diese Aktion? Wenn du den Namen des gesuchten Steuerelements kennst, kannst du doch direkt darauf zugreifen:

MsgBox  Me.DeinUnterformularSteuerelement.Form.Controls(BekannterNameDesControls).Value 
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

KonradR

Zitat von: PhilS am Januar 20, 2024, 10:22:07Aber wozu diese Aktion? Wenn du den Namen des gesuchten Steuerelements kennst, kannst du doch direkt darauf zugreifen:

Code [Auswählen] Erweitern
MsgBox  Me.DeinUnterformularSteuerelement.Form.Controls(BekannterNameDesControls).Value 

Das stimmt. Jetzt ist es so, dass ich Daten aus einem der Textfelder des dritten Unterformulars des aktuell ausgewählten Datensatzes in ein Textfeld aus einem anderen Formular übernehmen möchte. Das soll aber abhängig von dem Wert in einem Textfeld auf dem zweiten Unterformulares dieses Formulares passieren. Es ist also nicht immer das gleiche Textfeld, was angesprochen wird. Wenn ich z.B. in dem betreffenden Textefeld im zweiten Unterformular "Scheibe" stehen habe, dann soll im dritten Unterformular der Wert des Textfeldes kopiert werden, das den Wortschnippsel "Scheibe" im Namen hat. Wenn ich in dem betreffenden Textfeld im zweiten Unterformular "TL" stehen habe, dann soll im dritten Unterformular ein Textfeld mit dem Wortschnippsel "TL" gesucht und dessen Wert kopiert werden werden.

Beaker s.a.

Hole die Daten direkt aus der DS-Herkunft der UFo, - Stichwort: DLookup()
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)

PhilS

Zitat von: KonradR am Januar 21, 2024, 07:55:06[...]dann soll im dritten Unterformular der Wert des Textfeldes kopiert werden, das den Wortschnippsel "Scheibe" im Namen hat.
Werden die Steuerelemente zu Laufzeit erzeugt?
Wenn nein, dann solltest du als Entwickler den vollständigen Namen der jeweiligen Steuerelemente doch einfach feststellen können und nicht auf irgendwelche "Wortschnipsel" im Namen angewiesen sein.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

KonradR

Zitat von: Beaker s.a. am Januar 21, 2024, 12:13:21Hole die Daten direkt aus der DS-Herkunft der UFo, - Stichwort: DLookup()

Dlookup werde ich auf jeden Fall nutzen. Zuerst geht es ja darum das Textfeld zu finden in dem die gesuchten Informationen stehen. Das kann ja, abhängig von der Eingabe vorher variieren.

KonradR

Zitat von: PhilS am Januar 21, 2024, 13:09:54
Zitat von: KonradR am Januar 21, 2024, 07:55:06[...]dann soll im dritten Unterformular der Wert des Textfeldes kopiert werden, das den Wortschnippsel "Scheibe" im Namen hat.
Werden die Steuerelemente zu Laufzeit erzeugt?
Wenn nein, dann solltest du als Entwickler den vollständigen Namen der jeweiligen Steuerelemente doch einfach feststellen können und nicht auf irgendwelche "Wortschnipsel" im Namen angewiesen sein.
Danke für die Inspiration. Ich werde mit einer Select-Case-Anweisung das entsprechende Feld direkt ansprechen, das macht glaube ich am Meißen Sinn.

MzKlMu

#7
Hallo,
wenn ich mir so die Beziehungsbilder (in deinen anderen Themen) ansehe und das Vorhaben in diesem Thema sehe, so würde ich hier erst mal das Datenmodell auf den Prüfstand stellen.
Die 1:1 Beziehungen sind mehr als fragwürdig. Die Felder dieser 1:1 Tabellen könnten einfach in einer Tabelle dargestellt werden. 1:1 Beziehungen sind sehr selten notwendig und sind oftmal ein Hinweis auf ein falsches Datenmodell.
Die beiden Tabellen tblProduktGewicht und tblProduktGlyx100g sind so falsch aufgebaut.
Hier sollte eine Tabelle erstellt werden die die Felder der beiden Tabellen als Datensätze darstellt (15 Datensätze).
Und dann noch eine Zuordungstabelle (n:m) zur Zuordung der Eigenschaften zu einem Produkt. In diese Tabelle kommt dann noch ein Feld für den Wert dieser Eigenschaft.
Wenn das Datenmodell stimmen würde, wäre das jetzige Vorhaben ersatzlos überflüssig. Da müssen weder Feldnamen ausgelesen werden noch wird DLookup benötigt.
Dien Formularstruktur mit Ufos wäre auch bei einem Umbau der Struktur problemlos zu realisieren.

Du solltest darüber nachdenken. Ich bin überzeugt davon, dass bei korrektem Datenmodell 3/4 des VBA Codes ersatzlos entfallen kann (Forumserfahrung).
Gruß Klaus

KonradR

Zitat von: MzKlMu am Januar 21, 2024, 14:39:43Die 1:1 Beziehungen sind mehr als fragwürdig. Die Felder dieser 1:1 Tabellen könnten einfach in einer Tabelle dargestellt werden. 1:1 Beziehungen sind sehr selten notwendig und sind oftmal ein Hinweis auf ein falsches Datenmodell.
Die beiden Tabellen tblProduktGewicht und tblProduktGlyx100g sind so falsch aufgebaut.
Hier sollte eine Tabelle erstellt werden die die Felder der beiden Tabellen als Datensätze darstellt (15 Datensätze).
Das ist wahrscheinlich auch so und tatsächlich hatte ich die Datenfelder aus den beiden Tabellen erst in einer Tabelle. Leider hatt mir das Wissen gefehlt, wie ich es hinbekomme, dass diese Daten in zwei weiteren Unterformularen dargestellt werde, obwohl sie doch zum gleichen Datensatz gehören. Da erschien es mir einfacher, die Daten in zwei Tabellen auszulagern, die zu dem einen Datensatz aus tblProdukte in einer 1:1 Beziehung stehen.
Zitat von: MzKlMu am Januar 21, 2024, 14:39:43Wenn das Datenmodell stimmen würde, wäre das jetzige Vorhaben ersatzlos überflüssig. Da müssen weder Feldnamen ausgelesen werden noch wird DLookup benötigt.
Ist es denn möglich, Daten aus dem selben Datensatz in zwei Formularen darzustellen ohne VBA zu benutzen?
Zitat von: MzKlMu am Januar 21, 2024, 14:39:43Du solltest darüber nachdenken. Ich bin überzeugt davon, dass bei korrektem Datenmodell 3/4 des VBA Codes ersatzlos entfallen kann (Forumserfahrung).
Das geht bestimmt. Der Weg bis zur Erkenntnis ist halt selten gerade.



MzKlMu

#9
Hallo,
ZitatIst es denn möglich, Daten aus dem selben Datensatz in zwei Formularen darzustellen ohne VBA zu benutzen?
Natürlich ist das auch bei Deinem Aufbau ohne weiteres möglich die Anzeige auf mehrere Formulare zu verteilen. Das ist ja nur eine Frage der Anordnung der Felder. VBA wird da auch nicht benötigt.

Aber, wenn Du das nach meinen Vorschlag umbaust kannst Du ja in die Eigenschaftstabelle ein Kennzeichen für die Art aufnehmen. Dann kannst du das Produkt in einem Hafo anzeigen und in 2 Ufos (ggf auf Registerseiten) die Eigenschaftsdaten auswählen und die Werte speichern.
Alles ohne einen einzigen Buchstaben VBA.
Gruß Klaus

KonradR

Zitat von: MzKlMu am Januar 21, 2024, 23:30:09Alles ohne einen einzigen Buchstaben VBA.
Das klingt sehr interessant. Mir ist da noch eine Gedanke gekommen, nachdem es vielleicht doch nicht ohne VBA geht. Mit dem untenstehenden Bild habe ich mal das Hauptformular abgebildet:
Sie dürfen in diesem Board keine Dateianhänge sehen.
Mit dem Klick auf den Button soll das frei schwebende Pop-up-Formular aufgerufen werden um das es in diesem Beitrag geht.
Das ist hier zu sehen:
Sie dürfen in diesem Board keine Dateianhänge sehen.
Es gibt also 3 UFO`s, wobei die letzten beiden UFO`s alle Gewichtsangaben von allen Kücheneinheiten und die Nährwertangaben bei 100 g anzeigen. Das Hauptziel ist ja die spezifische Angabe der Nährwerte auf das erste Hauptformular zu übertragen bzw. auszurechnen. Die Berechnung habe ich auf dem Bild des Pop-Up-Formulars vermerkt. Wie das ohne VBA gehen soll, ist mir nicht so ganz klar.

MzKlMu

Hallo,
wenn das mit meinem Vorschlag gemacht wird, können alle Berechnungen innerhalb eines Datensatzes erfolgen. Und dann kann in Abfragen gerechnet werden, alles ohne VBA.
Aber wie gesagt, das setzt einen Umbau voraus. Es gibt ja dann nur ein Ufo.

PS:
Du solltest Dir bei Bildern etwas mehr Mühe geben und wenigstens einigermaßen leserlich schreiben.
Gruß Klaus

KonradR

Zitat von: MzKlMu am Januar 22, 2024, 23:56:36Du solltest Dir bei Bildern etwas mehr Mühe geben und wenigstens einigermaßen leserlich schreiben.
Beim nächsten mal gebe ich mir mehr mühe. Danke für die Rückmeldung.

Zitat von: MzKlMu am Januar 22, 2024, 23:56:36wenn das mit meinem Vorschlag gemacht wird, können alle Berechnungen innerhalb eines Datensatzes erfolgen. Und dann kann in Abfragen gerechnet werden, alles ohne VBA.
Danke, dass ist hilfreich. Dann kann ich mich ans Werk machen

Zitat von: MzKlMu am Januar 22, 2024, 23:56:36Aber wie gesagt, das setzt einen Umbau voraus. Es gibt ja dann nur ein Ufo.
Das steht  für mich etwas im Wiederspruch zu deiner vorherigen Antwort:
Zitat von: MzKlMu am Januar 21, 2024, 23:30:09Dann kannst du das Produkt in einem Hafo anzeigen und in 2 Ufos (ggf auf Registerseiten) die Eigenschaftsdaten auswählen und die Werte speichern.
Grundlegend hatte ich die Tabellen tblProdukte, tblProduktGewicht und tblProduktGlyx100g in einer Tabelle, was ich auch am sinnvollsten finde, weil ja alle Daten direkt nur einem Produkt zugeordnet werden. Die Aufteilung in 3 Tabellen hatte ich ja nur gemacht, um die  Darstellung in 2 Unterformularen mit einer 1:1 Beziehung hinzubekommen.

Zitat von: MzKlMu am Januar 22, 2024, 23:56:36alles ohne VBA.
Wie kann ich von dem Pop-Up-Formular ohne VBA einen der mehreren angezeigten Datensätze auswählen, dessen Werte dann ins Hauptformular, von einer Abfrage, übernommen werden? Da sagt mir mein Wissenshorizont bezüglich Access, dass das nur mit einem Button geht, der an einen Datensatz gebunden ist.