Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   mit Zeiten rechnen / vergleichen / erkennen (https://www.delphipraxis.net/167901-mit-zeiten-rechnen-vergleichen-erkennen.html)

zzTAz 24. Apr 2012 21:56

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

bernhard_LA 24. Apr 2012 22:09

AW: mit Zeiten rechnen / vergleichen / erkennen
 
kannst du deinen code mal posten - dann kann man besser eine hilfestellung geben

zzTAz 24. Apr 2012 22:19

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;

bernhard_LA 24. Apr 2012 22:36

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

Bummi 24. Apr 2012 23:56

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:
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;
Generell würde ich mit TDatetimes arbeiten, ob in Array,Listen oder Tabellen ..
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.

jobo 25. Apr 2012 08:12

AW: mit Zeiten rechnen / vergleichen / erkennen
 
Zitat:

Zitat von Bummi (Beitrag 1163424)
Ich benötige derartige Funktionen eigentlich immer nur in Datenbanken ..

Da kann ich nur zustimmen, ich würde niemals auf die Idee kommen auch nur eine Berechnung in Delphi vorzunehmen, sondern alles in der DB. Aber das ist ja nicht gefragt.

zzTAz 25. Apr 2012 15:22

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. :-/

guinnes 25. Apr 2012 16:07

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:
{-----------------------------------------------------------------------------
  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 die eine Timespan kommen Arbeitsbeginn und Arbeitsende, Timespan leifert dann die Arbeitszeit.
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 21:21 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