Ich habe eine Tabelle mit einer Ordnungsliste. Zu jeder Ordnungszahl gehört ein Beschrieb des Inhaltes, z.B. "211" = "Baumeister". Nun kann es bei jedem Projekt kleinere Abweichungen von diesem Standard geben. Ich möchte also, dass das Feld mit dem Namen automatisch mit einem Standardwert aus der Ordnungsliste ausgefüllt wird, sobald ich das Feld mit der Ordnungszahl verlasse. Ich schreibe also in meinem Projekt "211" klicke auf den Tabulator und möchte, dass im nächsten Feld automatisch "Baumeister" steht, ohne Referenz, da ja projektspezifisch.
Makro, VBA, Nachschlagen? Leider auch mit Google nicht fündig geworden.
Hallo Abacus,
ZitatMakro, VBA, Nachschlagen?
Makro -> besser nicht
VBA -> IMO nicht nötig
Nachschlagen -> Ja, aber
nur auf einem Formular mit einem Kombifeld.
gruss ekkehard
Hallo,
da das Feld nach der Auswahl noch überschreibbar sein muss, kommt hier nur VBA (oder Makro) in Frage. Makros will keiner, daher bleibt nur VBA.
Dazu holt mal mit DLookup den Wert aus der Tabelle.
Me.FeldFürBeschrieb = DLookup("Beschrieb","Ordnungsliste","Ordnungszahl =" & Me.Ordnungszahl)
Der Code muss als Ereignisprozur in das Ereignis "Nach Aktualisierung" von Me.Ordnungszahl (=Formularfeld mit der OZahl).
Hallo Klaus,
Hast ja Recht; - wieder zu unaufmerksam gelesen.
Aber, mir stellt sich die Frage, was denn dann in der Projekte-Tabelle gespeichert
wird.
Die Ordnungszahl? Dann macht das Überschreiben keinen Sinn.
Die Ordnungszahl und der Beschrieb? Verletzt IMO die Normalisierungsregeln.
Nur der Beschrieb? Dann würde ich das Feld für die O-Zahl als Kombi anlegen,
(ID, Beschrieb; 1cm;0cm) und mir den Beschrieb aus .Column(1) holen.
Da brauch ich kein DLookup; - ohne VBA geht's allerdings auch nicht ;)
gruss ekkehard
Hallo,
Zitatund mir den Beschrieb aus .Column(1) holen.
nein, das geht nicht, denn dann ist das Feld an das Kombi gebunden (über Column) und nicht überschreibbar. Und genau das ist ja gewünscht.
Da der Beschrieb ja für jeden Datensatz zwar vorbelegt aber trotzdem individuell änderbar sein muss, sollte in die Projekttabelle ein Feld für den Beschrieb, sonst keines. Verstößt auch nicht gegen die Normalisierungsregeln.
Hi,
es ist doch kein Problem, wenn man das Kombifeld auf "Nur Listeinträge = Nein" einstellt.
Der Text muss natürlich gespeichert werden - so oder so.
Hallo,
so geht's natürlich auch. :D
Vielen Dank an MzKlMu. Ich muss bei VBA noch etwas üben, aber ich denke, dass es so klappen muss. Ich darf nur nicht daran denken, wie einfach so etwas mit FileMaker zu bewerkstelligen ist. Tut manchmal schon etwas weh dieses Access :-)
Hallo Klaus,
Worin besteht denn der Unterschied zwischen
Me.FeldFürBeschrieb = DLookup("Beschrieb","Ordnungsliste","Ordnungszahl =" & Me.Ordnungszahl)
und
Me!FeldFürBeschrieb = Me!cboOZahl.Column(1)
gruss ekkehard
Hallo,
@ekkehard
so ist natürlich kein Unterschied, ich dachte Du wolltest das als Formel im Feld hinterlegen.
=cboOZahl.Column(1)
Klassisches Missverständnis.
Hallo Klaus,
Zitatich dachte Du wolltest das als Formel im Feld hinterlegen.
Dann hätte ich dieses nicht erwähnt
Zitatohne VBA geht's allerdings auch nicht
ZitatKlassisches Missverständnis.
Passt schon.
Ausdrücke im Steuerelemente-Inhalt verwende ich normalerweise gar nicht.
gruss ekkehard
Bin vielleicht doch zu doof für VBA. Ich kriege die Fehlermeldung: "Unzulässige Verwendung des Schlüsselworts Me". Markiert wird dabei das zweite Me. Hier noch mein Code:
Option Compare Database
Sub BKPS()
Me.rec_bkp_Name = DLookup("bkps_Name", "tbl_BKPS", "bkps_Nr =" & Me.rec_bkp_Nr)
End Sub
Hallo,
der Code muss in eine Ereignisprozedur wie ich in #2 schon geschrieben habe, nicht als selbständiger Code in ein eigenes Modul.
Private Sub rec_bkp_Nr_AfterUpdate()
Me.rec_bkp_Name = DLookup("bkps_Name", "tbl_BKPS", "bkps_Nr =" & Me.rec_bkp_Nr)
End Sub
Hi,
und was das betrifft:
Zitat von: Abacus am Juli 21, 2016, 23:21:57Option Compare Database
Aktiviere die VBA-Option "Variablendeklaration erforderlich" und füge die Zeile "Option Explicit" in alle bereits bestehenden Module ein, das schützt vor unangenehmen Überraschungen bei der Programmierung. ;-)
Lieber Klaus
Ich und VBA funktioniert offensichtlich noch nicht so recht. Habe Formular erstellt und dabei folgenden Code als Ereignisprozedur eingegeben:
Option Compare Database
Private Sub bkp_Nr_AfterUpdate()
Me.bkp_Name = DLookup("bkps_Name", "tbl_BKPS", "bkps_Nr =" & Me.bkp_Nr)
End Sub
Sobald ich in bkp_Nr ein Zahl eingegeben habe, soll Access/VBA in der Tabelle tbl_BKPS bei Übereinstimmung von bkp_Nr und bkps_Nr den Namen bkps_Name nachschlagen und in der offenen Tabelle unter bkp_Name schreiben.
Ist der Hinweis von Maggie relevant oder nice to have? Habe ich nämlich nicht umgesetzt.
Mein Hinweis bedeutet schon etwas mehr als "nice to have". Setze das um und kompiliere den Code, das verhilft u.U. zu neuen Erkenntnissen.
Und was den Code betrifft, so schreibst du den Namen in ein Formular-Steuerelement und nicht in eine "offene Tabelle".
Das Steuerelement sollte ungebunden sein, der Name muss nicht mehrfach gespeichert werden.
Hallo,
ZitatDas Steuerelement sollte ungebunden sein, der Name muss nicht mehrfach gespeichert werden.
nein, nicht ungebunden. Und der Name sollte auch in die Tabelle geschrieben werden, denn die Auswahl ist ja nur eine Vorgabe die individuell je Datensatz bei Bedarf änderbar sein soll.
Sorry, das hatte ich doch glatt inzwischen schon wieder vergessen. :-[
Hallo abacus,
ZitatIst der Hinweis von Maggie relevant oder nice to have?
Ich halte das schon für relevant. Das ist wirklich ein Feature, das dir bei
der Entwicklung kräftig unter die Arme greift, siehe Maggies Antwort.
Du kannst das automatisch in jedes
neue (Klassen)Modul eintragen
lassen indem du folgende Einstellung vornimmst:
Im VBA-Editor: Menu "Extras" -> "Optionen" -> Häkchen setzen bei
"Variablendeklaration erforderlich".
hth
gruss ekkehard