Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   dblookupcombobox (https://www.delphipraxis.net/173668-dblookupcombobox.html)

jangbu 9. Mär 2013 20:03

dblookupcombobox
 
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 immer den ersten Meier zurück!? Wie und wo kann ich abfragen, welchen Datensatz genau ich per Maus angeklickt habe? Eine genaue Auswahl per Tastatur geht wohl nicht?

jangbu 10. Mär 2013 11:28

AW: dblookupcombobox
 
Liste der Anhänge anzeigen (Anzahl: 1)
keiner ne Idee?

Sieht so aus, als würde das Problem nur bei der Ersten Auswahl auftreten. Also bei klick auf Meier Horst (3.Meier) gibt Query.FieldByName Meier Willi (1.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?

Siehe Anlage

Bummi 10. Mär 2013 12:12

AW: dblookupcombobox
 
Crosspost http://www.entwickler-ecke.de/viewtopic.php?t=111268

jangbu 10. Mär 2013 16:39

AW: dblookupcombobox
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Bummi,

ja habe ich nochmal eingestellt. Komme aber leider nicht recht weiter!?

Furtbichler 10. Mär 2013 16:58

AW: dblookupcombobox
 
Hat die Tabelle einen PK? Wie ist KeyField gesetzt?

Ich habe das bei mir eben mit einem DevExpress MemData ausprobiert. Weiterhin habe ich ein TDBGRid auf die Form geklatscht und das mit dem Lookup-Dataset verknüpft, damit ich den Datensatzzeiger sehe.

Es ist ja schon mal klar, das alle drei Meier selektiert ist, denn das ist nun einmal der selektierte Eintrag. Ich gehe mal davon aus, das das KeyField='Name' ist. Dann ist das nämlich zwingend.

Wenn die Lookup-Tabelle einen PK hat, dann sollte in der Original-Tabelle ein FK definiert sein. Dann wäre die Selektion eindeutig. So aber nicht.

Bummi 10. Mär 2013 17:03

AW: dblookupcombobox
 
Liste der Anhänge anzeigen (Anzahl: 2)
Je nachdem welches das Keyfield ist wird passend dargestellt.
Sel1='ID', Sel2='Name'.

EDIT
Furtbichler war schneller ;-(

Uwe Raabe 10. Mär 2013 17:04

AW: dblookupcombobox
 
Ich glaube, du erwartest von dem Control ein Verhalten, für das es nicht gemacht ist. Du möchtest in der DBLookupCombobox offenbar den aktuellen Datensatz auswählen. Das ist aber nicht das, wofür es gemacht ist (dazu siehe Doku). Das musst du anders lösen.

Bummi 10. Mär 2013 17:08

AW: dblookupcombobox
 
@Uwe Raabe durch das "unsaubere" Verhalten einer DBLookup-Combobox kann sich ein Anfänger IMHO dazu verleiten lassen sich auf die Auswahl des Satzes in der Lookupmenge zu verlassen.

Uwe Raabe 10. Mär 2013 17:13

AW: dblookupcombobox
 
Zitat:

Zitat von Bummi (Beitrag 1206738)
@Uwe Raabe durch das "unsaubere" Verhalten einer DBLookup-Combobox kann sich ein Anfänger IMHO dazu verleiten lassen sich auf die Auswahl des Satzes in der Lookupmenge zu verlassen.

Was ja hier offensichtlich auch passiert ist. Man sollte schon stutzig werden, wenn es erst beim zweiten Versuch klappt.

jangbu 10. Mär 2013 17:46

AW: dblookupcombobox
 
Hallo Uwe Raabe, genau das hatte ich gehofft, dass ich mit der dblookupcombobox den ausgewählten Satz zurück bekomme. Wie ich dich verstanden habe, geht das wohl damit nicht?

Furtbichler 10. Mär 2013 18:00

AW: dblookupcombobox
 
Das DBLookup-Control macht alles richtig. Wenn Du als 'KeyField' den Namen auswählst, und dann 'Meier' auswählst (oder 'Me' eintippst), dann wird genau das gemacht, was Du willst. Es wird der Name 'Meier' ausgewählt.

Wenn Du im KeyField allerdings den PK angibst, funktioniert alles.

Bummi 10. Mär 2013 18:09

AW: dblookupcombobox
 
@Furtbichler man sollte sich nicht darauf verlassen dass der Satz dort steht wo man es der Anzeige nach vermutzen würde, auch wenn man den PK verwendet, lass beispielsweise mehrere Lookups auf das Dataset zugreifen. IMHO ist ein Zugriff über Keyvalue (bei Verwendung des PK) Pflicht .

jangbu 10. Mär 2013 18:55

AW: dblookupcombobox
 
Hallo Bummi,

das richtige setzen des KeyField ist das Stichwort. Hatte ich ignoriert. Passt jetzt.
Danke!

Furtbichler 10. Mär 2013 18:56

AW: dblookupcombobox
 
@Bummi: Hab nicht genau verstanden, was Du meinst, sry. Wenn ich ein TDBGrid zur Kontrolle an das Lookup-Dataset hänge, dann kann ich damit ja den aktuellen Datensatz verschieben. Am LookupCombo ändert sich gar nichts. Sobald ich das aufklappe, positioniert sich das Lookupfeld auf den ersten Datensatz und markiert alle Einträge, für die gilt: ListSource.KeyField=DataSource.DataField.

Und wenn -wie hier- drei DS markiert sind, dann kann ich nicht wissen, wo sich der aktuelle Datensatz befindet. Es handelt sich schließlich um eine Menge, und da kann jeder der Datensätze gerade der aktuelle sein: Genau das zeigt das Combo-Teil ja auch.

Nebenbei: Mit dieser Konfiguration kann man mit dem Cursor (Pfeil hoch/runter) nicht durch alle Datensätze durchwandern, eben weil die Einträge nicht eindeutig sind.

Bummi 10. Mär 2013 19:39

AW: dblookupcombobox
 
@Furtbichler mir ist klar dass Du Dich nicht auf auf die Satzposition eines Lookupdatasets, auch nach einem Lookup über den PK verlassen würdest. Mit weniger Erfahrung könnte es passieren dass man es tut und nicht berücksichtigt dass gegf. andere Datasets ebenfalls dieses Dataset als Lookupsource verwenden und er Satz dann sonst wo steht.
Ein Beispiel währe Masterdataset mit Lookup über ID auf Adressen und Detaildataset mit 1:n Ansprechpartnern mit ebenfalls verwendeten Lookups auf dasselbe Dataset.

Furtbichler 10. Mär 2013 20:04

AW: dblookupcombobox
 
Stimmt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz