Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zeit/Datumsabfrage mit ClientDataSet (https://www.delphipraxis.net/133140-zeit-datumsabfrage-mit-clientdataset.html)

zeras 26. Apr 2009 17:58

Datenbank: MIDAS • Zugriff über: MIDAS.DLL

Zeit/Datumsabfrage mit ClientDataSet
 
Ich habe ein Clientdataset und möchte einen Datums/Zeiteintrag ausschliessen. Leider komme ich mit der Syntax nicht hin.
Hat jemand eine Idee?

Delphi-Quellcode:
  //und auch neuen Datensatz ausschliessen
  CDS.Filter:=CDS.Filter + ' and ['+CDS.FieldDefs[IdxLetzterSchreibzugriff-1].Name+'] <> ' + QuotedStr(FormatDateTime('yyyy-mm-dd"T"hh:nn:ss.zzz',ActTime));

  //so geht es aber auch nicht
  CDS.Filter:=CDS.Filter + ' and ['+CDS.FieldDefs[IdxLetzterSchreibzugriff-1].Name+'] <> ' + QuotedStr(FormatDateTime('dd.mm.yyyy hh:nn:ss',ActTime));

MarcoWarm 27. Apr 2009 06:58

Re: Zeit/Datumsabfrage mit ClientDataSet
 
Hallo,

die Formatierung des DateTimes ist nicht korrekt. Soweit ich weiß unterstützt der SQL Syntax die Ticks nicht.
So würde es funktionieren:
Delphi-Quellcode:
FormatDateTime('yyyy-mm-dd hh:nn:ss',now)
Gruß
Marco

Stevie 27. Apr 2009 07:37

Re: Zeit/Datumsabfrage mit ClientDataSet
 
So funktioniert es zumindest bei mir, du musst aber daran denken, dass jemand, der dein Programm nutzt auf seinem Rechner eine andere Datumsformatierung eingestellt haben kann, dann kannst du es nicht hardcoded in den Filter schreiben.
Delphi-Quellcode:
CDS.Filter:=CDS.Filter + ' and ['+CDS.FieldDefs[IdxLetzterSchreibzugriff-1].Name+'] <> ' + 
  QuotedStr(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', ActTime));
Du musst auch darauf achten, dass du hier Millisekunden genau überprüfst und schon die geringste Abweichung den Datensatz nicht mehr filtert. Wenn du das nicht willst musst du den Filter anders definieren.

shmia 27. Apr 2009 18:49

Re: Zeit/Datumsabfrage mit ClientDataSet
 
Mit dem Event OnFilterRecord lässt sich das Problem wesentlich einfacher lösen.
Beispiel:
Delphi-Quellcode:
procedure TForm1.CSDatasetFilterRecord(DataSet: TDataSet; var Accept: Boolean);
const
   EINSTUNDE = 1.0/24.0;
begin
   Accept := DataSet.FieldByName('LastChange').AsDateTime < (Now - EINESTUNDE);
end;

zeras 27. Apr 2009 20:40

Re: Zeit/Datumsabfrage mit ClientDataSet
 
Danke für die Tipps. Werde das mal am Wochenende probieren. Es muss bis auf die 1/100 sek geprüft werden. Nur so kann ich rausfinden, dass der neue Datensatz nicht gleich wieder gelöscht wird. Wahrscheinlich müßte ich besser an der Struktur der DB was ändern, da diese aber schon beim Kunden läuft, ist es schlecht was zu ändern, was nicht schon in der DB enthalten ist.

zeras 1. Mai 2009 11:23

Re: Zeit/Datumsabfrage mit ClientDataSet
 
Zitat:

Zitat von Stevie
So funktioniert es zumindest bei mir, du musst aber daran denken, dass jemand, der dein Programm nutzt auf seinem Rechner eine andere Datumsformatierung eingestellt haben kann, dann kannst du es nicht hardcoded in den Filter schreiben.
Delphi-Quellcode:
CDS.Filter:=CDS.Filter + ' and ['+CDS.FieldDefs[IdxLetzterSchreibzugriff-1].Name+'] <> ' + 
  QuotedStr(FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', ActTime));
Du musst auch darauf achten, dass du hier Millisekunden genau überprüfst und schon die geringste Abweichung den Datensatz nicht mehr filtert. Wenn du das nicht willst musst du den Filter anders definieren.

Habe ich gerade ausprobiert. Es kommt eine Fehlermeldung EVariantType Cast Error mit Meldung Variante des Typs (OleStr) konnte nicht in Type (Date) konvertiert werden.

Wenn ich ohne Millisekunden abfrage, kommt zwar keine Fehlermeldung, aber der gewisse Eintrag wird auch nicht ausgefiltert.

Ich werde nun mal die Lösung von shmia ausprobieren.

Vielleicht sollte ich später doch auf eine DB wie Firebird gehen, da kann ich bestimmt besser filtern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr.

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