![]() |
Delphi-Version: XE2
Industrieminuten
Guten Morgen zusammen,
bevor die Frage aufkommen sollte: Ja, ich habe die SuFu genutzt. Mein Problem ist folgendes: Ich möchte zwei TDateTimes vergleichen und mir die Differenz in Stunden ausgeben lassen. Mir sind die Funktionen YearBetween, HoursBetween, etc. bekannt und leider auch zu ungenau. Deshalb habe ich eine eigene Funktion geschrieben:
Delphi-Quellcode:
Das Problem was sich nun stellt ist, dass wenn ich beispielsweise folgende Rechnung habe:
function TXmlfunction.GetDate(dtVon, dtBis: TDateTime): string;
var dtDate: TDateTime; sHour: string; sTime: string; begin dtDate := (dtBis - dtVon); sHour := TimeToStr(dtDate); sTime := FloatToStr(StrToFloat(sHour[1] + sHour[2]) + StrToFloat(sHour[4] + sHour[5]) / 60); result := sTime; end; 22.01.2015 10:00:00 - 21.01.2015 10:00:00, dann ist das Ergebnis 0, da er durch den Befehl
Delphi-Quellcode:
nur die Stunden nimmt.
TimeToStr()
Ich kann aber nicht
Delphi-Quellcode:
nutzen, weil ich so nur Müll rausbekomme.
DateTimeToStr()
Frage: Wie stelle ich das jetzt am geschicktesten an? Gruß Jan |
AW: Industrieminuten
Wozu dieses ganze String-Geraffel, wäre z.B. DecodeDateTime nicht zielführender?
|
AW: Industrieminuten
Oder
![]() ![]() ![]() Abgesehn von den fehleranfälligen Stringbehandlungen ... StrToFloat, obwohl man nur ganze Zahlen rein gibt. Zitat:
Wie wäre es, wenn du auch die Tages/Monats/Jahres-Anteile mit einrechnest? :roll: Und was ist mit den MinutenSekunden-Anteilen? 22.01.2015 10:00:00 - 22.01.2015 09:30:00 Nur das Markierte wird von dir beachtet und der Rest einfach ignoriert, da kann das doch nicht richtig funktionieren. |
AW: Industrieminuten
Nach kurzer Überlegung: die Differenz zweier TDateTime ist doch in Tagen, um also auf die Stunden zu kommen, müsste man sie doch lediglich mit 24 multiplizieren, oder mache ich da einen Denkfehler?
|
AW: Industrieminuten
Zitat:
UPDATE Aber bitte keine MagicValues im Code benutzen sondern ![]() UPDATE 2 Die einzige Zahl, die keine MagicValue ist, ist die 42 :mrgreen: |
AW: Industrieminuten
Zitat:
Sherlock |
AW: Industrieminuten
Danke schonmal für die Antworten. Mein Programm erfasst Arbeitszeiten.
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Gruß
function TXmlfunction.GetDate(dtVon, dtBis: TDateTime): string;
var dtDate: TDateTime; begin dtDate := ((dtBis - dtVon)*24); result := DateTimeToStr(dtDate); end; Jan |
AW: Industrieminuten
Zitat:
(hab da schnell und heimlich da oben meine Antwort angepasst) Zitat:
Darum gibt es auch diese "sprechenden" Konstanten. (Oder man schreibt ständig "unnötige" Kommentare in seinen Code :stupid:) DateTimeToStr wird nur zum "Konvertieren" von DateTime-Werten benutzt (Tage = ganzzahliger Anteil und Nachkommateil ist Stunden/Minuten/Sekunden ... bzw. "Tage" seit Anfang) Mal "24" (die Fernsehserie) ist das natürlich kein DateTime-Wert mehr, sondern ein Stunden-Wert. (FloatToStr, Format, gerundet und dann IntToStr usw.) |
AW: Industrieminuten
So ungefähr, aber die 24 ist nun der angesprochene Magic Value: da steht eine 24 und niemand weiß, was sie zu bedeuten hat. Aus diesem Grund benutzt man Konstanten mit sprechenden Bezeichnern.
Delphi-Quellcode:
So wird einem auch nach Jahren sofort klar, dass das mit Stunden je Tag zu tun hat.
dtDate := ((dtBis - dtVon)*DateUtils.HoursPerDay);
|
AW: Industrieminuten
Zitat:
Check, ich probier es gleich mal aus. :) Gruß Jan Edit: DateUtils.HoursPerDay sind bei mir zwei undeklarierte Bezeichner. Ich habe in den Uses System.DateUtils eingebunden. Bin ich dumm oder sehe ich den Fehler nicht? |
AW: Industrieminuten
Zitat:
![]() Oder wie genau möchtest du es denn genau haben :?: |
AW: Industrieminuten
Er möchte eigentlich den Minutenanteil in Stunden in der Industriezeit
|
AW: Industrieminuten
Zitat:
|
AW: Industrieminuten
HoursBetween zu ungenau?
![]() oder ![]() ![]() Zitat:
|
AW: Industrieminuten
Zitat:
Sehe ich das jetzt zu einfach oder kann man das nicht durch dieses Konstrukt erreichen:
Delphi-Quellcode:
uses
System.SysUtils, System.Math; ... function IndustrieStundenZwischen(DT1, DT2: TDateTime): Double; { Liefert die Differenz in Stunden mit zwei Nachkommastellen zurück und ist somit auf 1 Industrieminute genau } begin result := SimpleRoundTo((DT2 - DT1)*HoursPerDay, -2); end; |
AW: Industrieminuten
Zitat:
60 ~ 1 30 ~ 0.5 etc. So können doch 0.5 nicht 50 Industriemethoden entsprechen, oder? Man man man ich weiß schon, warum ich Uhren damals schon nicht mochte. Gruß Jan Edit:
Delphi-Quellcode:
liefert mir was falsches...
((dtBis - dtVon) * System.SysUtils.HoursPerDay);
Noch n Edit: Habe eben mal das von himitsu ausprobiert, aber ich will nicht 0,99999... ausgegeben bekommen, sondern eins. Wie runde ich denn? |
AW: Industrieminuten
Das sind dann Minuten / MinutenProStunde
30/60 = 0,5 |
AW: Industrieminuten
Zitat:
So richtig schick wird es aber erst, wenn du mit Industriesekunden (1 Industrieminute = 100 Industriesekunden) arbeitest. |
AW: Industrieminuten
ich habe hier noch ein paar Stopuhren rumliegen die in 100/ Minuten geteilt sind ,
machte das aufaddieren von Arbeitszeiten beim erstellen von Arbeitsplänen doch sehr viel einfacher und gibt's auch noch zu kaufen ![]() |
AW: Industrieminuten
Delphi-Quellcode:
Danke Uwe, das funktioniert jetzt wunderbar. :thumb:
result := SimpleRoundTo((DT2 - DT1)*HoursPerDay, -2);
Gruß Jan |
AW: Industrieminuten
Zitat:
Zitat:
Ein kleines
Delphi-Quellcode:
dokumentiert den Code nicht so schön wie z.B. HourSpan.
-
Zitat:
|
AW: Industrieminuten
Zitat:
Zitat:
|
AW: Industrieminuten
Zitat:
Nette Idee! |
Welcher Magier kennt alle Konstanten?
Zitat:
Ich verstehe zwar, dass es besser ist, z.B.
Delphi-Quellcode:
zu verwenden als die Zahl 24 irgendwo in einer Funktion in einer Formel auftauchen zu lassen.
const
StdProTag = 24; Aber muss man deshalb gleich immer die Monsterausdrücke wie System.SysUtils.HoursPerDay bemühen? Damit eindeutig ausgeschlossen wird, dass der Compiler irgendwo eine Definition
Delphi-Quellcode:
findet? Dann wäre doch die Definition eigener Konstanten sinnvoller, da weiss man was man hat. Oder?
HoursPerDay = 25
|
AW: Welcher Magier kennt alle Konstanten?
Ich kenne die auch nicht, und mache das auch so
Delphi-Quellcode:
Wenn ich dann irgendwann darauf stoße, dass es eine solche vorgefertigte Konstante in den Delphi-Tiefen gibt, mache ich daraus
const
StdProTag = 24;
Delphi-Quellcode:
... und gut is.
const
StdProTag = System.SysUtils.HoursPerDay; Allerdings ist das Verwenden der Tatsache, dass ein TDateTime ein double ist, genauso magisch, wie die 24. Deshalb halte ich eine solche Multiplikation für schlechten Code. Da es genügend Funktionen gibt, die fast alle denkbaren Anforderungen abdecken, brauchts so etwas nicht. Wenn es doch so eine Anforderung geben sollte, kann man die benötigte Funktion entsprechend selbst erstellen. |
AW: Welcher Magier kennt alle Konstanten?
Zitat:
Wenn man weiß, daß es um einen Datumswert geht, braucht man nur noch un 2-3 Units zu suchen. DateUtils und dort wo früher das Zeug rumgammelte, also vorallem die SysUtils. Zitat:
Und bei 4 Wochen Urlaub im Jahr....... |
AW: Industrieminuten
Also nachdem das Rechnen nun einwandfrei funktioniert, möchte ich gerne eine TObjectlist in einem StringGrid ausgeben - das funktioniert bereits!
Es geht mir nur darum, dass ich in dieser Liste ein Kommentar habe (string) und ich dieses dort einfügen möchte. Ich habe gelesen, dass man wohl keine Zeilenumbrüche in StringGrids machen kann, ist das richtig? Ansonsten möchte ich nämlich so vorgehen (bisschen Pseudocode):
Code:
Soweit meine Idee...
wenn Liste[i].DerString > Liste[i].DerString[60] (also länger als 60 Zeichen) dann
iZeichen := 60; wiederhole: wenn Liste[i].DerString[iZeichen] ungleich '' ist dann iZeichen -1 ansonsten mache dort Zeilenumbruch bis Leerzeichen kommt schreibe String in StringGrid mit Zeilenumbruch |
AW: Industrieminuten
Zitat:
|
AW: Welcher Magier kennt alle Konstanten?
Zitat:
Delphi-Quellcode:
Ist aber im Prinzip dann auch egal, meine Bibliothek würde ich dann nicht mehr anfassen, sondern wie gezeigt entsprechend abändern.
const
// StdProTag = 24; StdProTag = System.SysUtils.HourPerDay; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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