AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken C++ Filter mittels Combobox
Thema durchsuchen
Ansicht
Themen-Optionen

Filter mittels Combobox

Ein Thema von rgorholt · begonnen am 15. Mär 2006 · letzter Beitrag vom 16. Mär 2006
Antwort Antwort
rgorholt
(Gast)

n/a Beiträge
 
#1

Filter mittels Combobox

  Alt 15. Mär 2006, 12:39
Datenbank: PostgreSQL • Zugriff über: ODBC/BDE
Hallo zusammen,

meine Frage betrifft zwar eigentlich den C++-Builder 3, aber da die VCL in Delphi geschrieben ist, stelle ich meine Frage in diesem Forum.

In einer Datenbank habe ich eine Tabelle mit Ländercodes und den entsprechenden Namen. Die Ländernamen (z.B. Deutschland) möchte ich in einer Combobox zur Auswahl anbieten um dann mit dem entsprechenden Landescode (z.B. DE) einen Filter einer TQuery auf eine andere Tabelle zu setzen um nur die zu diesem Land gehörenden Datensätze auszuwählen. Die Datensätze sollen nicht geändert werden (read only).

Folgendes habe ich bis jetzt versucht:

1) TDBLookupCombobox.

Sie zeigt mir zwar die Länder entsprechend des im aktuellen Datensatz gespeicherten Landescodes an, läßt aber keine Auswahl zu, da der Datensatz nicht zum Editieren freigegeben ist.

2) TCombobox (wurde in einem anderen Posting in diesem Forum erwähnt).

Sie erlaubt das Speichern von Strings. Damit kann ich aber entweder nur die Landescodes, nur die Namen oder aber einen String der Art Code=Name speichern, aus dem ich dann den Code zum Setzen des Filters extrahieren könnte. Dies gefällt mir aber nicht besonders. Ich möchte die Namen anzeigen, benötige aber die Codes zum Filtern. Eine Rückwärtssuche in der Datenbank um vom Ländernamen auf den Landescode zu kommen erscheint mir auch nicht sinnvoll.

Ich habe auch schon daran gedacht, zusammen mit den Strings in der Combobox ein Objekt für den Code zu speichern (TStrings->Items, TStrings->Objects), aber geht das nicht eleganter?

Wahrscheinlich habe ich die naheliegendste Lösung übersehen

Hat von Euch jemand eine Idee, wie ich das Problem am elegantesten lösen kann?

Vielen Dank für Eure Hilfe,

Ralf Gorholt
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Filter mittels Combobox

  Alt 15. Mär 2006, 12:45
Mom.. du hast zwei Tabellen.. eine enthält die Ländercodes, die andere enthält Daten zu den jeweiligen Ländern, hab ich das richtig verstanden? Und jetzt willst du alle Daten zu dem gewählten Land anzeigen lassen, Richtig?

Dazu brauchst du einen Filter der alle DS mit dem jeweiligen Ländercode aus der zweiten Tabelle Filtert.
Zur Anzeige würde ich ein DBGrid empfehlen. Im DBGrid kannst du die Eigenschaft ReadOnly setzen wie eigentlich bei jeder DBKomponente.

Edit:
MitCombobox meinst du wahrscheinlich das dir alle Ländercodes in der Combobox angezeigt werden, du dann einen auswählst und die entsprechenden Daten angezeigt werden oder?

Nun dazu würde ich in eine TComboBox alle DS reinladen.

Also(in Delphi)
Delphi-Quellcode:
combobox.items.clear;
with Query do
  begin
  First;
  while not eof do
    begin
    combobox.items.Add(FieldByName('Ländercodes').AsString);
    Next;
    end;
  end;
Dann musst du immer wenn du ein Item auswählst den Filter auf die zweite Tabelle setzen und als Filterwert "Combobox.Text" nehmen
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Filter mittels Combobox

  Alt 15. Mär 2006, 12:55
Hai rgorholt,

ersteinmal : "Herzlich Willkommen in der Delphi-PRAXiS"

wenn ich dich Richtig verstanden habe müsste es mit einer TDBLookupCombobox gehen. Du musst nur darauf achten die richtigen Eigenschaften zu setzen;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with Query_zu_Laender_Tabelle do
  begin
    Close;
    SQL.Text := 'SELECT * FROM Laender_Tabelle';
    Open;
  end;

  DataSource1.DataSet := Query_zu_Laender_Tabelle;

  with DBLookupComboBox1 do
  begin
    ListSource := DataSource1;
    ListField := 'Laendername';
    KeyField := 'LaenderCode'; // Oder auch das ID-Feld der Tabelle.
  end;
end;

procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
  laender_code := DBLookupComboBox1.ListSource.DataSet.FieldByName('laendercode').AsString;
end;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
rgorholt
(Gast)

n/a Beiträge
 
#4

Re: Filter mittels Combobox

  Alt 15. Mär 2006, 15:37
Hallo Angel4585, hallo Sharky,

Danke für die schnelle Antwort.

Vielleicht habe ich mich nicht präzise genug ausgedrückt.

In Tabelle 1 habe ich die Felder LandCode und LandName, die die ISO-Codes und die Ländernamen enthalten (z.B. DE - Deutschland; FR - Frankreich usw.). Tabelle 2 enthält Daten zu den Ländern. In Tabelle 1 ist der ISO-Code (LandCode) der Primary Key und in Tabelle 2 ist er Foreign Key. In der Combobox möchte ich für die Auswahl LandName (Deutschland) anzeigen, aber ich benötige LandCode (DE) um in der Query der Tabelle 2 zu filtern. Mit anderen Worten, ich möchte die ISO-Codes vor dem Anwender verstecken und muß also aus LandName in der Combobox LandCode ermitteln um damit den Filter der zweiten Tabelle zu setzen. Das möchte ich, wenn möglich, ohne eine erneute Query der Art SELECT LandCode WHERE LandName = ... tun. Gibt es dafür überhaupt eine (elegante) Lösung?

