Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi DateTimePicker (https://www.delphipraxis.net/193929-datetimepicker.html)

Luca Haas 25. Sep 2017 08:54

DateTimePicker
 
Hallo Leute,

und zwar habe ich folgendes Problem:

ich habe eine Tabelle in einem DBGrid und möchte mithilfe von zwei DateTimePickern (einer für den ersten Tag und einer für den Letzten) in meinem DBGrid filtern, dass nurnoch die Daten angezeigt werden, die im DBGrid so vorkommen. Ich versuche das ganze über ein OnChange Ereignis zu machen, weiß aber nicht so richtig, wie ich auf die Spalte Datum aus meinem Grid zugreifen kann.

Also beispielsweise sollen wenn die DateTimePicker auf 01.01.2017 und 31.01.2017 stehen sollen alle Ergebnisse aus dem Januar angezeigt werden

hhcm 25. Sep 2017 10:04

AW: DateTimePicker
 
Hallo,

du musst das dazugehörige Query. bzw. Table nutzen um die Daten zu filtern, nicht das DBGrid selbst.

rokli 25. Sep 2017 11:02

AW: DateTimePicker
 
Moin,

was für eine Datenbank setzt Du denn ein?

Der Ablauf könnte so aussehen

1. DB schließen
2. neues SQL Statement mit den neuen Tages-Grenzen
3. DB wieder öffnen

und das ganz z. B. wenn der zweite DataTimePicker geändert wurde.

Luca Haas 25. Sep 2017 11:03

AW: DateTimePicker
 
Okay ich versuche das ganze jetzt so:
Delphi-Quellcode:
procedure TForm1.DateTimePicker3Change(Sender: TObject);
begin
  if CheckBox1.Checked = True then
    KST_LagerbewertungQuery.SQL := ('SELECT * FROM KST_Lagerbewertung' +
      'WHERE ''SollGeliefert'' BETWEEN DateTimePicker3 AND DateTimePicker4')
  else
    KST_LagerbewertungQuery.SQL := ('SELECT * FROM KST_Lagerbewertung' +
      'WHERE ''IstGeliefert'' BETWEEN DateTimePicker3 AND DateTimePicker4')
end;

procedure TForm1.DateTimePicker4Change(Sender: TObject);
begin
  if CheckBox1.Checked = True then
    KST_LagerbewertungQuery.SQL := ('SELECT * FROM KST_Lagerbewertung' +
      'WHERE ''SollGeliefert'' BETWEEN DateTimePicker3 AND DateTimePicker4')
  else
    KST_LagerbewertungQuery.SQL := ('SELECT * FROM KST_Lagerbewertung' +
      'WHERE ''IstGeliefert'' BETWEEN DateTimePicker3 AND DateTimePicker4')
end;
aber ich bekomme die Fehlermeldung
Code:
[dcc32 Fehler] Unit1.pas(161): E2010 Inkompatible Typen: 'TStrings' und 'string'
in den Zeilen mit else und end;

Luca Haas 25. Sep 2017 11:06

AW: DateTimePicker
 
@rokli ich benutze MS SQL

oh ich habe ganz vergessen zu schreiben, dass ich eine Checkbox habe, die je nachdem was ausgewählt eine Spalte in der Tabelle sucht also "IstGeliefert" und "SollGeliefert", welche ebenfalls beide DateTimePicker sind

mikhal 25. Sep 2017 11:19

AW: DateTimePicker
 
Zwei Dinge:
  1. Benutze Parameter
  2. Übergebe nicht den Namen der DateTimePicker sondern den Wert der Komponente (z.B. Date)

Ich habe jetzt nicht die Syntax des MS SQL Servers im Kopf, also ohne Gewähr der Vollständigkeit:
Delphi-Quellcode:
KST_LagerbewertungQuery.SQL := 'SELECT * FROM KST_Lagerbewertung' +
       'WHERE ''SollGeliefert'' BETWEEN :Picker3 AND :Picker4';
KST_LagerbewertungQuery.ParamByName('Picker3').AsDateTime := DateTimePicker3.Date;
KST_LagerbewertungQuery.ParamByName('Picker4).AsDateTime := DateTimePicker4Date;
Möglicherweise musst du vor der Nutzung der Parameter noch den Typ festlegen.

Grüße
Mikhal

Luca Haas 25. Sep 2017 11:29

AW: DateTimePicker
 
Danke Mikhal,

ich musste noch, wie du dachtest, die Typen der Parameter festlegen und dann klappte es.

rokli 25. Sep 2017 11:39

AW: DateTimePicker
 
sehr hübsch, dass das jetzt klappt :)

galex9 25. Sep 2017 17:15

AW: DateTimePicker
 
Hallo,
ist es nicht einfacher Filter zu nutzen?

Code:
KST_LagerbewertungQuery.Filter:= 'SollGeliefert <= '
  + QuotedStr(DateToStr(DateTimePicker3.Date))
  + ' and SollGeliefert <= ' + QuotedStr(DateToStr(DateTimePicker4.Date));
KST_LagerbewertungQuery.Filtered := True;
Dann musst du die Daten nicht noch mal von DB holen.

Gruß
Galex

mikhal 26. Sep 2017 08:31

AW: DateTimePicker
 
Du musst zwar nicht die Daten erneut von der Datenbank abrufen, aber es gibt da wieder andere Probleme:
  • Filtern funktioniert nur, wenn eine vollständige Datenmenge im Vorfeld abgerufen wurde, weil es sich um eine lokale Filterung handelt. Aber wer ruft im Extremfall schon Tausende, wenn nicht Millionen Datensätze ab?
  • Die Darstellung des Datums ist von Datenbank zu Datenbank verschieden, beim SQL Server, wenn ich mich irre, mm/dd/yyyy. In deinem Beispiel klappt das schon nicht mehr!

Grüße
Mikhal


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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