Autor Beitrag
flowstar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 123

WinME
D6 Enterprise
BeitragVerfasst: Mi 21.07.04 16:39 
Hallo,

ich habe eine Datenbank, die ich nach Datum Filtern möchte. Einen Filter direkt mit 'Tabelle.Filter := '...';' zu machen ist in diesem Fall sehr kompliziert.
Ich habe nun einfach eine "If-Abfrage" eingebaut.
Hier mal ein Stück Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
while not Tabelle.EOF do
begin
  if Tabelle.FieldByName('Datum').AsDateTime > StartDatum then
  begin
     .... usw.
  end;
  Tabelle.Next;
end;

Jetzt die Frage:
Ab wievielen datensätzen kann ich so Geschwindigkeitsprobleme bekommen? Macht es überhaupt zeitlich einen Unterschied? Es kann sein, dass die Tabelle mehrere 100 Datensätze hat.
Danke
neojones
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 1



BeitragVerfasst: Mi 21.07.04 16:43 
Wo ist das Problem mit einem Filter?
Ja, es macht einen Unterschied. Benutzt Du einen Filter baut der Datenbanksocket die (gefilterte) Ergebnismenge und sendet Sie dem Client. Nutzt Du die Schleife baut er die ungefilterte Datenmenge auf und sendet sie dem Client und dann gehst Du jeden Datensatz durch, belastet also zusätzlich noch den Client.

Auffallen kann das schon bei 2 Datensätzen. Denn ob in der gefilterten Datenmenge kein Datensatz zurückgegeben wird oder ungefiltert zwei is schon ein Unterschied.

_________________
Ha! Es compiliert! Wir können ausliefern!
flowstar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 123

WinME
D6 Enterprise
BeitragVerfasst: Mi 21.07.04 16:57 
hab ich mir fast gedacht.
Ich kann nicht einfach Filtern, da das Datum nur ein Lookup Feld ist und ich nicht weiß, wie man danach filtert.
Bulvaye
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37

Windows Xp
Delphi 7 Enterprise
BeitragVerfasst: Mi 21.07.04 22:31 
Du kannst alternativ das OnFilterRecord-Event des TDataset nutzen, also etwa wie folgt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept := Tabelle.FieldByName('Datum').AsDateTime > StartDatum;
end;

Ich weiß nicht, mit was für einer Datenbank Du arbeitest, aber besser wäre wahrscheinlich, ein entsprechendes SQL-Statement zu formulieren und eine Query zu öffnen - aber bei ein paar 100 Datensätzen wird das wahrscheinlich eh keinen großen Unterschied machen. Davon abgesehen verstehe ich nicht ganz, warum Du keine Filterbedingung "Datum > Startdatum" direkt verwenden kannst. Sollte doch problemlos gehen.

Grüße

_________________
Gesegnet ist, dessen Geist zu klein für jedweden Zweifel ist.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 22.07.04 03:42 
Priobleme bei den Filterbedingungen machen die Datumswerte insofern, als dass das Format sehr stark vom Datenbanksystem abhängt.

Wenn die BDE 'Datum > ''01.01.2004''' annimmt, erhällt man bei Access (über ADO) witzige Effekte (Datumsseriennummer > 112004 :-D). Von daher würd ich (für große Datenmengen oder bei notwendiger Performance) zu einer Query neigen und diese mit:

SELECT * FROM Table WHERE Datum > :Startdatum

füttern.

Das Startdatum legst du dann mit

Query.Params\Parameters*.ParamByName('Startdatum').AsDateTime := Wert;

fest.

*Bei BDE Params, bei ADO Parameters

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.