Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Auslesen von Daten / Rechnung mit Datum (https://www.delphipraxis.net/203664-auslesen-von-daten-rechnung-mit-datum.html)

ironman139 9. Mär 2020 23:25

Auslesen von Daten / Rechnung mit Datum
 
Abend zusammen,

Ich programmier schon länger an einer Auftragsverwaltungssoftware für unseren Betrieb.
Funktioniert eigentlich recht gut.
In einer SQL Datenbank werden diverse Infos zu jedem Auftrag gespeichert (AuftragsID, Auftraggeber, Fall, Datum, Status etc...)

Ich hätte jetzt gerne eine Funktion bzw Button der mir in meiner Listview anzeigt 'Heutiges Datum + 5 Tage'. Also alle Fälle die einen Termin in 5 oder weniger Tagen haben.
Beim Auftragseingang wird das Datum in die SQL gespeichert.
Mach ich das ganze schon bevor ich es in die Listbox lade? Also das Datum mit StrToDate ins Datumsformat bringen und vom aktuellen Datum abziehen?

Hat mir evt jemand einen Tipp der mich in die richtige Richtung leitet?
Soweit sieht mein Code jetzt aus:

Code:
procedure TForm7.Button_Datum(Sender: TObject);
var
  ID,a,p,e,s,v,pan :string;
  datumop, datumheute :TDate;
begin

  datumheute := date;


  ListView1.Items.Clear;
    SQLTransaction1.commit;
       SQLQuery1.Close;
       SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE Fertig = :Fertig';

     SQLQuery1.Params.ParamByName('Fertig').AsString := ?????????;
     SQLQuery1.Open;

    while not SQLQuery1.Eof do
             begin
     ID:=((SQLQuery1.Fields[0].AsString));
     a :=((SQLQuery1.Fields[2].AsString));
     p:=((SQLQuery1.Fields[3].AsString));
     e:=((SQLQuery1.Fields[9].AsString));
     s:=((SQLQuery1.Fields[15].AsString));
     v:=((SQLQuery1.Fields[11].AsString));
     pan:=((SQLQuery1.Fields[19].AsString));
     with ListView1.Items.Add do begin
      Caption:=ID;
      SubItems.Add(a);
      SubItems.Add(p);
      SubItems.Add(e);
      SubItems.Add(s);
      SubItems.Add(v);
      SubItems.Add(pan);
   end;
        SQLQuery1.Next;





end;

  Label7.Caption := IntToStr(ListView1.Items.Count);

end;

Gruß Tim

joachimd 10. Mär 2020 08:04

AW: Auslesen von Daten / Rechnung mit Datum
 
Je nach verwendeter Datenbank
Code:
SELECT * FROM [table1]
  WHERE [datumsfeld] BETWEEN CURDATE() AND CURDATE()+5

hoika 10. Mär 2020 08:08

AW: Auslesen von Daten / Rechnung mit Datum
 
Hallo,
einfach das Datum einschränken.

Select * From Rechnung
Where (Datum>=:Heute) And (Datum<=HeutePlus5)

ParamByName('Heute').AsDateTime:= Date;
ParamByName('HeutePlus5').AsDateTime:= Date+5.0;

bcvs 10. Mär 2020 08:14

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von ironman139 (Beitrag 1459319)
Beim Auftragseingang wird das Datum in die SQL gespeichert.

Wo denn da genau? Welches Feld?

Zitat:

Mach ich das ganze schon bevor ich es in die Listbox lade? Also das Datum mit StrToDate ins Datumsformat bringen und vom aktuellen Datum abziehen?
Wieso StrToDate? Ist das Datum als String in der DB gespeichert?

Zitat:

Delphi-Quellcode:
     ID:=((SQLQuery1.Fields[0].AsString));
     a :=((SQLQuery1.Fields[2].AsString));
     p:=((SQLQuery1.Fields[3].AsString));
     e:=((SQLQuery1.Fields[9].AsString));
     s:=((SQLQuery1.Fields[15].AsString));
     v:=((SQLQuery1.Fields[11].AsString));
     pan:=((SQLQuery1.Fields[19].AsString));

Nebenbei: hier würde ich besser mit FieldByName anstatt Fields[] arbeiten.

TigerLilly 10. Mär 2020 08:20

AW: Auslesen von Daten / Rechnung mit Datum
 
Du kannst beides machen. Hängt von der Benutzerführung + den Datenmengen ab. Wenn du rasch zwischen "innerhalb 5 Tagen", "innerhalb 3 Tagen" etc umschalten willst, ist es vielleicht besser, alle Datensätze zu laden und am Client zu filtern. Wenn das eine fixe Ansicht ist, ist es besser wie unten beschrieben, das am Server zu machen.

DATUM - HEUTE < 5 liefert dir auch die überfälligen.

Achtung auf NULL Werte, Off-by-one und Zeitanteile beim Datum.

ironman139 10. Mär 2020 09:18

AW: Auslesen von Daten / Rechnung mit Datum
 
Leider hab ich noch ein kleines Verständnisproblem.

Das Datum wird in dem Feld Fertig gespeichert in meiner SQL Datenbank.


Code:
var
  ID,a,p,e,s,v,pan :string;
  datumop, datumheute :TDate;
begin

  datumheute := date;

  ListView1.Items.Clear;
    SQLTransaction1.commit;
       SQLQuery1.Close;
       SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE [Fertig] BETWEEN CURDATE() AND CURDATE()+5';

   SQLQuery1.Params.ParamByName('Fertig').AsString := datetostr(datumheute);
   SQLQuery1.Open;

    while not SQLQuery1.Eof do
             begin
     ID:=((SQLQuery1.Fields[0].AsString));
     a :=((SQLQuery1.Fields[2].AsString));
     p:=((SQLQuery1.Fields[3].AsString));
     e:=((SQLQuery1.Fields[9].AsString));
     s:=((SQLQuery1.Fields[15].AsString));
     v:=((SQLQuery1.Fields[11].AsString));
     pan:=((SQLQuery1.Fields[19].AsString));
     with ListView1.Items.Add do begin
      Caption:=ID;
      SubItems.Add(a);
      SubItems.Add(p);
      SubItems.Add(e);
      SubItems.Add(s);
      SubItems.Add(v);
      SubItems.Add(pan);
   end;
        SQLQuery1.Next;

end;

  Label7.Caption := IntToStr(ListView1.Items.Count);

end;

bcvs 10. Mär 2020 11:14

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von ironman139 (Beitrag 1459348)
SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE [Fertig] BETWEEN CURDATE() AND CURDATE()+5';

SQLQuery1.Params.ParamByName('Fertig').AsString := datetostr(datumheute);

Wieso AsString? Ich hoffe, das Datum ist auch ein Datumsfeld in der DB.
Code:
SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE Fertig BETWEEN :Date1 AND :Date2';
SQLQuery1.Params.ParamByName('Date1').AsDateTime := date;
SQLQuery1.Params.ParamByName('Date2').AsDateTime := date + 5;

jobo 10. Mär 2020 11:26

AW: Auslesen von Daten / Rechnung mit Datum
 
Die Kombination aus "Select *.." und indiziertem Feldzugriff sollte auf jeden Fall vermieden werden, sonst ist die Funktion ein Roulette Spiel.

ironman139 10. Mär 2020 11:27

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von bcvs (Beitrag 1459367)
Zitat:

Zitat von ironman139 (Beitrag 1459348)
SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE [Fertig] BETWEEN CURDATE() AND CURDATE()+5';

SQLQuery1.Params.ParamByName('Fertig').AsString := datetostr(datumheute);

Wieso AsString? Ich hoffe, das Datum ist auch ein Datumsfeld in der DB.
Code:
SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE Fertig BETWEEN :Date1 AND :Date2';
SQLQuery1.Params.ParamByName('Date1').AsDateTime := date;
SQLQuery1.Params.ParamByName('Date2').AsDateTime := date + 5;



Leider nein. Und nachträglich ändern wird warscheinlich schwer

jobo 10. Mär 2020 12:01

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von ironman139 (Beitrag 1459372)

Leider nein. Und nachträglich ändern wird warscheinlich schwer

Gut, Du musst Dir überlegen, ob Du zukünftig bei jedem Datumszugriff aufwändige Klimmzüge machen möchtest oder lieber sauber und zuverlässig mit Datumstypen arbeiten willst.

Du kannst den Extraaufwand der nächsten Jahre gegen die Schmerzen einer sofortigen Umstellung berechnen.
Besonders wenn das System "jung" und "klein" ist, würde ich allerdings nicht lange nachdenken, sondern diese Umstellung auf Datumstypen für alle Tabellen planen und durchführen.

Jumpy 10. Mär 2020 13:19

AW: Auslesen von Daten / Rechnung mit Datum
 
Da das ja eine starre Abfrage zu sein scheint (immer 5 Tage Vorschau) dann würde ich da nicht mit Parametern arbeiten sondern mit einem reinen SQL-Statement, das wenn nötig zusätzlich das Datum von einem String in ein Datum umwandelt, also:

SQL-Code:

SELECT * FROM Print_Auftrag WHERE ConvertiereInDatum(Fertig) BETWEEN CURDATE() AND CURDATE()+5
"ConvertiereInDatum" steht für eine entsprechende Funktion deiner Datenbank, konnte jetzt nicht finden, was ihr einsetzt. Könnte z.B. "Convert" in MS SQL sein, TO_DATE in Oracle, usw.

Dann würde ich mir das ganze geraffel mit den Variablen schenken, da die eh nur aus einem Buchstaben bestehen, der nix erklärt hat das keinen Mehrwert. Wenn man das "With" mal drin läßt, fände ich sowas lesbarer:
Delphi-Quellcode:
with ListView1.Items.Add do begin
      Caption:=SQLQuery1.FieldByName('ID').AsString;
      SubItems.Add(SQLQuery1.FieldByName('Irgendwas').AsString);
      //usw.
Und last but not least würde ich für so eine "abgeschlossene" Funktion nicht eine Query verwenden, die ich eh gerade auf dem Form rumliegen habe und so wieder verwende sondern ich würde mir innerhalb der Prozedur eine Query erzeugen, SQL zuweisen, ausführen, Query wieder freigeben.

ironman139 10. Mär 2020 14:42

AW: Auslesen von Daten / Rechnung mit Datum
 
Ok dann werde ich mich mal damit befassen wie ich das umstellen kann.

So sieht jetzt mein Code sehr unschön aus, das müsste ich jetzt noch 4 mal wiederholen für -4, -3,...

Code:
begin

  datumheute := date;
  datumheute := IncDay(datumheute, -5);


  ListView1.Items.Clear;
    SQLTransaction1.commit;
       SQLQuery1.Close;
    SQLQuery1.SQL.Text := 'SELECT * FROM Print_Auftrag WHERE Ferig LIKE :Fertig';

  SQLQuery1.Params.ParamByName('Fertig').AsString := DateToStr(datumheute);
   SQLQuery1.Open;

    while not SQLQuery1.Eof do
             begin
     with ListView1.Items.Add do begin
      Caption:=(SQLQuery1.Fields[0].AsString);
      SubItems.Add(SQLQuery1.Fields[2].AsString);
      SubItems.Add(SQLQuery1.Fields[3].AsString);
      SubItems.Add(SQLQuery1.Fields[9].AsString);
      SubItems.Add(SQLQuery1.Fields[15].AsString);
      SubItems.Add(SQLQuery1.Fields[11].AsString);
      SubItems.Add(SQLQuery1.Fields[19].AsString);
   end;
        SQLQuery1.Next;

end;

jobo 10. Mär 2020 14:46

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von ironman139 (Beitrag 1459411)
Ok dann werde ich mich mal damit befassen wie ich das umstellen kann.

Gut!

Zitat:

Zitat von ironman139 (Beitrag 1459411)
So sieht jetzt mein Code sehr unschön aus, das müsste ich jetzt noch 4 mal wiederholen für -4, -3,...

Nein, eine Abfrage für alle Tage von Heute bis Heute+5 Tage!

Die 5-malige Wiederholung von Code ist natürlich möglich, aber eine denkbar schlechte Variante. Jumpy hat 2 weiter oben erklärt wie es ohne Parameter geht.

ironman139 10. Mär 2020 15:49

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von Jumpy (Beitrag 1459394)
Da das ja eine starre Abfrage zu sein scheint (immer 5 Tage Vorschau) dann würde ich da nicht mit Parametern arbeiten sondern mit einem reinen SQL-Statement, das wenn nötig zusätzlich das Datum von einem String in ein Datum umwandelt, also:

SQL-Code:

SELECT * FROM Print_Auftrag WHERE ConvertiereInDatum(Fertig) BETWEEN CURDATE() AND CURDATE()+5
"ConvertiereInDatum" steht für eine entsprechende Funktion deiner Datenbank, konnte jetzt nicht finden, was ihr einsetzt. Könnte z.B. "Convert" in MS SQL sein, TO_DATE in Oracle, usw.

Dann würde ich mir das ganze geraffel mit den Variablen schenken, da die eh nur aus einem Buchstaben bestehen, der nix erklärt hat das keinen Mehrwert. Wenn man das "With" mal drin läßt, fände ich sowas lesbarer:
Delphi-Quellcode:
with ListView1.Items.Add do begin
      Caption:=SQLQuery1.FieldByName('ID').AsString;
      SubItems.Add(SQLQuery1.FieldByName('Irgendwas').AsString);
      //usw.
Und last but not least würde ich für so eine "abgeschlossene" Funktion nicht eine Query verwenden, die ich eh gerade auf dem Form rumliegen habe und so wieder verwende sondern ich würde mir innerhalb der Prozedur eine Query erzeugen, SQL zuweisen, ausführen, Query wieder freigeben.


OK. die Variablen sind schon draußen.
Ich verwende eine MariaDB 10

Für die MariaDB ist die Konvertierung TO_DATE oder STR_TO_DATE.
In den ganzen Beispielen ist das Str Datum aber anderst getrennt (05-03-2020) bei mir ist es aber durch Punkte getrennt.

Ich glaube es führt kein weg vorbei das Format auf Date zu stellen.
Dazu in phpMyAdmin einfach das Format für die Spalte ändern? Und meinen Code anpassen ?
Momentan setze ich mit einem DateTimePicker das Datum in ein Edit Feld und schreib dieses dann in die Datenbank.

Das System selber programmier ich bereits seit 2 Jahren.
Die Datenbank enthält 6000 Aufträge. Daher sollte es halbwegs reibungslos funktionieren.

Jumpy 12. Mär 2020 17:32

AW: Auslesen von Daten / Rechnung mit Datum
 
Bei str_to_date solltest du als 2. Parameter angeben, in welchem Format dein Datum in dem String vorliegt. Hier mal mein erster Google Treffer dazu:

https://www.w3schools.com/sql/func_m...tr_to_date.asp

also

str_to_date(Fertig, "%d.%m.%Y")

p80286 12. Mär 2020 18:42

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von ironman139 (Beitrag 1459420)
In den ganzen Beispielen ist das Str Datum aber anderst getrennt (05-03-2020) bei mir ist es aber durch Punkte getrennt.

Chic ist das jetzt Amerikanisches oder deutsches Format?
Wenn schon ein Datum als Text dann wenigstens das ISO-Format (2020-02-02 = 20.Februr 2020!)

Gruß
K-H

haentschman 13. Mär 2020 06:40

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

dann wenigstens das ISO-Format (2020-02-02 = 20.Februr 2020!)
..ist das ne Fangfrage? :stupid: Oder Kontrolle ob das wirklich einer liest? :wink:

ISO: YYY-MM-TT

hhcm 13. Mär 2020 07:27

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von haentschman (Beitrag 1459624)
ISO: YYY-MM-TT

Fast

haentschman 13. Mär 2020 07:37

AW: Auslesen von Daten / Rechnung mit Datum
 
:oops: die Batterie war leer...:P

hhcm 13. Mär 2020 08:19

AW: Auslesen von Daten / Rechnung mit Datum
 
Im übrigen kannst du folgendes machen

Code:
// Neues Feld anlegen
ALTER TABLE Print_Auftrag ADD COLUMN Fertig_neu DATETIME NULL DEFAULT NULL;

// Daten von Fertig in Fertig_Neu konvertieren
UPDATE Print_Auftrag SET Fertig_Neu = STR_TO_DATE(Fertig, "%d.%m.%Y");
Kontrollieren ob die Datumsfelder richtig sind

Code:
// Altes Feld löschen
ALTER TABLE Print_Auftrag DROP COLUMN Fertig;

// Neues Feld in alten Feldnamen umbenennen
ALTER TABLE Print_Auftrag CHANGE COLUMN Fertig_neu Fertig DATETIME NULL DEFAULT NULL;
Jetzt musst nur "nur" noch deinen Code anpassen. .AsString geht immer noch, sieht nur anders aus.

p80286 13. Mär 2020 10:02

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

Zitat von haentschman (Beitrag 1459624)
Zitat:

dann wenigstens das ISO-Format (2020-02-02 = 20.Februr 2020!)
..ist das ne Fangfrage? :stupid: Oder Kontrolle ob das wirklich einer liest? :wink:

ISO: YYY-MM-TT

:oops:Dicke Finger!

haentschman 13. Mär 2020 10:10

AW: Auslesen von Daten / Rechnung mit Datum
 
Zitat:

"Der Teufel hat seine Grossmutter erschlagen weil er keine Ausrede mehr wusste"
...ja, ja. Bei mir sind es immer die Batterien. :stupid: :zwinker:

hoika 14. Mär 2020 06:56

AW: Auslesen von Daten / Rechnung mit Datum
 
Hallo,
wenn die Tage bekannt sind, klappt das auch mit OR.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz