Autor Beitrag
cyberax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Di 27.01.09 16:56 
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:
ausblenden volle Höhe 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:
// 1. KEINES der Felder hat Inhalt
  if (edit1.Text='') and (edit2.Text='')and (edit3.Text='') then begin
   sql.Text:='Select * from kasse_view_rechnung';
   open;
   exit;
  end;

// 2. nur EINES der Felder hat Inhalt
  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;//nur EINES der Felder hat Inhalt

// 3. zwei der Felder haben Inhalt
  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;
  //nur EINES der Felder hat Inhalt
  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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: 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?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  S:String;
{...}
S:='SELECT * FROM kasse_view_rechnung';
//Es existiert überhaupt ein Eintrag, also WHERE dranhängen !mit Leerzeichen!
if (Edit1.Text<>'') OR (Edit2.Text<>'') OR (Edit3.Text<>'') then
  S:= S + 'WHERE ';
//Jedes Editfeld durchgehen
if Edit1.Text<>'' then
  S:= S + '(renr like :wertrenr) ';
{... usw.}
//Und dann zum Schluss alle Werte zuweisen!

Wie wäre der Vorschlag?
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 27.01.09 17:33 
user profile iconcyberax hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Di 27.01.09 17:47 
Funktioniert! :)

Hier nochmal der vollst. Code für diese Abfrage:

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:
S:='SELECT * FROM kasse_view_rechnung';
//Es existiert überhaupt ein Eintrag, also WHERE dranhängen !mit Leerzeichen!
if (Edit1.Text<>'') OR (Edit2.Text<>'') OR (Edit3.Text<>'') then
  S:= S + ' WHERE ';
//Jedes Editfeld durchgehen
 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;

//Und dann zum Schluss alle Werte zuweisen!
 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 27.01.09 17:49 
user profile iconcyberax hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 27.01.09 18:08 
user profile iconcyberax hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Di 27.01.09 18:22 
Also entweder ich steh grad völlig auf dem Schlauch, oder keine Ahnung...

Du meinst doch diesen Bereich:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Di 27.01.09 18:31 
user profile iconcyberax hat folgendes geschrieben Zum zitierten Posting springen:
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.