Autor Beitrag
Josef-B
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: Di 10.05.05 10:23 
Ich möchte eine Tabelle mit einer Auftrags-Historie filtern:

Nach z.B. Kunde,
Rechnungs-Nummer,
Artikel,
Feld X,
Feld y,

Ich hab keinen so richtigen Plan, wie man das am besten macht z.B.

ausblenden Delphi-Quelltext
1:
2:
3:
'Select * from auftrag where Kunde = ' + quotedstr(edit1.text) +
' and Rechnungs-Nummer = ' + edit2.text +
' and Artikel = ' + quotedstr(edit3.text) + ......


Was ist jetzt wenn edit2.text = '' also nix eingegeben wurde, weil man z.B. alle Rechnungen des Kunden als Ergebnis haben will?

Kann man das besser mit OnFilterRecord machen? und wie geht das dann genau?
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Di 10.05.05 13:22 
ich würde es etwa so machen:

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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
procedure TAbfrageForm.SchreibeAbfrageQueryText;
var s,sE:String;
    bErste: boolean;
    startDatum, endDatum :String;
    i:integer;
begin

  with AbfrageQuery do
  begin
    close;
    SQL.Clear;
    SQL.Add('SELECT * ' +
            'FROM Datenbank A ');        
                                        
    bErste := false;

    (* prüfen ob Nummer abgefragt werden soll *)
    (*    * -> %  ,  ? -> _   *)

    if Edit1.Text <>'' then
    begin
      sE := Edit1.Text;
      s :='WHERE (UPPER(A.Nummer) LIKE ("'+AnsiUpperCase(sE) +'")) ';
      SQL.Add(s);

      bErste := true;
    end;


    (* Edit2 *)
    if (Edit2.text <> ''then
    begin
      if bErste=false then s:='WHERE '
                      else s:=' AND ';
      sE := Edit2.Text;
      s := s + 'UPPER(A.Status) LIKE "'+AnsiUpperCase(sE) +'" ' ;    
      SQL.Add(s);
                            
      bErste := true;
    end;


    (* prüfen ob Datum abgefragt werden soll *)
    (* if DatumCheckBox.checked then *)
    begin
      if bErste=false then s:='WHERE '
                      else s:=' AND ';

      startDatum := KonvertDatum(vonTagCB.Text, vonMonatCB.Text, vonJahrCB.text);
      endDatum   := KonvertDatum(nachTagCB.Text, nachMonatCB.Text, nachJahrCB.text);

      if (Pos('erfaßt',StatusComboBox.Text)>0or (Pos('Stati',StatusComboBox.Text)>0)
        then begin
               s := s + '(A.Datum BETWEEN "' + startDatum +'" AND "' + endDatum +'")';
             end
       

      SQL.Add(s);
      bErste := true;
    end;

    ...
    
  end;
end;



Gruß Andreas
Josef-B Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 293

2003 Server, Win7, Win8
Delphi 2010 Pro, Firebird 2.5
BeitragVerfasst: Di 10.05.05 13:41 
Ja so gehts wohl, hatte mir auch schon so ähnliche Gedanken gemacht. Auf die Sache mit BErste war ich nicht gekommen.


Kannst Du mir nochmal sagen, was das für Variablen hier bei dem Datum sind? Ist TAGCB.Text ein edit-Feld?

Und konvertDatum?

ausblenden Delphi-Quelltext
1:
endDatum   := KonvertDatum(nachTagCB.Text, nachMonatCB.Text, nachJahrCB.text);					


Danke. Josef
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Di 10.05.05 14:47 
meine Datum Felder sin von TCombox;
es sind Zahlen (besser, Ziffern als String)

meine Funktion

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Function KonvertDatum(Tag, Monat, Jahr:String):String;
begin
  try
    result := Monat + '/' + Tag + '/' + Jahr;  (* 12/30/2020 *)
  except                                       (* 1/1/2020   *)
    result := '';                              
  end;
end;