Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: accessy am Dezember 20, 2012, 20:36:56

Titel: Universelle ComboBox
Beitrag von: accessy am Dezember 20, 2012, 20:36:56
Erst einmal wünsche ich allen Forumsteilnehmern ein besinnliches Weihnachtsfest im Kreise ihrer Familie.

Ein Doppelklick in einem Feld soll die ComboBox mit einer bestimmten Liste füllen.
Zitat
Private Sub Beschichtung_DblClick(Cancel As Integer)
  Me.ComboBox_Uni.RowSource = Beschichtungen
End Sub

Beschichtungen heißt die Tabelle mit nur diesem einzigen Datenfeld.
Aber so wie oben im Code eingegeben wird die Liste nicht eingelesen.(In Excel wäre das so)

Wenn ich dann den Wert in der Liste gewählt habe,
soll beim Verlassen der Combo, das Feld, in dem der Cursor steht den Wert der Combo bekommen.
Zitat
Private Sub ComboBox_Uni_Exit(Cancel As Integer)
  Me.Actives Feld = ComboBox_Uni.Value
End Sub
So wie im Code geschrieben geht das natürlich nicht.
In Excel wäre das ActiveCell

Ich hoffe, ich habe es gut beschrieben und jemand sagt mir wie das geht..
Titel: Re: Universelle ComboBox
Beitrag von: DF6GL am Dezember 20, 2012, 20:52:53
Hallo,

das geht prinzipiell nicht.  Wenn das Kombifeld verlassen wird, hat dieses den Focus und nicht ein anderes Feld...


Außerdem ist es fragwürdig, einen ausgewählten und damit genau definierten Wert irgendeinem anderen Textfeld zuzuweisen.

Wenn der ausgewählte Wert einem bestimmten (Tabellen-)Feld zugewiesen werden soll, dann braucht das Kombi lediglich an dieses Feld gebunden werden (---> Steuerelementinhalt).  Soll es einem ungebunden Feld (die Frage hier: wozu) zugewiesen werden, dann ginge das etwa so:

Sub Kombi1_Afterupdate()
Me!UngebundenesTextfeld= Me!Kombi1
End Sb



Es muss der Name der Tabelle/Abfrage  (in Form eines Literal-Strings) zugewiesen werden, und nicht eine Variable (Beschichtungen)  , die hier als solche interpretiert wird:

Me.ComboBox_Uni.RowSource = "Beschichtungen"

Besser wäre:
Me.ComboBox_Uni.RowSource = " Select [Datenfeld] from Beschichtungen Order By [Datenfeld]"


weil so Kontrolle über die Reihenfolge (Sortierung)  und dem selektierten Feld erreicht wird.

PS: Vergiss Excel, wenn Du in Access arbeitest....


Titel: Re: Universelle ComboBox
Beitrag von: MzKlMu am Dezember 20, 2012, 20:59:52
Hallo,
Private Sub Beschichtung_DblClick(Cancel As Integer)
 Me.ComboBox_Uni.RowSource = "Beschichtungen"
End Sub

Tabellennamen, Abfragenamen, SQL Anweisungen müssen als String (in AZ) übergeben werden.

Zitatsoll beim Verlassen der Combo, das Feld, in dem der Cursor steht den Wert der Combo bekommen.
Da ist der Cursor immer noch im Combo, Du hast ja den Fokus nicht verschoben. Das aktive Feld ist also immer noch die Combo.
Es macht ja auch keinen Sinn, den Wert der Combo irgendwohin zu speichern. Du solltest also die Combo ausslesen wenn das gewünschte Feld den Fokus hat.

ZitatIn Excel wäre das ActiveCell
In Access ist das Me.ActiveControl, aber wie gesagt, das nutzt nix.

PS:
Eine Tabelle (Beschichtungen) mit einem Feld ist mir auch suspekt, hat die Tabelle keinen Primärschlüssel?
Üblicherweise werden in Kombis Primärschlüssel übergeben und keine Texte.

