Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mo 27.08.07 23:43 
Folgende Problemstellung habe ich - recht unschön - gelöst:

Es gibt 3 Auswahlfelder (ComboBoxen):

Marke (z.B. BMW, Toyota, etc.)
Typ (z.B. SUV, Karavan, NULL, etc.)
Anz_Tueren (z.B. 4, 5, NULL)

Der Anwender soll aus den drei ComboBoxen auswählen, und das Ergebnis im Grid angezeigt bekommen, also z.B. alle BMW mit 5 Türen. In den Comboboxen stehen jeweils alle Eintragungen, z.B. alle Auto-Marken in CBMarke. Die vom benutzer ausgewählte Marke ist dann Marke (=CBMarke.Text).

Die Frage die ich habe ist, ob man das nicht eleganter lösen könnte. Hier mein derzeitiger Ansatz:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
var
  Marke, Typ, Anz_Tueren: String;

begin
  Marke:=UID.CBMarke.Text;
  Typ:=UID.CBTyp.Text;
  Anz_Tueren:=UID.CBAnz_Tueren.Text;

  DM.IBDS_Grid.Close;
  DM.IBDS_Grid.SelectSQL.Clear;
  DM.IBDS_Grid.SelectSQL.Add('SELECT * FROM VMZ');
  if ((Marke <> '') or (Typ <> '') or (Nummer <> '')) then DM.IBDS_Grid.SelectSQL.Add('WHERE');

  if (Marke <> '') then
  begin
    DM.IBDS_Grid.SelectSQL.Add('MARKE= '''+Marke+'''');
    if ((Typ <> '') or (Anz_Tueren <> '')) then DM.IBDS_Grid.SelectSQL.Add('and');
  end;

  if (Typ <> '') then
  begin
    DM.IBDS_Grid.SelectSQL.Add('Typ= '''+Typ+'''');
    if (Anz_Tueren <> '') then DM.IBDS_Grid.SelectSQL.Add('and');
  end;

  if (Anz_Tueren <> '') then DM.IBDS_Grid.SelectSQL.Add('ANZ_Tueren= '+Anz_Tueren+'');

  DM.IBDS_Grid.Open;
end;


Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 28.08.07 00:41 
Hinterlege diese Sachen in einer stored procedure der Datenbank. Übergebe dann im Delphi-Programm nur die Parameter. Ich will darauf hinaus, dass diese SQL-Strings nicht im Programm zusammengebaut werden, sondern direkt von der DB geliefert werden. D.h. das Zusammensuchen der Daten geschieht auf DB - Seite und der User sagt lediglich, was er genau will. Das wäre dann Delphi-Sache.

_________________
Gruß
Hansa
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 28.08.07 07:52 
Oder man verwendet zumindest (SQL-)Parameter. Außerdem würde sich hier eine Master-/Detail-Verknüpfung anbieten.

_________________
Markus Kinzler.
Firma Saatmann
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.09.07 12:35 
Die drei Tabellen dürften sich wohl recht selten ändern, die ComboBoxen jedoch sehr häufig angefasst werden. Außerdem sind diese Tabellen überschaubar groß. Somit würde ich das in ClientDatasets laden und nicht jedesmal den Server damit belästigen.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 03.09.07 13:15 
Sollte sich nichts ändern, dann braucht er auch kein ClientDataSet. Auch das muss irgendwo die Daten herbekommen. Dann soll er beim Programmstart eine Stringliste füllen und dies für die Comboboxen benutzen. Die Vermutung, dass sich nichts ändert führt aber IMHO ziemlich an der Frage vorbei, sieht man sich mal seinen SQL-Quelltext an.

_________________
Gruß
Hansa
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mo 10.09.07 12:59 
Danke für die Antworten. Ich habe inzwischen dank der Hinweise eine Lösung gefunden, die vorallem auf drei einzelne Tabellen setzt, welche über die eindeutlige ID mit der Haupt-Tabelle verknüpft sind. Zusätzlich habe ich bei den SQL-Befehlen das "and" jeweils vorne plaziert , so dass diese sich leichter verknüpfen liesen. Zuletzt habe ich die Dataset-Komponente durch ein IBQuery ersetzt. Das Resultat sieht jetzt so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
DM.IBQuery_Grid.SQL.Add('SELECT A3.ID, A1.MARKE, A2.ANZAHL_TUEREN');
DM.IBQuery_Grid.SQL.Add('FROM MARKEN A1, TUEREN A2, TYPEN A3');
DM.IBQuery_Grid.SQL.Add('WHERE');
DM.IBQuery_Grid.SQL.Add('A3.ID_MARKE = A1.ID AND');
DM.IBQuery_Grid.SQL.Add('A3.ID_ANZAHL_TUEREN = A2.ID');

if MARKE <> '' then DM.IBQuery_Grid.SQL.Add('AND A1.MARKE = '''+MARKE+'''');
if ANZAHL_TUEREN <> '' then DM.IBQuery_Grid.SQL.Add('AND A2.ANZAHL_TUEREN = '''+ANZAHL_TUEREN+'''');
if TYP <> '' then DM.IBQuery_Grid.SQL.Add('AND A3.TYP = '''+TYP+'''');


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt