Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi HourSpan ... Merkwürdigkeiten (https://www.delphipraxis.net/212205-hourspan-merkwuerdigkeiten.html)

haentschman 4. Jan 2023 05:44


HourSpan ... Merkwürdigkeiten
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallöle...8-)

Bei sowas macht Programmieren keinen Spaß...:evil:

Gegeben:
* 2 DateTime Felder, 1 FloatFeld
* beide DateTime Felder haben den gleichen Eventhandler
Delphi-Quellcode:
procedure TDMED.FDQAktuelleTermineAnkunftChange(Sender: TField);
var
  StartTime: TDateTime;
  EndTime: TDateTime;
  HourDifference: Double;
begin
  HourDifference := 0.0;

  StartTime := FDQAktuelleTermine.FieldByName('Ankunft').AsDateTime;
  EndTime := FDQAktuelleTermine.FieldByName('Abkunft').AsDateTime;

  if not FDQAktuelleTermine.FieldByName('Abkunft').IsNull then
  begin
    HourDifference := HourSpan(StartTime, EndTime);
  end;

  FDQAktuelleTermine.FieldByName('Dauer').AsFloat := HourDifference;
end;
Der User hat gesagt, er hat sich im Datum vertan und hat es korrigiert. Trotzdem ist der komische Wert stehengeblieben...:gruebel:

Wo kommt der Wert her? :gruebel:

PS: Ich kann es nicht repoduzieren. Es kommt immer das Richtige raus...:roll: (auch bei 2099 :wink: (Bild2))

Nachtrag:
Der Wert 1078.... kommt raus wenn man den "Ankunft" Wert auf leer setzt. (Bild3) Dann stellt sich aber die Frage, warum wurde der Handler nicht ausgeführt? :gruebel:

himitsu 4. Jan 2023 06:24

AW: HourSpan ... Merkwürdigkeiten
 
TField.AsDataTime gibt bei leer und Null eine 0, also das Ende von 1899.

Sicher, dass "leer" wirklich NULL ist?
DevExpress und andere Fremdkomponenten nehmen als Wert für "Nichts" auch gern mal was Negatives, nahe dem Jahr 0, was in Stunden schnell mal 2-stellige Millionen ergeben kann.


Als Differenz zu jetzt wären es aber nur rund 37.000 und keine 675.000 oder gar über eine Million.
[edit] ja, Stunden ... nicht Tage :oops:

Als Differenz von 0 zu jetzt sind es rund 37.000 Tage, also 888.000 Stunden, was deinen Werten sehr nahe kommt.

haentschman 4. Jan 2023 06:27

AW: HourSpan ... Merkwürdigkeiten
 
Danke...:P

Das erklärt aber nicht, warum der Handler offentsichtlich nicht ausgeführt wurde. :?
Ich habe keine Idee. :roll:
Zitat:

Sicher, dass "leer" wirklich NULL ist?
Zitat:

TField.AsDataTime gibt bei leer und Null eine 0
Es gibt eigentlich nur 2 Möglichkeiten:
1. Null/leer/0 -> HourDifference := 0.0; // immer gesetzt beim Auführen des Handlers
2. >leer -> HourDifference := HourSpan(StartTime, EndTime);

himitsu 4. Jan 2023 06:31

AW: HourSpan ... Merkwürdigkeiten
 
Werden Exceptions in diesem Event ausgegeben?

Tja, dann kannst'e wohl nur mal "alles" loggen (Ankunft, Abkunft und Dauer) und nachher versuchen deine Werte von der Anzeige darin zu finden.



Bei "Abkunft" im Code/DB hätte ich Angst das ständig mit Ankunft zu verwechseln.

Wobei Abkunft eigentlich nur eine "örtliche" Abstammung ist und keine Zeitliche. (zumindestens im Deutschen ... k.A. ob Ösis/Schweizies da komische Eigenarten haben)

haentschman 4. Jan 2023 06:37

AW: HourSpan ... Merkwürdigkeiten
 
Zitat:

Bei "Abkunft" im Code/DB hätte ich Angst das ständig mit Ankunft zu verwechseln.
...das ist alter Code. Ich habe die Variablennamen, außer den Feldnamen, für hier etwas modernisiert. :wink: Es gibt auch noch nicht mal eine Prüfung ob die "Abfahrt" kleiner ist als die "Ankunft" ist. (Logikfehler) :oops:
Zitat:

Werden Exceptions in diesem Event ausgegeben?
nein

Blup 12. Jan 2023 12:26

AW: HourSpan ... Merkwürdigkeiten
 
Hier scheint mir Abkunft (Abfahrtzeitpunkt) und Ankunft bei der Auswertung vertauscht zu sein.
Da jeder Eintrag einen Abfahrtzeitpunkt hat, sollte sich die Bedingung doch auf die Ankunft beziehen.
Delphi-Quellcode:
procedure TDMED.FDQAktuelleTermineAnkunftChange(Sender: TField);
var
  StartTime: TDateTime;
  EndTime: TDateTime;
  HourDifference: Double;
begin
  StartTime := FDQAktuelleTermine.FieldByName('Abkunft').AsDateTime;
  EndTime := FDQAktuelleTermine.FieldByName('Ankunft').AsDateTime;
  if (StartTime <= 0) or (EndTime <= 0) or (StartTime > EndTime) then
  begin
    FDQAktuelleTermine.FieldByName('Dauer').Clear;
  end
  else
  begin
    HourDifference := HourSpan(StartTime, EndTime);
    FDQAktuelleTermine.FieldByName('Dauer').AsFloat := HourDifference;
  end;
end;


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