Seite 1 von 2

Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 10:43
von Gast
Hallo
in einer Tabelle gibt es das Feld LetzterZugriff.
Zieht man das Feld aus der Feldliste in ein Formular, so hat das Textfeld denselben Namen
Sollte man sich die Arbeit machen, das Feld umzubenennen? zB in edtLetzterZugriff

Wenn man das nicht macht, greift folgende Zeile zuerst auf das Datenfeld oder das Textfeld zu bzw. was wird da eigentlich angesprochen?
Code: Alles auswählen
Me.LetzterZugriff= Now

Kann man das durch Code bestätigen?
Danke Dieter

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 11:37
von Yaslaw
Ich persönlich rate immer dazu, das Feld umzubennen.

Und mit Me.X greifst du mWn auf das Formfield zu.

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 12:01
von Beaker s.a.
Hallo Dieter,
Kann man das durch Code bestätigen?

Code braucht es dazu nicht, es reicht der VB-Editor.
Bei Eingabe von Me. und eingeschalteter IntelliSense wirst du Folgendes feststellen:

wenn beide Felder den gleichen Namen haben siehst du in der aufgehenden Liste nur
das Formularfeld mit allen Eigenschaften eines Textfeldes

wenn die beiden Felder unterschiedliche Namen haben, findest du beide in der
Controls-Auflistung. Der Unterschied ist dann, dass das Tabellenfeld nur eine einzige
Eigenschaft besitzt: .Value

Ich selber mache es wie Yaslaw und benenne das Formfeld abweichend vom Tabellen-
feld. Wenn es dann im Code nur um den Wert (.Value) geht (lesen/schreiben) verwen-
de ich auch immer das Tabellenfeld. Denn auch wenn die Value.Eigenschaft die Stan-
dardeigenschaft bei Textfeldern ist, muss IMO der Compiler die trotzdem erst aus der
entsprechenden Auflistung raussuchen.

gruss ekkehard

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 13:03
von Bitsqueezer
Hallo ekkehard,

kleine Korrektur: IntelliSense listet alles, was aus irgendeiner Collection kommt bzw. anderen Namen, die mit dem Formular zu tun haben.

Wenn Du also unterschiedliche Benennung für Feld und Control hast (bei der Empfehlung schließe ich mich ebenfalls an), dann stammt das Datenfeld aus der Fields-Collection des Recordsets, an das das Formular gebunden wurde, und der Name des Controls aus der Controls-Collection. Ebenso wie viele weitere Namen gelistet werden, etwa alle Eigenschaften und Methoden des Formulares selbst.

Wird nach dem Namen des Objektes nichts weiter angegeben, wird immer die Default-Eigenschaft des Objektes verwendet, was meistens "Value" ist, aber nicht sein muß.

@Dieter: Wenn Du ganz sicher sein willst, das Richtige anzusprechen, mußt Du selbst die Collection verwenden, die dann allerdings nur mit Hilfe der Indexnummer oder des Namens das richtige Element aussuchen läßt. Das hat den Nachteil, daß der Compiler hier nicht unterstützen kann und Fehler erst zur Laufzeit entdeckt werden.
Also: Me.Controls("LetzterZugriff") würde sicherstellen, daß es garantiert ein Control mit diesem Namen ist, aber der Compiler checkt den String nicht. Wenn Du dagegen das Control abweichend mit z.B. "ctl_LetzterZugriff" benennst, dann kannst Du mit Me.ctl_LetzterZugriff auch sicher sein, daß Du auf das Control zugreifst.

Es empfiehlt sich daher immer, auch eine durchgehende Benennung für die Controls zu verwenden. Ich persönlich verwende mittlerweile nur noch "ctl_" als Prefix für alle Controls, früher habe ich das noch nach Controltyp getrennt, sorgt aber nur für mehr Arbeit ohne Nutzen. Hat man nur einen Prefix, findet man alle Controls schön sortiert beieinander in der langen IntelliSense-Liste.

Gruß

Christian

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 13:12
von knobbi38
Hallo Dieter,

Kann man das durch Code bestätigen?

Ja, kann man. Mit Typename(Me.LetzterZugriff) kann man sich den Typ anzeigen lassen.

@Yaslaw:
SInd Feldname und Controlname gleich, gibt Typename(me.LetzterZugriff) "Textbox" zurück, anderfalls ist der Rückgabewert "AccessField".

Man hat also im ersten Fall keine Möglichkeit mehr, daß Feld direkt anzusprechen.
Deshalb sollte man immer einem Steuerelement einen anderen Namen geben, als ein bereits vorhandener Feldname. Meistens wird dafür ein Präfix entsprechend den gängigen Namenskonventionen gewählt, z.B. txt...., was auch die Lesbarkeit erhöht und später viele ungereimte Fehler vermeiden hilft.

@ekkehard
Sind Feldname und Controlname gleich, kann das nicht mehr in der Controls-Auflistung unterscheiden werden!
Sind Feldnamen und Controlname unterschiedlich, kann man zwar auf beide zugreifen, aber Feldnamen nehmen innerhalb der Controls-Auflistung eine Sonderstellung ein. Felder sind versteckt und lassen sich nur direkt über ihren Namen ansprechen, nicht jedoch per Enumeration oder über den Index!

Gruß Ulrich

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 14:26
von Gast
Hallo,
danke für die Antworten.
me. gefolgt vom individuell erstellten Namen, txt… oder ctl_...

Irgendwie gibt es doch die Regel, vor nicht Access-Namen Me! zu schreiben.
Das andere mit me. funktioniert zwar. Macht ihr das wg der Intellisense?

Gruß Dieter

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 21. Aug 2019, 14:40
von Bitsqueezer

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 22. Aug 2019, 14:35
von Beaker s.a.
Hallo,
@Christian, @Ulrich
Dank euch beiden.
… dann stammt das Datenfeld aus der Fields-Collection des Recordsets

Das klärt für mich einiges. Vor allem dies
lassen sich nur direkt über ihren Namen ansprechen, nicht jedoch per Enumeration oder über den Index!

Das ist mir nämlich schon mal aufgefallen, konnte es mir allerdings nicht erklären.
gruss ekkehard

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 22. Aug 2019, 16:14
von Bitsqueezer
Hallo Ulrich/Ekkehard,

Feldnamen sind in der Controls-Auflistung gar nicht vorhanden. Und alle Collections lassen sich immer per Index oder Namen aufrufen, sofern man den Collection-Namen verwendet (also z.B. "Controls(0)" oder "Controls("ControlName")").

Eine Enumeration gibt es nicht für Feldnamen, da sie ja nur als Collection ausgelesen und in IntelliSense integriert werden. Hier handelt es sich auch nicht um die VBA-Collection, bei der man ja Keynamen nicht auslesen kann. In den Access-Collections gibt es dagegen die Eigenschaft "Name", mit der man auch auf den Namen zugreifen kann.

Natürlich kann man aber auch selbst eine Enum erstellen, die ja nur Zahlenwerte zurückliefert, wenn diese dann dem Index in der Collection entsprechen. Das ist aber riskant, denn schon eine Umstellung der Feldliste im SELECT eines Recordsets ändert den Index.

Wie gesagt, Feldnamen sind NIE in der Controls-Collection, nur Controls, deren Namen zufällig oder absichtlich mit dem Feldnamen übereinstimmt.
Gibt es kein passendes Control mit dem gleichen Namen wie ein Feldname, dann fügt IntelliSense den Namen aus der Recordset-Fields-Collection hinzu, gibt es ein gleichnamiges Control, wird nur dessen Name aufgeführt, das ist auch schon alles.
Der Name Manager weiß im Hintergrund natürlich, mit welchem Namen welches Objekt angesprochen werden soll, der erste zutreffende bekommt den Zuschlag, weswegen man gleichlautende Namen für verschiedene Objekte grundsätzlich immer vermeiden sollte.
Beliebtes Problembeispiel: Es wurde der Name einer Prozedur in einem Standardmodul genauso benannt wie der Modulname selbst.

Daher sind Objektprefixes zur Objektunterscheidung in VBA immer eine gute Idee...

Gruß

Christian

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 22. Aug 2019, 21:15
von knobbi38
Hallo Christian,

die Controls-Auflistung nimmt einen Sonderstatus ein und ist beleibe keine VBA-Collection. Mit Controls("Feldname") kann ich sehr wohl auf das AccessField-Objekt zugreifen, wird aber nicht in der Controls-Auflistung als Item angezeigt. Ein Zugriff mit Controls(Indexnummer) geht hingegen nicht und mit Controls.Count werden diese auch nicht mitgezählt. Auch mit einem ForEach kommt man nur an die Steuerelemente, nicht jedoch an die AccessFields. Me.Controls("Feldname") verhält sich equivalent zu Me.Feldname, nur daß so auch eine Zugriff per Variable möglich wird.

Das hat nichts mit IntelliSense zu tun, denn wir sprechen hier von echten Objekten und auch nichts mit den Recordset.Fields Objekten zu tun. Die Rede ist hier nur von AccessFields-Objekten.

Im Übrigen sind es genau diese AccessField Objekte, die von dem Formular intern verwaltet werden und über die scheinbar die Synchronisation zwischen den Steuerelementen und dem Recordset abgewickelt wird.