Titel: Re: Universelle ComboBox
Beitrag von: DF6GL am Dezember 20, 2012, 21:07:12
Hallo,

kleiner Hinweis:

in diesem Fall ist das Steuerelement, in dem der Cursor vor der KombiAuswahl stand, mit Screen.PreviousControl zu erreichen ....
Titel: Re: Universelle ComboBox
Beitrag von: accessy am Dezember 20, 2012, 22:26:49
Liebe Access Experten,

es ist nicht ganz einfach für mich das Excel-Denken weg zu schieben.
Da steht man in einer Zelle, der aktiven Zelle und kann diese über eine ComBo mit dem Wert bestücken.
Tja, und nun ist alles anders....

Ich kann es einfach nicht verstehen. Was soll ich denn mit dem Primärschlüssel?
Die Tabelle hat eine einzige Spalte, nein sorry, ein einziges Feld mit Namen Beschichtungen.

Eine zweite Tabelle ist genauso aufgebaut und trägt den Namen Werkstoffe.
Ich bin mit dem Cursor in der Textbox WERKSTOFFE und mache einen Doppelklick.
Dadurch lese ich die Liste WERKSTOFFE in die Combo ein.

So, nun sagt ihr, dass es nicht geht, weil der Cursor jetzt in der Combo ist und nicht mehr in der Textbox.
Dadurch ist die Aktive Textbox nicht mehr aktiv. Mist, geht nicht. Okay, aber verstanden.

Schade, ich wollte einfach vermeiden mehrere Listboxen zu haben.
In einer anderen DB habe ich es mit einer Listbox so gemacht. Doppelklick zeigt die Listbox. Klick auf den Wert trägt diesen in die Textbox ein.
Und die Tabelle hat auch keinen Primärschlüssel.
Da habe ich meinen Excel-Gedanken umgesetzt. Das funktioniert.

Da muss ich wohl am besten mit mehreren Listboxen arbeiten und immer per Doppelklick die entsprechende einblenden.
Titel: Re: Universelle ComboBox
Beitrag von: DF6GL am Dezember 20, 2012, 22:50:25
Hallo,

nun ja...

Zitates ist nicht ganz einfach für mich das Excel-Denken weg zu schieben.
Dadran musst Du arbeiten, wenn Du mit Access arbeiten willst...  Access nimmt keine Rücksicht auf Deine Vorstellungen.

(Anfänglich hatte ich Dich klar darauf hingewiesen, Access-Grundlagen durch zu arbeiten.)


ZitatIch kann es einfach nicht verstehen. Was soll ich denn mit dem Primärschlüssel?

Entspr. relationenen Datenbank-Anforderungen sollte (muss in fast allen Fällen) JEDE Tabelle einen Primärschlüssel ausweisen. Der ist dazu da, einen Datensatz klar und unmissverständlich zu kennzeichnen und bei mehreren Tabellen, deren Daten zueinander in einer Beziehung stehen, die Beziehung zu definieren und eine referentielle Integrität (---> Grundlagen) zu gewährleisten.   Ohne diese Funktionalität könnte eine rel. Datenbank im Gesamten nicht funktionieren. In Deinem Fall einer Tabelle mit nur einer Spalte sollte genau die Spalte als Primärschlüssel definiert sein. Das verhindert zudem Mehrfach-Einträge desselben Wertes, was nun wirklich Unsinn wäre.



ZitatDie Tabelle hat eine einzige Spalte, nein sorry, ein einziges Feld

"Spalte" wäre schon richtig  ..  "Feld" ist aber auch gebräuchlich..


ZitatEine zweite Tabelle ist genauso aufgebaut ......
Dadurch lese ich die Liste WERKSTOFFE in die Combo ein.

Dagegen ist jetzt erst mal nichts einzuwenden...

ZitatMist, geht nicht. Okay, aber verstanden.

Kein Mist, sondern normales Verhalten (in Access)


Zitatich wollte einfach vermeiden mehrere Listboxen zu haben.

Warum denn?  Was hindert Dich an mehreren Kombis?

ZitatDa muss ich wohl am besten mit mehreren Listboxen arbeiten und immer per Doppelklick die entsprechende einblenden.

Warum denn?  Auch dort (bei einer Listbox) wird ein Listeneintrag erst durch Zuweisung (wie beim Kombi gezeigt) in ein anderes Feld eingetragen.

Ich denke, Du machst das Ganze noch zu kompliziert.   "Normal" (Standard) wäre, ein Kombi an das Tabellenfeld zu binden  (--> Steuerelementinhalt) und die Kombiliste mittels Abfrage (---> Rowsource,auch wie gezeigt) mit Daten aus einer anderen Tabelle, die ausgewählt werden sollen, zu füllen.  Man könnte auch die gleiche Tabelle  für das Füllen des Kombis mit den Daten aus der Spalte  benutzen, an die das Kombi gebunden ist.



Sinnvoll wäre, wie vielfach und andernorts hier im Forum schon erzählt und geraten,  sich VOR der Formularerstellung  die Tabellenstruktur  (Tabellenaufbau mit ihre Feldern und Beziehungen ) zu Gemüte zu führen und auf Übereinstimmung mit den realen Anforderungen und auf die Anwendung der Normalisierungsregeln zu überprüfen.  Ohne das wird es in den meisten Fällen nicht zum gewünschten Erfolg führen..
Titel: Re: Universelle ComboBox
Beitrag von: accessy am Dezember 20, 2012, 23:10:43
Schnelle Frage hinterher.
Mit .Visible = False wird scheinbar die Listbox nicht geschlossen.
Laufzeitfehler 2165
Solange die Listbox den Focus hat kann man sie nicht ausblenden.

Das kann gar nicht sein, denn durch das Klicken in eine andere Textbox, verlasse ich doch die Listbox und der Focus ist jetzt in dieser Textbox.

Zitat
Private Sub Form_Load()
   Me.Liste_Beschichtungen.Visible = False
End Sub
Private Sub Beschichtung_DblClick(Cancel As Integer)
   Me.Liste_Beschichtungen.Visible = True
End Sub
Private Sub Liste_Beschichtungen_Click()
   Me.Beschichtung = Liste_Beschichtungen.Value
End Sub
Private Sub Liste_Beschichtungen_Exit(Cancel As Integer)
   Me.Liste_Beschichtungen.Visible = False
End Sub
Titel: Re: Universelle ComboBox
Beitrag von: DF6GL am Dezember 20, 2012, 23:19:28
Hallo,


ZitatDas kann gar nicht sein, denn durch das Klicken in eine andere Textbox, verlasse ich doch die Listbox und der Focus ist jetzt in dieser Textbox.

Wirklich?


.Visible steht in der Ereignisprorzedur "Exit", die ausgeführt wird, wenn der Cursor das Feld noch nicht verlassen hat.  Somit ist der Focus noch nicht in einer anderen Textbox.  Der Cusor steht gewissermassen "vor der Ausgangstür" , und ist erst dann "durch" wenn die Sub beendet wird. (Außer man schliesst die Tür zu, indem man
Cancel =True
setzt , dann kommt der Cursor nicht mehr aus dem Listenfeld heraus  ;)
Titel: Re: Universelle ComboBox
Beitrag von: MzKlMu am Dezember 20, 2012, 23:44:09
Hallo,
ich fürchte, Du machst Du viele masive grundsätzliche Fehler im Aufbau der DB. Auch wenn es jetzt scheinbar funktioniert wirst Du im weiteren Verlauf nicht viel Freude an der DB haben.
Eine Datenbank mit Tabellen ohne nummerischen Primärschlüssel (meist Autowert) und Beziehungen halte ich im großen und Ganzen auf Dauer für unbrauchbar.
Auch die eine Spalte in den Tabellen Beschichtungen und Werkstoffe jetzt zum Primärschlüssel zu machen ist keine gute Lösung. Texte sind als Primärschlüssel ungeeignet.
Mit Hilfe der Kombis sollen ja vermutlich Werte in eine andere Tabelle geschrieben werden. Und da nimmt man eben auf keinen Fall den Klartext, sondern immer den nummerischen Schlüssel. Es macht auch keinen Sinn eine solche Universalbox zu erstellen, immer wo der Wert in eine Spalte der anderen Tabelle soll, erstellt man ein Kombi das man an diese Spalte bindet. Das Kombi muss aber die Schlüsselzahl speichern und nicht den Text. Das heist, Du benötigst ja gar kein zusätzliches Textfeld zur Speicherung, das Kombi erledigt alles, Auswahl und speichern des Wertes. Solche Codes:
Private Sub Liste_Beschichtungen_Click()
   Me.Beschichtung = Liste_Beschichtungen.Value
