Entwickler-Ecke

Datenbanken - Combobox Datenbank


Melcho - Mi 21.07.04 08:32
Titel: Combobox Datenbank
Morgen ich wollte mal was fragen,
ich habe folgendes Problem:

Ich habe eine Combobox und eine Datenbank :D ,
In der Datenbank gibt es eine Spalte "Typ" und in der Combobox stehen die verfügbaren Typen aber noch nicht über die Datenbank reingeschrieben sondern über die Eigenschaft Items.
Dann soll man sich denn gewünschten Typen aussuchen und dann sollen alle Datensätze mit dem ausgewählten Typ in einem DBGrid angezeigt werden.

Wäre schön wenn ihr mir schnell helft :nixweiss: .

Danke im voraus :flehan: .


recall - Mi 21.07.04 09:14

hallo,

etwas spärliche Informationen, aber gut. Nehmen wir an, die Tabelle heisst TEST, das DBGrid ist mit der Query q1 (über ein DataSource) verbunden. Die ComboBox heisst cb1.

In das OnChange-Ereignis von der ComboBox schreibst du:

Delphi-Quelltext
1:
2:
3:
4:
if q1.Active then q1.Close;
q1.SQL.Text := 'Select * from TEST where TYP=:p1';
q1.ParamByName('p1').AsString := cb1.Items[cb1.ItemIndex];
q1.Open;


Du solltest dir allerdings in q1 das Update, Insert und Delete-SQL mit dem SQL-Generator erstellen lassen und zwar indem du zuerst das Statement "Select * from TEST" in die Query schreibst und dann auf GenerateSQL klickst (ich hoffe du weisst wie das geht, sonst nachfragen :) ).

Viele Grüsse.


P.S.: Wie du alle verfügbaren Typen in die ComboBox kriegst (neue Query q2):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
if q2.Active then q2.Close;
q2.SQL.Text := 'Select distinct(TYP) from TEST';
  // distinct sorgt dafür, dass keine doppelten Einträge  zurückkommen.
  // allerdings sollte man distinct nicht bei großen Tabellen verwenden,
  // denn dann wird der Index nicht verwendet.
q2.Open;
cb1.Clear;
While not q2.Eof do
begin
  cb1.Items.Add(q2.Fields[0].AsString);
  q2.Next;
end;
q2.Close;


Wenn du allerdings eine größere Tabelle hast, dann würde ich eher eine zusätzliche Tabelle anlegen, in der alle Typen aufgelistet sind (und zwar jeder nur einmal). Sag mal: Welche Datenbank nutzt du ???


Melcho - Mi 21.07.04 09:27

Danke dir :lol: :lol: :lol: !

Ich werds gleich mal ausprobieren,
ich nutze MYSQL.

Aber was bedeutet q1.ParamByName('p1').AsString := cb1.Items[cb1.ItemIndex];


ParamByName <-- das kennt er garnicht


recall - Mi 21.07.04 12:09

Wenn du in ein SQL-Statement ":irgendwas" schreibst, dann ist "irgendwas" ein Parameter. Diesen kannst du dann mit einem Wert füllen (über ParamByName). Du kannst aber auch direkt schreiben:

Delphi-Quelltext
1:
q1.SQL.Text := 'Select * from TEST where TYP=''' + cb1.Items[cb1.ItemIndex] + '''';                    
Das hat manchmal geringe Performance-Nachteile, aber sonst ist das OK. Aber sag mal, welche Komponenten nutzt du für den DB-Zugriff, denn die kennen meines Wissens alle "ParamByName" !? Übrigens: Die Datenbank unterscheidet Groß- und Kleinschreibung ! also besser:

Delphi-Quelltext
1:
q1.SQL.Text := 'Select * from TEST where Upper(TYP)=''' + UpperCase(cb1.Items[cb1.ItemIndex]) + '''';                    
Viele Grüsse.


Melcho - Mi 21.07.04 14:13

Vielen Danke für eure Hilfe das Problem ist jetzt gelöst :lol: