Autor Beitrag
jangbu
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 10.03.13 12:12 
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
Einloggen, um Attachments anzusehen!
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: So 10.03.13 12: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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 10.03.13 13:13 

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jangbu Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 10.03.13 17:27 
Hallo Sinspin,

hier der Anhang als *.jpg
Einloggen, um Attachments anzusehen!
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 11.03.13 03:25 
user profile iconjangbu hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 11.03.13 07: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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 11.03.13 15:25 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
@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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 11.03.13 15: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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 11.03.13 16:00 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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 :)