End Sub

Sind völlig überflüssig, weil das Kombi an das Feld Beschichtung (bzw. an das Fremdschschlüsselfeld) gebunden sein sollte und damit wird kein Code benötigt, kein Buchstabe. Ich denke, Du programmierst Sachen die Access serienmäßig ohne Programmierung besser kann.

Du darfst mit Access niemals an Excel denken, Access und Excel haben nichts gemeinsam. Selbst VBA ist bis auf die Grundstrukturen nicht vergleichbar.
Titel: Re: Universelle ComboBox
Beitrag von: accessy am Dezember 21, 2012, 09:33:38
Ich werde eurer SAP Denken und Handeln nicht erreichen.
Schon deshalb nicht, weil ich ACCESS eigentlich gar nicht als Datenbank sehe.
Allein dieses letzte Anliegen schon.
Ich habe EINE Tabelle, EIN Formular und das wars schon.
Da ist nichts weiter als eine tabellarische Sammlung von Beispielen, die man mal "nachschlagen" kann.
Eine Art Lexikon gewissermaßen.
Und damit die ganze Sache etwas schöner aussieht, habe ich es in ein Formular gepackt. Ende.

Und wenn ich ein weiteren Eintrag mache, wollte ich mir die Sache mit oft benutzen Begriffen (Vorgaben für dieses Feld)
durch eine Listbox, oder einer Universal-ComBo erleichtern.
Combo geht nicht, okay.
Also nehme ich jetzt mehrere Listboxen. Das sollte funktionieren.
Titel: Re: Universelle ComboBox
Beitrag von: Wurliwurm am Dezember 21, 2012, 10:33:30
Zitat von: accessy am Dezember 21, 2012, 09:33:38
Ich habe EINE Tabelle, EIN Formular und das wars schon.
Da ist nichts weiter als eine tabellarische Sammlung von Beispielen, die man mal "nachschlagen" kann.

Mal abgesehen, daß hier in Forum manchmal Dogmatik  vorherrscht:
Warum benutzt Du nicht Excel? Mit einer Userform und Ranges als Quellfeldern.
?
Titel: Re: Universelle ComboBox
Beitrag von: accessy am Dezember 27, 2012, 17:41:13
Noch kurz als Nachtrag, wie ich es mit dem Schließen der Listbox gemacht habe.
Zitat
Private Sub Schneidstoff_DblClick(Cancel As Integer)
   Me.Liste_Schneidstoffe.Visible = True
End Sub

Private Sub Liste_Schneidstoffe_Click()
   Me.Schneidstoff = Liste_Schneidstoffe.Value
   Me.Schneidstoff.SetFocus
   Me.Liste_Schneidstoffe.Visible = False
End Sub

Funktioniert einwandfrei
Titel: Re: Universelle ComboBox
Beitrag von: DF6GL am Dezember 27, 2012, 17:49:07
Hallo,

wenn Du nun das Listenfeld "Liste_Schneidstoffe"  an das Tabellenfeld bindest (--> Steuerelementinhalt) , an das auch das Textfeld "Schneidstoff"  gebunden ist (---> Steuerelementinhalt), dann brauchst Du den ganzen Zinnober nicht..   ;)