Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - DBLookupComboBox
jangbu - So 10.03.13 13:12
Titel: DBLookupComboBox
Hallo, hab da mal ein Problem:
In einer DBlookupcombobox biete ich via AdoQuery die Daten einer SQL-Server Tabelle in der Listsource/DropdownListe (name,vorname) zur Auswahl an. Listfiled ist name;vorname. Die Selektion klappt solange der Name in der Tabelle nur einmal vorkommt. Da der Name "Meier" aber mehrfach vorkommt, werden bei Eingabe von "M", gleich alle "Meier" markiert. In diesem Fall ist eine weitere Selektion z.B. des 2. "Meier" per Tastatur überhaupt nicht möglich. Auch durch Mausklick auf den 2. Meier gibt Query.FieldByName zu mindest bei der ersten Auswahl immer den ersten Meier zurück!?
Ab dem zweiten Auswahlversuch scheint scheint die Zuweisung sicher zu klappen. Was mach ich da falsch, fehlt da eine Initialisierung? Ich kann doch nicht immer den Maier Horst zweimal auswählen, weil beim ertsen Versuch immer der Meier Willi erkannt wird?
Wie kann ich sicher abfragen, welchen Datensatz genau ich per Maus angeklickt habe? Eine genaue Auswahl per Tastatur geht wohl nicht?
Siehe Anlage
Sinspin - So 10.03.13 13:43
Hallo und :welcome: in der EE!
Was hast Du in dem Doc drinne? Bilder? Dann häng diese als JPG / PNG bitte direkt an. Ich lade das Doc jedenfalls nicht extra runter und mache es auf. Sorry.
Zum Problem: Um Datensätze in einer Tabelle eindeutig identifizieren zu können brauchst man einen eindeutigen Index der jeden Datensatz eindeutig von allen anderen unterscheidet. Einen Autoinc(Integer) am besten oder ein Unique Index über Vor und Nachname. Aber auch komplette Namen können doppelt sein! Zur Auswahl mit einer DBLookupComboBox definiert man ein KeyField, nach Möglichkeit ein Feld für das ein Unique Index existiert, und ListField(s) die in der Liste der ComboBox dargestellt werden.
Mir ist kein Fall bekannt bei der die Komponente dann nicht richtig funktionieren würde, wobei sich meine Aussage nur auf DevExpress Komponenten bezieht da ich nichts anderes verwende.
Wenn man den Name (außer dem Wert aus dem KeyField) selbst in der Tabelle speichern will geht das über das Ergeignis OnCloseUp oder OnEditValueChange(wenn vorhanden) via KeyField kann man sich dann die anderen Werte hohlen und in den Datensatz schreiben.
jangbu - So 10.03.13 18:27
Hallo Sinspin,
hier der Anhang als *.jpg
Delete - Mo 11.03.13 04:25
jangbu hat folgendes geschrieben : |
Hallo Sinspin, hier der Anhang als *.jpg |
Du hast weder das Property DataSource noch das Property DataField angegeben. Was glaubst du, weshalb die Komponente den Bezeichner Lookup trägt? Als Lookup bezeichnet man das Nachschlagen eines Wertes in einer anderen Tabelle, wenn in der Ursprungstabelle lediglich ein Foreign-Key gesetzt ist, um damit z.B. auf einen Kunden zu verweisen. Eine DBLookUpComboBox ist nicht gedacht zum reinen Anwählen eines Datensatzen wie z.B. das DBGrid, sondern um einen Foreign-Key einzustellen. Beispiel:
Nehmen wir einmal an, du hast eine Tabelle RECHNUNG mit den Feldern Idx_Rechnung, Betrag, Datum und Kunde. Das Feld Kunde ist dabei lediglich ein Integer und ist mit dem Index der Tabelle KUNDE verknüpft. In letzterer gibt es z.B. die Felder Idx_Kunde, Nachname, Vorname, Strasse, PLZ und Ort. Gehen wir weiter davon aus, daß dein Formular zur Eingabe, Bearbeitung und Anzeige von Rechnungen dient. Dann erhält das Property DataSource deiner DBLookUpComboBox den Eintrag DataSource_Rechnung, während im Property DataField der Eintrag Kunde sehen sollte. Im Property ListSource sollte dann aber DataSource_Kunde stehen, in KeyField der Eintrag Idx_Kunde (das Feld, das den Key enthält, daher KeyField) und im Property ListField das Feld der Tabelle KUNDE, das du anzeigen möchtest.
Übrigens solltest du um der besseren Lesbarkeit willen deinen Komponenten aussagekräftige Variablenbezeichner spendieren, sonst verlierst du ganz schnell den Überblick.
bummi - Mo 11.03.13 08:10
@Perlsau man kann die DBLookupcombobox durchaus ohne Bindung auf Datasource und Datafield als reine Auswahlbox "missbrauchen". Man muss nur sicherstellen dass Keyfield eindeutig ist und darf sich nicht auf die Position in Lookupdataset verlassen, sondern muss KeyValue auswerten.
Delete - Mo 11.03.13 16:25
bummi hat folgendes geschrieben : |
@Perlsau man kann die DBLookupcombobox durchaus ohne Bindung auf Datasource und Datafield als reine Auswahlbox "missbrauchen". Man muss nur sicherstellen dass Keyfield eindeutig ist und darf sich nicht auf die Position in Lookupdataset verlassen, sondern muss KeyValue auswerten. |
Sicher. Aber der Sinn & Zweck von TDBLookupComboBox ist doch der, daß man damit eine Beziehung darstellt und editierbar macht. Ansonsten könnte man auch einfach ein TDBGrid einsetzen, das bietet für diesen Zweck gegenüber der TDBLookupComboBox etliche Vorteile: U.a. sieht man gleich mehrere Spalten auf einmal, kann den TitelClick als Auslöser für Sortier-Methoden verwenden, kann mehrere Felder editieren und sich überhaupt viel leichter einen Überblick verschaffen. Und man kann sogar die Lookup-Beziehung im TDBGrid editieren, wenn man im zugrundeliegenden Dataset mit persistenten Feldern arbeitet und dort bereits virtuelle Felder für die Lookup-Felder einträgt.
bummi - Mo 11.03.13 16:58
Sicher aber in einem Dialog in den das Berichtsformat und der Verteiler ausgewählt werden fühlt sich der Kunde mit einer Combobox nach meiner Erfahrung wohler.
Delete - Mo 11.03.13 17:00
bummi hat folgendes geschrieben : |
Sicher aber in einem Dialog in den das Berichtsformat und der Verteiler ausgewählt werden fühlt sich der Kunde mit einer Combobox nach meiner Erfahrung wohler. |
Ein unschlagbares Argument: Der Kunde ist König :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!