Entwickler-Ecke
Datenbanken - Interbase/Firebird/SQL Abfrage, geht das auch einfacher ?
funcry - Mo 27.08.07 23:43
Titel: Interbase/Firebird/SQL Abfrage, geht das auch einfacher ?
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:
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
matze: Code- durch Delphi-Tags ersetzt
hansa - 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.
mkinzler - Di 28.08.07 07:52
Oder man verwendet zumindest (SQL-)Parameter. Außerdem würde sich hier eine Master-/Detail-Verknüpfung anbieten.
Firma Saatmann - 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 - 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.
funcry - 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:
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
UGrohne: Code- durch Delphi-Tags ersetzt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!