![]() |
mit Zeiten rechnen / vergleichen / erkennen
Guten Tag liebe Community,
da ich auf meiner weiten Suche im www leider keinen passenden Lösungsansatz gefunden habe (Was evtl. daran liegt, dass mir noch einiges "spanisch" vorkommt und ich relativ neu in Delphi bin). Werde ich euch jetzt wohl oder übel versuchen mit meinen Problemen zu belästigen und darauf hoffen, dass ich euch nicht zu sehr auf die Nerven gehe. So dann fang ich mal an. Ich versuche einen Arbeitszeitenrechner zu erstellen, der erstmal folgende Funktionen mit sich bringen soll. Funktionen 1. geleistete Arbeitszeit berechnen 2. Gehalt / Lohn berechnen anhand von Zuschlagsätzen bezogen auf eine bestimmte Uhrzeit 3. Speichern der Eingaben (Wird erst später erledigt bzw. begonnen, wenn ich Nr. 2 gelöst habe) Funktion 1. berechnen der Arbeitszeit hab ich erledigt auch wenn evtl. nicht ganz elegant/richtig ? Habe dazu 5 Eingabefelder genutzt 1. Arbeitsbeginn Std 2. Arbeitsbeginn Min 3. Pause 4. Arbeitsende Std 5. Arbeitsende Min alles (Integerwerte) Dadurch alles ausgerechnet und erhalte nun die geleisteten Arbeitsstd (single) Funktion 2. Gehalt / Lohn berechnen anhand von Zuschlagsätzen bezogen auf eine bestimmte Uhrzeit Ansich wäre das auch nicht so das Problem nur weiss ich nicht, wie ich den Uhrzeitenvergleich bzw. das "erkennen" der Uhrzeit realisieren kann sprich ich denk an sowas in der Art Zuschlagsätze 18-20Uhr 20% 20-22Uhr 25% If Arbeitsbeginn 16:00 Uhr and Arbeitsende 23:00Uhr then do von 18:00-20:00 20% Zuschlag and von 20:00-23:00 25%Zuschlag. Mein Problem ist nur, dass meine Lösung bei der Erfassung der Arbeitsstunden bereits falsch sein dürfte. Da ich hier ja alles in Minuten umwandle und später wieder in Std um zu sehen wieviele Std. an einem Tag geleistet wurden. Jedoch kann ich damit dann aber nicht wirklich mit Zeiten rechnen um zu "erkennen" ob man in einer Zeit arbeitet wo man einen Zuschlag erhält. Hoffe ihr versteht mein Problem ;-) Ich freue mich bereits jetzt auf ein paar Tipps und Lösungsansätze Mfg Taz |
AW: mit Zeiten rechnen / vergleichen / erkennen
kannst du deinen code mal posten - dann kann man besser eine hilfestellung geben
|
AW: mit Zeiten rechnen / vergleichen / erkennen
Aber sicher doch ;-)
ich hoffe nur meine Variablen sind nicht zu verwirrend... falls ihr noch allgemeine Verbesserungsvorschläge habt nur her damit.
Delphi-Quellcode:
procedure TArbeitszeitenrechner.BtnAuswertungClick(Sender: TObject);
var arbeitsbeginnstd, arbeitsbeginnmin, arbeitsbeginnkpl: integer; arbeitsendestd, arbeitsendemin, arbeitsendekpl: integer; pause, ergebnismin: integer; ergebnis: single; begin arbeitsbeginnstd := StrToInt(EdtAbeginnStdMo.Text); arbeitsbeginnmin := StrToInt(EdtAbeginnMinMo.Text); arbeitsendestd := StrToInt(EdtAendeStdMo.Text); arbeitsendemin := StrToInt(EdtAendeMinMo.Text); pause := StrToInt(EdtPauseMo.Text); arbeitsbeginnkpl := (arbeitsbeginnstd * 60) + (arbeitsbeginnmin); arbeitsendekpl := (arbeitsendestd * 60) + (arbeitsendemin); ergebnismin := ((arbeitsendekpl - arbeitsbeginnkpl) - pause); ergebnis := (ergebnismin / 60); LblIstArbeitszeitMo.Caption := FloatToStr(ergebnis); end; |
AW: mit Zeiten rechnen / vergleichen / erkennen
mal ein kleine code fragment als hilfe zur selbst hilfe :-) kann leider keine komplette lösung hier posten -- keine zeit :)
Delphi-Quellcode:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Generics.Collections; type tArbeitstag = record arbeits_start : TDateTime; arbeits_ende : TDateTime; arbeits_soll : TDateTime; arbeits_ist : TDateTime; end; TArbeitsTage = TList < tArbeitstag> ; TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; ErfasseArbeitstagButton: TButton; BerechneArbeitstageButton: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure ErfasseArbeitstagButtonClick(Sender: TObject); procedure BerechneArbeitstageButtonClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } aArbeitsTageListe : TArbeitsTage; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BerechneArbeitstageButtonClick(Sender: TObject); var i : integer; einArbeitstag : tArbeitstag; begin for i:= 0 to aArbeitsTageListe.Count-1 do begin einArbeitstag := aArbeitsTageListe.Items[i]; // berechne jetzt ..... end; end; procedure TForm1.ErfasseArbeitstagButtonClick(Sender: TObject); var einArbeitstag : tArbeitstag; begin einArbeitstag.arbeits_start := now ; // füge aktuelle Zeit Datum ein .... selber abändern einArbeitstag.arbeits_ende := now ; aArbeitsTageListe.Add(einArbeitstag); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin aArbeitsTageListe.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin aArbeitsTageListe :=TArbeitsTage.Create; end; end |
AW: mit Zeiten rechnen / vergleichen / erkennen
Ich benötige derartige Funktionen eigentlich immer nur in Datenbanken für Massenkalkulationen, ich habe den komplizierteren Teil der Zuschlagsfindung mal exemplarisch für Delphi skizziert
Delphi-Quellcode:
Generell würde ich mit TDatetimes arbeiten, ob in Array,Listen oder Tabellen ..
uses Math;
{$R *.dfm} Function GetLappingHours(von1,bis1,von2,bis2:TDateTime):TdateTime; var von,bis:TDateTime; begin Result := 0; If (bis1>von2) and (bis1 <bis2) or ((von1>von2) and (von1<bis2)) or ((von1<=von2) and (bis1>=bis2)) then begin if Von1 >Von2 then Von := Von1 else Von := Von2; if Bis1 < Bis2 then Bis := Bis1 else Bis := Bis2; Result := RoundTo((Bis - Von) * 24,-2); end end; procedure TForm2.Button1Click(Sender: TObject); var v1,b1,v2,b2:TdateTime; begin v1 := StrToDateTime('01.01.2012 12:00'); b1 := StrToDateTime('01.01.2012 20:12'); v2 := Trunc(v1) + StrToTime('18:00'); b2 := Trunc(v2) + StrToDateTime('23:00'); Caption := 'Stunden mit Zuschlag x%=' + FloatToStr(GetLappingHours(v1,b1,v2,b2)); end; Zeit=Bis-Von Vorkommateil entspricht Tagen (wobei Delphi bei der Darstellung als Datum bei 30.12.1899 beginnt ( Caption := DateToStr(0);) was für die Rechnerei aber unerheblich ist) Der Nachkommateil ist ebenfalls in Tagen zu interpretieren, also 0.5=12:00 etc. |
AW: mit Zeiten rechnen / vergleichen / erkennen
Zitat:
|
AW: mit Zeiten rechnen / vergleichen / erkennen
vielen dank euch allen erstmal :-D , hab dadurch schon mal paar Kleinigkeiten gelernt.
Werde mich weiter diesem Problem wittmen, wenn ich meine andere Aufgabe erledigt habe. :-/ |
AW: mit Zeiten rechnen / vergleichen / erkennen
An etwas ähnlichem sitze ich zur Zeit auch, nur gehe ich da einen Objektorientierten Ansatz : Eine Klasse, die Zeitabschnitte verwaltet und Schnittmengen aus 2 Zeiträumen ziehen kann :
Delphi-Quellcode:
In die eine Timespan kommen Arbeitsbeginn und Arbeitsende, Timespan leifert dann die Arbeitszeit.
{-----------------------------------------------------------------------------
Classname : TTimespan Autor : e310hel001 Datum : 17-Apr-2012 Aufgabe : Hält einen Zeitabschnitt -----------------------------------------------------------------------------} TTimespan = class private FStart : TDateTime; FStop : TDateTime; function GetTimespan: TDateTime; procedure SetStop(const Value: TDateTime); procedure SetStart(const Value: TDateTime); public property Start : TDateTime read FStart write SetStart; property Stop : TDateTime read FStop write SetStop; property Timespan : TDateTime read GetTimespan; function IntersectTime ( aTimeSpan : TTimeSpan) : TDateTime; end; { TTimespan } function TTimespan.GetTimespan: TDateTime; begin Result := Stop - Start; end; procedure TTimespan.SetStop(const Value: TDateTime); begin FStop := Value; end; procedure TTimespan.SetStart(const Value: TDateTime); begin FStart := Value; // Stop auf Now setzen, damit ein Gültiger Wert für den Laufenden Zeitraum // vorhanden ist, auch wenn im Zeitraum kein Stop mehr kommt Stop := Now; end; function TTimespan.IntersectTime(aTimeSpan: TTimeSpan): TDateTime; begin Result := Min(Stop,aTimeSpan.Stop) - Max(Start,aTimeSpan.Start); end; In eine andere z.B. 18.00 Uhr als Start und 20.00 Uhr als Ende. IntersectTime liefert dann die Zeitspanne, für die Zuschläge gezahlt werden müßen. Gleiches gilt z.B. auch für Pausen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14: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-2025 by Thomas Breitkreuz