Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Filter geht nicht (https://www.delphipraxis.net/202104-filter-geht-nicht.html)

AnonyM.E 28. Sep 2019 22:19

Datenbank: SQLite • Version: 3 • Zugriff über: delphi

Filter geht nicht
 
Hallo zusammen,

Der folgende Code filtert irgendwie nicht und ich habe keine Idee mehr, warum der Filter nicht funktioniert.

Code:
    // Saldo bestimmen
      if not FDTableJournal6.Active then
        FDTableJournal6.Active := True;
      FDTableJournal6.Filter := 'zeitpunkt > ' + QuotedStr(DateTimeToStr(ZeitraumVon)) + ' and ' +
                                'zeitpunkt <= ' + QuotedStr(DateTimeToStr(ZeitraumBis)) + '';
      FDTableJournal6.Filtered := True;
      FDTableJournal6.Refresh;
      FDTableJournal6.First;
      //Button_zurück.Text := IntToStr(FDTableJournal6.RecordCount);
      while not FDTableJournal6.Eof do begin
        Saldo := Saldo + FDTableJournal6.FieldByName('preisgesamt'). AsFloat;
        FDTableJournal6.Next;
      end;
FDTableJournal6.Filter ist:
zeitpunkt > '28.09.2019 04:00:00' and zeitpunkt <= '29.09.2019 04:00:00'

zeitpunkt in der Tabelle ist vom Typ Timestamp

In der Tabelle ist definitiv ein Wert
2019-09-28 21:48:08.708
enthalten

In RecordCount sind immer 0 Elemente. Ich verstehe den Grund nicht :|

Es ist eine SQLite-Datenbank und ich benutze Delphi 10.3

In einer anderen Tabelle funktioniert der Filter.

Hat jemand eine Idee?

Danke! :?

haentschman 29. Sep 2019 07:09

AW: Filter geht nicht
 
Moin...:P
Dein Problem hat mehrere Ursachen. :stupid:

1. Kein Mensch mehr benutzt TTable (oder die Equivalente). Bei einer Tabelle werden immer ALLE Daten geladen. Das mag am Anfang funktionieren, je mehr Daten du hast, wird es immer langsamer. :?
2. Benutze immer eine Query. Da holst du nur die Daten die du auch benötigst. :thumb:
3. Bei einer Query benutze immer Parameter!
4. Tu dir selbst einen Gefallen, und benutze sprechende Namen für Variablen, Komponenten und Felder in englisch. :zwinker: Wenn du mal in einem Team arbeiten solltest, mußt du dich nicht umgewöhnen. :wink:
Delphi-Quellcode:
// Saldo bestimmen
FDQuery.SQL.Text := 'select Price from PriceTable where PriceDate between :DAF and :DAT';
FDQuery.ParamByName('DAF').AsDateTime := DateFrom; // direkt als Date ohne Konvertierung
FDQuery.ParamByName('DAT').AsDateTime := DateTo; // Ich hoffe nur, daß dein Feld in der Datenbank auch DateTime ist.
FDQuery.Open;

while not FDQuery.Eof do
begin
  Saldo := Saldo + FDQuery.FieldByName('Price').AsFloat;
  FDQuery.Next;
end;
PS: Da ich ohne Filter arbeite, kann ich nur raten. Das Problem liegt mit Sicherheit an der "Konvertierung" der DateTime Daten im Filterstring. Mit Parametern hast du das nicht.

p80286 29. Sep 2019 10:05

AW: Filter geht nicht
 
Zitat:

Zitat von AnonyM.E (Beitrag 1448303)
FDTableJournal6.Filter ist:
zeitpunkt > '28.09.2019 04:00:00' and zeitpunkt <= '29.09.2019 04:00:00'


In der Tabelle ist definitiv ein Wert
2019-09-28 21:48:08.708
enthalten

Was ist denn jetzt dasrichtige Format?

Ansonsten siehe Haentschmann!

Gruß
K-H

Frickler 30. Sep 2019 10:16

AW: Filter geht nicht
 
Ergänzend zu den Ausführungen von haentschman: warum lässt Du nicht die Datenbank das Aufsummieren erledigen?
Delphi-Quellcode:
// Saldo bestimmen
FDQuery.SQL.Text := 'select SUM(Price) AS Saldo from PriceTable where PriceDate between :DAF and :DAT';
FDQuery.ParamByName('DAF').AsDateTime := DateFrom; // direkt als Date ohne Konvertierung
FDQuery.ParamByName('DAT').AsDateTime := DateTo; // Ich hoffe nur, daß dein Feld in der Datenbank auch DateTime ist.
FDQuery.Open;

Saldo := FDQuery.FieldByName('Saldo').AsFloat;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz