Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zeiten speichern, berechnen (https://www.delphipraxis.net/185654-zeiten-speichern-berechnen.html)

Sugar 27. Jun 2015 10:03

Zeiten speichern, berechnen
 
Hallo,

ich stehe wieder mal auf dem Schlauch...

Ich will eine Zeit "stoppen" bzw. diverse Zeiten zusammenrechnen.
Zum Hintergrund: Auf Buttonklick soll eine Zeitmessung gestartet werden, die laufende Dauer in einem Label angezeigt werden und diese dann auf einen weiteren Buttonklick gestoppt werden.

Ich fummele jetzt schon diverse Zeit, komme aber nicht voran. Welchen Datentyp sollte ich benutzen um die Zeiten zu speichern? (MS SQL Server 2014), wie addiere ich Zeiten? Und wie kann ich die als "Normalzeit" angezeigten oder gespeicherten Zeiten in Industrieminuten (100 Min/Stunde) umrechnen...

Irgendwie habe ich nach all dem Fummeln voll ein Brett vor dem Kopf...

Gruß und Danke für Tipps

Perlsau 27. Jun 2015 10:18

AW: Zeiten speichern, berechnen
 
Ich nehme gewöhnlich Sekunden, um Zeiten zu speichern. Soll es noch etwas genauer sein, wähle ich Millisekunden. Der Wertebereich kann in Delphi meist locker mit Integer abgedeckt werden, in MsSQL wäre das int.

Captnemo 27. Jun 2015 10:27

AW: Zeiten speichern, berechnen
 
Das kommt ein wenig darauf an, wie groß die zu messenden Zeit erwartungsgemäß werden sollen, und welche Genauigkeit am Ende verlangt ist.

Wenn es sich um eine Zeiterfassung handelt (wovon ich mal ausgehe da du von Industrieminuten spricht), kann ich dir mal sagen wie ich das mache.

Bei einer Zeiterfassung, bei der ein Minutenzeitraum erfasst werden soll, kann man nicht grundsätzlich davon ausgehen, dass die eigene Anwendung ohne Unterbrechung vom Start der Erfassung bis zum Ende der Erfassung läuft. Es kann durch aus sein, dass der Anwender diese auch mal kurz beendet bzw. ein anderes Problem auftritt.
Deswegen erfasse ich einen TDAteTime-Wert bei Start der Erfassung und lege mit diesen in einem Feld in einer Datenbank (kann natürlich auch irgendein anderer Speicherort sein) ab. Wenn nun das Ender der Erfassung signalisiert wird, dann erfasse ich den TDatetime-Wert erneut und lege ihn aber in einem anderen Feld ab. Jetzt habe ich 2 TDateTime-Werte, von denen ich z.B. per MinutesBetween die Differenz in Minuten errechnen kann, die ich dann (wenn ich denn will, als Integer in der DB ablegen kann. Aus diesen Minuten kann ich natürlich ohne Probleme in Industrieminuten umrechnen oder das ganze in Stunden/Minuten aufteilen. Es gibt natürlich auch die Funktion SecondsBetween, wenn's Sekundengenau sein soll.
Beide Funktionen liefern einen Int64 zurück, das entspräche dem BigInt in MSSQL.
Da man nun Integerwerte hat, kann die natürlich beliebig addieren oder sonst was mit machen.

jobo 27. Jun 2015 10:53

AW: Zeiten speichern, berechnen
 
Noch ein paar Gedanken dazu:
In der Handhabung wird man hier sicher unterscheiden, ob das innerhalb einer DB gehalten werden soll oder alles per Delphicode abgefackelt wird.
In einer DB ist es eigentlich üblich, DateTime Werte zu speichern. Mit denen kann man dann rechnen im SQL Statement oder in Reports.
SQL-Code:
Select EndDatumZeit- StartDatumZeit from Zeiterfassung where userid = ..
Der nächste Punkt ist dann die Darstellung. Unabhängig von der Speicherung der Werte kannst Du immer beliebig das Ausgabeformat wählen, also die Differenz als Industrieminuten, Tage, Jahre, ..
Und nochwas, wenn es um eine Art Messwerterfassung geht und man tatsächlich die Messung pausiert (bspw. weil für einen Produktionsablauf Vorgabezeiten aufgestellt werden müssen), kommt man mit den 2 genannten Feldern nicht sonderlich weit.
Hier könnte man bspw. das Datenmodell so anlegen, das eine Liste von Start/Stop Werten unter einer Mess ID abgelegt werden können. Also eine ID pro Messung, viele Zeitwerte. Damit ist man in der Speicherung unabhängig von der Anzahl der Unterbrechungen.

Popov 27. Jun 2015 10:58

AW: Zeiten speichern, berechnen
 
@Sugar

Guck dir mal die Funktionen den Unit DateUtils genauer an. Wie der Name schon sagt bietet sie Funktionen zum Thema Datum und Uhrzeit an.

Für dich wären u. U. wichtig MilliSecondsBetween(Time1, Time2) oder SecondsBetween(Time1, Time2) usw. Beide Int64. Damit kannst du den Unterschied zwischen zwei Zeiten ermitteln. Je nach Funktion die Millisekunden, Sekunden, Minuten, Stunden, usw.

Eine Stopuhr lässt sich programmieren in dem du das
Delphi-Quellcode:
Now
oder
Delphi-Quellcode:
Time
zur Startzeit merkst und es dann mit
Delphi-Quellcode:
Now
oder
Delphi-Quellcode:
Time
der Stopzeit vergleichst. Das sind zwei Zeilen Code.

Umrechnung in Industriezeit wäre (bei Sekunden)
Delphi-Quellcode:
Round(Sekunden / 60 * 100)
.

Sugar 27. Jun 2015 11:15

AW: Zeiten speichern, berechnen
 
Super,euch allen vielen Dank.

CptnNemo hat mir mit der Beschreibung seiner Vorgehensweise einen guten Ansatz geliefert den ich nun einmal in einem Dummy umsetzen werde.

Danke nochmal, Issue ist zunächst mal ausreichend beantwortet.

Captnemo 27. Jun 2015 11:34

AW: Zeiten speichern, berechnen
 
Ich speichere mir zu den TDateTime werten in der DB zusätzlich auch noch die MinutesBetween als ganz normal Zeitminuten ab. Der Grund ist, dass ich dann recht bequem im Select per SUM() mir die Zeiten schon als Summe abfragen kann. Man kann natürlich innerhalb der SQL-Abfrage sich die DiffMinuten berechnen lassen, aber ich persönlich finde das so übersichtlicher. Die Umrechnung in Industrieminuten mache ich grundsätzlich immer in der Anwendung.

Dejan Vu 27. Jun 2015 12:49

AW: Zeiten speichern, berechnen
 
Zitat:

Zitat von Captnemo (Beitrag 1306822)
Der Grund ist, dass ich dann recht bequem im Select per SUM() mir die Zeiten schon als Summe abfragen kann.

Also ich sehe jetzt keine Unbequemlichkeit, per
SQL-Code:
select sum(datediff(minutes,dateFrom, dateTo)) from Tabelle
Wobei das natürlich von der DB abhängt, wie man die Differenz in Minuten ausrechnet. Das Problem mit redundanten Werten ist die vermutlich nicht vorhandene Integrität, denn eine Änderung einer der drei Werte führt zu Inkonsistenzen. Des Weiteren rundest Du ja schon auf Minuten, was sich in der Summierung doch auswirken kann.

Captnemo 27. Jun 2015 12:55

AW: Zeiten speichern, berechnen
 
Da hast du natürlich absolut recht. Ich habe ja auch erwähnt, dass man das auch in der SQL-Abfrage machen könnte.
Wenn man das natürlich so macht, dass man die Diff mit in der DB ablegt, dann muss man natürlich sicherstellen, dass bei Änderungen der TDateTime's die Konsistenz wieder hergestellt wird. Letztlich kann man nicht zu 100% (es könnte ja auch einer in der DB den DateTime-Eintrag zu Fuss ändern).


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