Autor Beitrag
Melcho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 145

XP

BeitragVerfasst: Mi 21.07.04 08:32 
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: .

_________________
PCP saved my life
recall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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:
ausblenden 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):

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 145

XP

BeitragVerfasst: 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

_________________
PCP saved my life
recall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 449



BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
q1.SQL.Text := 'Select * from TEST where Upper(TYP)=''' + UpperCase(cb1.Items[cb1.ItemIndex]) + '''';					
Viele Grüsse.
Melcho Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 145

XP

BeitragVerfasst: Mi 21.07.04 14:13 
Vielen Danke für eure Hilfe das Problem ist jetzt gelöst :lol:

_________________
PCP saved my life