Entwickler-Ecke
Datenbanken - Mysql Abfrage mit leeren Integer Feldern besser gestalten
cyberax - Di 27.01.09 16:56
Titel: Mysql Abfrage mit leeren Integer Feldern besser gestalten
Hallo,
ich habe ein Form auf dem man nach Rechnungen Suchen kann. Diese werden durch ein VIEW dargestellt.
Nun habe ich drei (sollen evtl. noch mehr werden) Suchfelder:
- Edit1 -> Rechnungsnummer
- Edit2 -> Kundennummer
- Edit3 -> Kundenname
Leider funkt. das ganze nur sehr umständlich. Hier mein akt. Code:
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: 30: 31: 32: 33: 34: 35: 36: 37:
| if (edit1.Text='') and (edit2.Text='')and (edit3.Text='') then begin sql.Text:='Select * from kasse_view_rechnung'; open; exit; end;
if ((edit1.Text<>'') and (edit2.Text='')and (edit3.Text='')) or ((edit1.Text='') and (edit2.Text<>'')and (edit3.Text='')) or ((edit1.Text='') and (edit2.Text='')and (edit3.Text<>'')) then begin sql.Text:='Select * from kasse_view_rechnung where (renr like :wertrenr) or (kdnr like :wertkdnr) or (kunden_name like :wertkdname)';
if edit1.Text<>'' then parambyname('wertrenr').Asstring := edit1.Text+'%' else parambyname('wertrenr').Asstring := edit1.Text; if edit2.Text<>'' then parambyname('wertkdnr').Asstring := edit2.Text + '%' else parambyname('wertkdnr').Asstring := edit2.Text; if edit3.Text<>'' then parambyname('wertkdname').Asstring := edit3.Text+'%' else parambyname('wertkdname').Asstring := edit3.Text; open; exit; end; if ((edit1.Text<>'') and (edit2.Text<>'')and (edit3.Text='')) then sql.Text:='Select * from kasse_view_rechnung where (renr like :wertrenr) and (kdnr like :wertkdnr) or (kunden_name like :wertkdname)'; if ((edit1.Text<>'') and (edit2.Text='')and (edit3.Text<>'')) then sql.Text:='Select * from kasse_view_rechnung where (renr like :wertrenr) and (kunden_name like :wertkdname) OR (kdnr like :wertkdnr)'; if ((edit1.Text='') and (edit2.Text<>'')and (edit3.Text<>'')) then sql.Text:='Select * from kasse_view_rechnung where (renr like :wertrenr) OR (kdnr like :wertkdnr) AND (kunden_name like :wertkdname)'; if edit1.Text<>'' then parambyname('wertrenr').Asstring := edit1.Text+'%' else parambyname('wertrenr').Asstring := edit1.Text; if edit2.Text<>'' then parambyname('wertkdnr').Asstring := edit2.Text + '%' else parambyname('wertkdnr').Asstring := edit2.Text; if edit3.Text<>'' then parambyname('wertkdname').Asstring := edit3.Text+'%' else parambyname('wertkdname').Asstring := edit3.Text; open; |
Ist so natürlich nicht schön. Wenn ich die Rechnungsnummer außen vor lasse, funktioniert alles einwandfrei.
Wenn ich ansonsten das ganze nicht wie oben aufbau, dann wird entweder gar nix angezeigt, wenn alle Suchfelder leer sind, oder es wird nix angezeigt, wenn ich eines oder mehrere Felder ausfülle.
Was mache ich hier falsch??
P.S.: renr und kdnr sind INTEGER und kunden_name ist VARCHAR
Danke schonmal für Hilfen und Tips.
Gruß Cyberax
Regan - Di 27.01.09 17:08
Nur eine kurze Frage am Rande: Warum setzt du dir den
WHERE-Clause nicht einfach in einem zusätzlichen String zusammen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var S:String;
S:='SELECT * FROM kasse_view_rechnung'; if (Edit1.Text<>'') OR (Edit2.Text<>'') OR (Edit3.Text<>'') then S:= S + 'WHERE '; if Edit1.Text<>'' then S:= S + '(renr like :wertrenr) ';
|
Wie wäre der Vorschlag?
cyberax - Di 27.01.09 17:14
Gute Idee, nur dann habe ich immer noch das Problem mit "AND" und "OR"..... Denn immer "AND" geht nicht und immer "OR" auch nicht....
Regan - Di 27.01.09 17:33
cyberax hat folgendes geschrieben : |
| Gute Idee, nur dann habe ich immer noch das Problem mit "AND" und "OR"..... Denn immer "AND" geht nicht und immer "OR" auch nicht.... |
Probier es doch einfach mal mit immer
AND. Dazu musst du nur prüfen, ob das vorherige Feld auch gesetzt wurde, also z.B. so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if Edit2.Text<>'' then begin if Edit1.Text<>'' then S:= S + 'AND '; S:= S + '(renr like :wertrenr) '; end; |
Ich glaube das sollte auch so gehen.
cyberax - Di 27.01.09 17:47
Funktioniert! :)
Hier nochmal der vollst. Code für diese Abfrage:
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:
| S:='SELECT * FROM kasse_view_rechnung'; if (Edit1.Text<>'') OR (Edit2.Text<>'') OR (Edit3.Text<>'') then S:= S + ' WHERE '; if Edit1.Text<>'' then S:= S + '(renr like :wertrenr)';
if Edit2.Text<>'' then begin if Edit1.Text<>'' then S:= S + ' AND '; S:= S + '(kdnr like :wertkdnr)'; end; if Edit3.Text<>'' then begin if (Edit2.Text<>'')or (Edit1.Text<>'') then S:= S + ' AND '; S:= S + '(kunden_name like :wertkdname)'; end;
Query_re_suche.sql.text:=s; if Edit1.Text<>'' then Query_re_suche.parambyname('wertrenr').Asstring := edit1.Text+'%'; if Edit2.Text<>'' then Query_re_suche.parambyname('wertkdnr').Asstring := edit2.Text+'%'; if Edit3.Text<>'' then Query_re_suche.parambyname('wertkdname').Asstring := edit3.Text+'%'; |
Vielen Dank für deine Hilfe!
Gruß Cyberax
Regan - Di 27.01.09 17:49
cyberax hat folgendes geschrieben : |
| Funktioniert! :) |
Ich kann dir auch sagen, warum: In der letzten Abfrage verbindest du mit dem
OR den Wert der Editfelder, der nicht gesetzt ist. Folglich kann der auch rausfallen ;) .
cyberax - Di 27.01.09 18:02
| Zitat: |
| Ich kann dir auch sagen, warum: In der letzten Abfrage verbindest du mit dem OR den Wert der Editfelder, der nicht gesetzt ist. Folglich kann der auch rausfallen . |
Na dort muss ich doch mit OR arbeiten. Versteh nicht ganz, was du damit meinst....
Regan - Di 27.01.09 18:08
cyberax hat folgendes geschrieben : |
| Zitat: | | Ich kann dir auch sagen, warum: In der letzten Abfrage verbindest du mit dem OR den Wert der Editfelder, der nicht gesetzt ist. Folglich kann der auch rausfallen . |
Na dort muss ich doch mit OR arbeiten. Versteh nicht ganz, was du damit meinst.... |
Nein, du kannst das ganze völlig weglassen, weil der Parameter nie überprüft wird, weil z.B. in der ersten Abfrage das erste Feld ja leer ist.
cyberax - Di 27.01.09 18:22
Also entweder ich steh grad völlig auf dem Schlauch, oder keine Ahnung...
Du meinst doch diesen Bereich:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if Edit3.Text<>'' then begin if (Edit2.Text<>'')or (Edit1.Text<>'') then S:= S + ' AND '; S:= S + '(kunden_name like :wertkdname)'; end; |
Der s wird gesetzt, wenn zum Beispiel NUR edit3 einen Wert hat.
Hat außerdem Edit1 ODER Edit2 einen Wert kommt außerdem noch ein "AND" dazu.
Wieso sollte ich den Teil weglassen können?? Also habe auch im Programm alle Varianten getestet. -> Funktioniert einwandfrei.
Regan - Di 27.01.09 18:31
cyberax hat folgendes geschrieben : |
| Wieso sollte ich den Teil weglassen können?? Also habe auch im Programm alle Varianten getestet. -> Funktioniert einwandfrei. |
Ich meinte noch deinen alten Quelltext :wink: . Aber wenn es geht, ist doch alles prima.
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!