Du kannst das ruhig selber für dich nochmal in aller Ruhe verifizieren, was von der Controls-Auflistung mit welcher Zugriffsart zurückgeliefert wird.

Gruß Ulrich

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 23. Aug 2019, 00:16
von knobbi38
Hallo Christian,

Eine Enumeration gibt es nicht für Feldnamen

natürlich hast du Recht, da sind mir ausversehen zwei Begriffe durcheinander geraten:
...nicht jedoch per Enumeration ...

ich meinte natürlich Iteration, spezieller eine For-Each Schleife über die Elemente der Controls-Auflistung.

Sorry, wenn das etwas zu Verwirrungen geführt hat. :oops:

Gruß Ulrich

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 24. Aug 2019, 10:06
von benny66
Hallo,
bin durch die Beiträge zum Grübeln bez. ungebundener/gebundener Textfelder gekommen.
Evtl. muss man da differenzieren, wenn man es sauber machen will?
Hintergrund:
Durch eine mehrspaltige Combo (ID, Firma, Ort, Strasse) werden Datensätze im Formular gefiltert:
Code: Alles auswählen
lngID = me.cboFirmen.Columns(0)
Me.Filter = "[firID] = " & lngID
Me.FilterOn = True

Jetzt sollen im Form auch die anderen Spalten gezeigt werden.
Hängt die Schreibweise jetzt eigentlich davon ab, ob die Formularfelder gebunden sind?
also bei gebunden so:
Code: Alles auswählen
me.firName = me.cboFirmen.Columns(1)
me.firOrt = me.cboFirmen.Columns(2)
me.firStrasse = me.cboFirmen.Columns(3)

bei ungebunden so:
Code: Alles auswählen
me.txtName = me.cboFirmen.Columns(1)
me.txtOrt = me.cboFirmen.Columns(2)
me.txtStrasse = me.cboFirmen.Columns(3)

oder sollte bei gebundenen Textfeldern die Schreibweise wie bei den ungebundenen verwendet werden?
Aus dem Gelesenen kann man den Schluss ziehen, dass letzteres besser ist. Aber letztlich läuft es auf dasselbe hinaus.
Oder habe ich was übersehen?
Gruß Benny

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 24. Aug 2019, 11:43
von knobbi38
Hallo Benny,

eine Unterscheidung zwischen gebunden und ungebunden Steuerelementen müsste einen Mehrwert geben, denn ich nicht erkennen kann. Deshalb bekommen bei mir alle Steuerelemente einen Präfix vor dem gebundenen (evtl. gekürzten) Feldnamen. Ungebundene Steuerelemente erhalten auch einen Präfix und der Name richtet sich nach der Namenskonvention und den Regeln für die Benennung von Steuerelemente bzw. Objekten.

Gruß Ulrich

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 24. Aug 2019, 12:39
von benny66
Hallo,
denke über einen Automatismus nach, der einem das stupide Umbenennen erspart.
Nach dem Reinziehen der Felder in das Formular etc. erben die Textfelder ja erst einmal den Datenfeld-Namen.
Bevor nun VBA-Code erstellt wird, müsste jetzt ein Formular dem Projekt hinzugefügt werden, das Code enthält, um alle Controls umzubenennen.
Hält man es einheitlich, kann man das Präfix des Datenfeldes durch txt ergänzen. Dann hätte man Eindeutigkeit und man müsste bei Abfragen etc. nicht den Tabellennamen mit verwenden
Bsp ist das Präfix fir (aus tblFirmen: firID, firName, firOrt usw) wird daraus txtFirID, txtFirName usw.

Wahrscheinlich gibt's das schon. Ist das sinnvoll oder übersehe ich was?
Gruß Benny

Re: Zugriff auf Daten- oder Textfeld

BeitragVerfasst: 24. Aug 2019, 14:00
von knobbi38
Hallo Benny,

ich denke, du machst dir zu viel Arbeit.
Normalerweise enthält ein Formular nur eine überschaubare Anzahl Steuerelemente und deren Namen unmittelbar nach dem Einfügen zu ändern, sollte kein wirklicher Mehraufand sein, zumal es auch noch mehrere Methoden für das Hinzufügen gibt.
Wenn überhaupt, könnte man sich in einem Helper-Modul eine Prozedur anlegen, welche alle gebundenen Controls des Formulars durchläuft und ggf. den Namen mit einem Präfix versieht und diese im Direktfenster startet.

Im übrigen schenke ich es mir, Präfixe für Tabellenfelder zu verwenden und nehme stattdessen in den Abfragen normalerweise Aliase. Halte ich pers. für zielführender - ist aber Geschmackssache.

Gruß Ulrich