Angel4585, bei der von Dir vorgeschlagenen Lösung würde der Anwender die ISO-Codes in der Combobox sehen. Das will ich gerade nicht. Ich brauche zwar LandCode zum Filtern, will aber dem Anwender LandName zur Auswahl anzeigen.

Sharky, was Du vorschlägst funktioniert bei mir nur, wenn sich die Query zu Tabelle 2 im Edit-Mode befindet. Dann läßt sich in der Combobox das Land auswählen und mit der Auswahl ändert sich der Inhalt des Foreign Key in Tabelle 2. Dies will ich gerade nicht aber vielleicht mache ich auch gerade hier etwas falsch?

Vielen Dank und beste Grüße,

Ralf Gorholt
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Filter mittels Combobox

  Alt 15. Mär 2006, 20:05
Zitat von rgorholt:
... Sharky, was Du vorschlägst funktioniert bei mir nur, wenn sich die Query zu Tabelle 2 im Edit-Mode befindet. ...
Hai Ralf,

dann haben wir uns falsch verstanden.
Ich dachte Du hast ein Query für die ComboBox (Länder) und ein anders (nicht verknüpftes) für deine zweite Tabelle.
Bei dem Beispiel von mir darf es natürlich keine Verbindung der beiden Tabellen geben.
So wie ich es gezeigt habe kannst Du "nur" auf das Ergebniss der TDBLookupCombobox zugreifen.

Fals es ein Missverständniss dieser Kompo giebt versuche ich die Funktionsweise noche inmal zu erklären:

Gegeben sind zwei Tabellen:
Code:
tbl_anrede: -> DataSet1 -> DataSource1
 id : integer;
 bezeichnung : string;

tbl_kontakt: -> DataSet2 -> DataSource2
 id : integer;
 fk_anrede_id : integer;
 name : string;
Du kannst nun diese beiden Tabellen in einer Form mit einer TDBLookupCombobox verbinden. Dabei würde in diesem Beispiel gelten:
Delphi-Quellcode:
  with DBLookupComboBox1 do
  begin
    DataSource := DataSource2; // Die "Ziel" Tabelle
    DataField := 'fk_anrede_id'; // Das Verknüpungsfeld der Ziel-Tabelle
    ListSource := DataSource1; // Die "Quell" Tabelle
    ListField := 'bezeichnung'; // Das Anzeigefeld der Quelltabelle
    KeyField := 'id'; // Das Verknüpungsfeld der Quell-Tabelle
  end;
Wenn Du nun in der TDBLookupCombobox einen Eintrag (ListField) auswählst wird die ZielTabelle in den Editmodus gesetzt und dort wird im Feld DataField der Wert von KeyField eingetragen.

Wenn Du aber die TDBLookupCombobox ohne Data* verwendest ist dies nichts anderes als eine Liste welche den Datensatzzeiger immer auf der in ListSource angegeben TDataSet hat. Und somit kannst Du genau auf diesen Eintrag zugreifen. (ähnlich als hättest Du die Daten in einem DBGrid und würdest darüber einen Datensatz auswählen.

Uff... Sorry wenn ich es nicht genau erklärt habe. Aber ich hoffe Du verstehst was ich meinte.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#6

Re: Filter mittels Combobox

  Alt 15. Mär 2006, 20:52
Eine TStringList könnte dir helfen. in Combobox.Items[i] steht dann der Ländername und in Stringlist[i] der Ländercode. Über StringList[Combobox.ItemIndex] erhälst du dann den Ländercode zum ausgewählten Ländernamen.
  Mit Zitat antworten Zitat
rgorholt
(Gast)

n/a Beiträge
 
#7

Re: Filter mittels Combobox

  Alt 16. Mär 2006, 09:22
Hallo Sharky,

Du schriebst :

Zitat:
Wenn Du aber die TDBLookupCombobox ohne Data* verwendest ist dies nichts anderes als eine Liste welche den Datensatzzeiger immer auf der in ListSource angegeben TDataSet hat.
Das ist genau das, was ich gesucht habe.

Beste Grüße und vielen Dank an alle,

Ralf Gorholt
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Filter mittels Combobox

  Alt 16. Mär 2006, 10:36
Dann ist's aber letztendlich doch einfacher über AddObject zu gehen:
Delphi-Quellcode:
//Schreiben:
ComboBox.AddObject('Deutschland', TOBject('DE'));

//Lesen:
Laendercode.AsString := String(Combobox.Objects[Combobox.ItemIndex]);
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
rgorholt
(Gast)

n/a Beiträge
 
#9

Re: Filter mittels Combobox

  Alt 16. Mär 2006, 21:02
Hallo Sharky,

ich hätte noch eine Frage: Wenn ich die TDBLookupCombobox so verwende, wie Du vorgeschlagen hast, gibt es dann eine Möglichkeit, den angezeigten Wert vorzugeben? Beim ersten Aufruf ist das Textfeld nämlich leer und ich hätte gerne entweder den ersten Datensatz der ListSource oder einen bestimmten Datensatz angezeigt. Sollte das nicht gehen, wäre ein anderer Ansatz vielleicht doch besser?

Vielen Dank für die Hilfe,

Ralf Gorholt
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz