Zugriff auf Daten- oder Textfeld

Antwort erstellen

Smilies
:D :) :( :o :shock: :? 8-) :lol: :x :P :razz: :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :badgrin: :doubt:
BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet
Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Zugriff auf Daten- oder Textfeld

Re: Zugriff auf Daten- oder Textfeld

Beitrag von Beaker s.a. » 24. Aug 2019, 16:59

Hallo Benny,
Gleich beim Einfügen dürfte nicht so simpel sein. Da müsste das AddIn ja
permanent im Hintergrund laufen und deine Aktivitäten auf der Oberfläche
überwachen.
Eine einfachere Variante mit einem Form zur Auswahl des/der zu bearbeiten
Formulars/e könnte ich mir schon vorstellen. Für die Profis hier sollte das
eigentlich ein Klacks sein.
gruss ekkehard

Re: Zugriff auf Daten- oder Textfeld

Beitrag von benny66 » 24. Aug 2019, 15:55

Hallo ekkehard , Ulrich
auf http://www.office-loesung.de/p/viewtopic.php?f=167&t=752651# hat Christian RenameObjects gepostet.
Habe ich noch nicht versucht.
CV schreibt da auch
Aber leider kein Add-In das gleich beim Einfügen die Namen anpasst

Aber ein AddIn wäre wohl was .
Dein Link scheint auch kein AddIn zu sein oder dazu ausbaubar zu sein. Habe das aber noch nicht genau genug gelesen.

Bei Word sind AddInns wohl mehr eine globale Dokumentvorlage in einem speziellen Ordner.
Sehe da zwar bei Access unter DBtools einen Button Add-Inns mit einem Manager zum Hinzufügen.
Aber das wäre der letzte Schritt. Wie so ein Ding bei Access gebaut sein muss - keine Ahnung.
Gruß Benny

Re: Zugriff auf Daten- oder Textfeld

Beitrag von Beaker s.a. » 24. Aug 2019, 14:12

Hallo Benny,
Wahrscheinlich gibt's das schon

Bei einer schnellen Suche habe ich dies gefunden:
https://theitservice.co.uk/a-microsoft-access-tool-to-automatically-rename-your-form-controls/
Lässt sich sicher noch verbessern, z.B. das ganze If … ElseIf … Gedöns durch
Select Case zu ersetzen.
Vor allem dieses würde ich umschreiben,
1.You name every column in your table with a three-character prefix indicating the data type, such as strFirstName, datOrderDate and blnActive
The code replaces the first three characters in the ControlSource property for data-bound controls with a prefix indictating the object type (txt, cbo, chk etc)

denn es geht ja darum die Prefixe für die Controls zu ergänzen. Prefixe bei
Tabellennamen halte ich eh für überflüssig.

gruss ekkehard

Re: Zugriff auf Daten- oder Textfeld

Beitrag von knobbi38 » 24. Aug 2019, 14:00

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

Re: Zugriff auf Daten- oder Textfeld

Beitrag von benny66 » 24. Aug 2019, 12:39

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

Beitrag von knobbi38 » 24. Aug 2019, 11:43

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

Beitrag von benny66 » 24. Aug 2019, 10:06

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

Beitrag von knobbi38 » 23. Aug 2019, 00:16

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

Beitrag von knobbi38 » 22. Aug 2019, 21:15

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

Beitrag von Bitsqueezer » 22. Aug 2019, 16:14

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

Beitrag von Beaker s.a. » 22. Aug 2019, 14:35

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

Beitrag von Bitsqueezer » 21. Aug 2019, 14:40

Re: Zugriff auf Daten- oder Textfeld

Beitrag von Gast » 21. Aug 2019, 14:26

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

Beitrag von knobbi38 » 21. Aug 2019, 13:12

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

Beitrag von Bitsqueezer » 21. Aug 2019, 13:03

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

Nach oben