![]() |
Habe den überblick verloren....
Hallo zusammen....
Ich bin etwas gefrustet.... ist recht unübersichtlich geworden.... aber ich hoffe ihr könnt mir dennoch helfen.... Ich habe ein DialogForm erstellt in dem 2 werte eingegeben werden. ein mal Dienst beginn und einmal dienstende. nun soll das für eine Lohnkalkulation die tages und die nachtstunden berechnen... Muss ich nun für Jede möglichkeit eine If Then anweisung schreiben oder geht das auch anders ???? hier mal der Code :
Delphi-Quellcode:
Hoffe es ist so weit verständlich... die Verschiedenen Variablen sind Double werte...
if FEingabe.showModal = mrOK then
begin With Tage[strtoint(ListView1.ItemFocused.Caption)] do begin Tag := ''; ArVon := Feingabe.Von.Text; ArBis := Feingabe.Bis.Text; von := StrToDateTime(FEingabe.Von.Text); bis := StrToDateTime(Feingabe.bis.Text); if von > bis then begin TeilOne := (StrToDateTime('23:59:59') - von); // zeit bis um 00:00 Uhr errechnen TeilTwo := (bis - StrToDateTime('00:00:01')); // zeit von null bis endzeit errechnen Gesamt := TeilOne + TeilTwo; // Gesamtstunden errechnen end else Gesamt := (bis - von); if ((von < StrToDateTime('20:00:01')) AND (von > StrToDateTime('05:59:59')) AND NOT (von = StrToDateTime('20:00'))) then // errechnen wenn die uhrzeit am tag ist begin if (bis > StrToDateTime('19:59:59')) then TagGes := abs(StrToDateTime('19:59:59') - von) else TagGes := gesamt; ShowMessage('erste eigenschaft trifft zu'); NoNight := true; end; if ((von < StrToDateTime('05:59:59')) AND (bis > StrToDateTime('20:00:01'))) then begin TagGes := StrToDateTime('12:00:00'); ShowMessage('Zweite eigenschaft trifft zu'); end; if ((von < StrToDateTime('05:59:59')) AND (bis < StrToDateTime('20:00:01'))) then begin TagOne := StrToDateTime('06:00:01')- bis; TagGes := abs(TagOne); ShowMessage('Dritte eigenschaft trifft zu'); end; if (((von > StrToDateTime('19:59:59')) AND (bis > StrToDateTime('06:00:01'))) and not (von = StrToDateTime('20:00'))) then begin TagOne := bis - StrToDateTime('06:00:01'); TagGes := abs(TagOne); ShowMessage('Vierte eigenschaft trifft zu'); end; if not NoNight then NachtGes := Gesamt - TagGes; GesamtStd := format('%.2f',[Gesamt*24]); NStd := format('%.2f',[NachtGes*24]);; TStd := format('%.2f',[TagGes*24]); Danke für Jeden tipp... Gruss Sascha |
Re: Habe den überblick verloren....
Ich würde ertmals DateTimePicker zur Auswahl der Uhrzeiten verwenden
Zudem gibt es in der Unit DateUtils Funktionen zur Zeitberechnung |
Re: Habe den überblick verloren....
Das würde zu zeitaufwendig für den endbenutzer werden,
der soll nur enter die zahlen drücken und enter :) habe mir die Editfelder erstellt nur die Arbeit mit den Tages stunden und den Nachstunden ist das schlimme... Die Tagstunden gehen von 6-20 Uhr und die Nachtstunden gehen von 20-6 Uhr (ist für die Lohnabrechnung wichtig). bin schon am überlegen ob ich eine For schleife schreibe und die stunden dann per integer zähle... bzw. die minuten... muss das dann ja wieder in Dezimal wiedegeben... dachte nur das einer von euch eine möglichkeit hat wie ich da eine bessere übersicht rein bekomme oder eine andere methode um die zeiten zu checken.... ................ Habe ich vergessen, Die Gesamt Stunden stimmen immer ! nur mit den tages und nacht stunden komme ich einfach durcheinander.... sobald ich als beispiel 6:00 uhr bis 6:30 Uhr eingebe bekomme ich 0 Nacht und 0 tag stunden... ist eines was schon mal nicht stimmt... Habe ich denn keine andere Wahl als Jede Eventualität mit if then zu überprüfen ??? oder das zusammen zu fassen ?? |
Re: Habe den überblick verloren....
Hallo Sascha,
Zeit berechnungen die ueber Tagesgrenzen gehen, wie in diesem Fall werden dir weitere Schwierigkeiten bereiten. Wenige wissen dass Delphi hiermit aber sehr gut auskommen kann: TimeStamp. Wenn du dir die Startzeit und endzeit mit DateTimeToTimeStamp aufbewahrst kannst du damit rechnen und mit TimeStampToDateTime wieder in Uhr/Minuten umsetzen. TimeStamp ist in Delphi die Zeit in millisecunden seit 31-12-1899, deshalb sehr genau. Ich denke hiermit wird es viel klarer und viel leichter. Gruss, Teo |
Re: Habe den überblick verloren....
Hmmm Schwierigkeiten eigentlich nicht. Man muss nur immer die Grenzen von Tag- und Nachtzeiten anspringen und addieren.
WorkCalc berechnet die Tag- und Nachtzeiten jeweils minutengenau und gibt diese als Stundenwerte zurück. Der Zeitraum kann hierbei auch über mehrere Tage gehen (wer's durchhält).
Delphi-Quellcode:
cu
uses DateUtils;
procedure WorkCalc( const StartTime, EndTime : TDateTime; out DayTime, NightTime : Extended ); var Time1, Time2 : TDateTime; IsNight : Boolean; begin DayTime := 0; NightTime := 0; Time1 := StartTime; while ( Time1 < EndTime ) do begin IsNight := False; // Wir machen Nachtschicht if ( FormatDateTime( 'hh:nn:ss', Time1 ) >= '20:00:00' ) then begin Time2 := StrToDateTime( DateToStr( IncDay( Time1, 1 ) ) + ' 06:00:00' ); if Time2 > EndTime then Time2 := EndTime; IsNight := True; end; if ( FormatDateTime( 'hh:nn:ss', Time1 ) < '06:00:00' ) then begin Time2 := StrToDateTime( DateToStr( IncDay( Time1, 0 ) ) + ' 06:00:00' ); if Time2 > EndTime then Time2 := EndTime; IsNight := True; end; if IsNight then begin NightTime := NightTime + MinutesBetween( Time1, Time2 ) / 60; end else begin Time2 := StrToDateTime( DateToStr( IncDay( Time1, 0 ) ) + ' 20:00:00' ); if ( EndTime < Time2 ) then Time2 := EndTime; DayTime := DayTime + MinutesBetween( Time1, Time2 ) / 60; end; Time1 := Time2; end; end; Oliver |
Re: Habe den überblick verloren....
@Sir Rufo
Danke dür deine mühe. Habe kurz vor deinem eintrag einen lösungsweg gefunden. der sieht auf der nersten blick ähnlich aus habe 2 Funktionen geschrieben: einmal :
Delphi-Quellcode:
und dann noch die
Procedure TForm1.NightCalc(Beginn : double; Ende : Double; Gesamt : Double; var NightHours : Double);
var Nacht,Nacht1,Nacht2 : double; begin Nacht1 := 0; Nacht2 := 0; if (Beginn >= strtotime('20:00')) and (ende <= strtotime('06:00')) then Nacht := Gesamt else begin if ((Beginn <= strtotime('20:00')) and (Beginn >= strtotime('06:00'))) then Nacht1 := strtotime('04:00'); if Ende <= strtotime('06:00') then Nacht2 := ende; if (Ende > strtotime('06:00')) then Nacht2 := strtotime('06:00'); if Beginn >= strtotime('20:00') then Nacht1 := (StrToDateTime('23:59:59') - Beginn) + StrToTime('00:00:01'); Nacht := Nacht1 + Nacht2; ShowMessage(' Nacht1 = ' + format('%.2f',[Nacht1*24]) + ' und nacht2 = ' + format('%.2f',[Nacht2*24])); end; NightHours := Nacht; end;
Delphi-Quellcode:
und der aufruf geht dann wie folgt :
Procedure TForm1.TagCalc(Beginn : double; Ende : Double; var NightHours : Double);
var Nacht,Nacht1,Nacht2, std, std2, std3 : double; begin if beginn <= strtotime('6:00') then begin nacht1 := strtotime('6:00') - beginn; end else if Beginn >= strtotime('6:00') then begin nacht1 := strtofloat('0,00'); end; if Ende >= strtotime('20:00') then begin nacht2 := Ende - strtotime('20:00'); end else if Ende <= strtotime('20:00') then begin if Ende >= strtotime('06:00') then nacht2 := strtofloat('0,00'); end; NightHours := Nacht1 + Nacht2; end;
Delphi-Quellcode:
das ergebnis ist das geleiche denke ich mal. man sieht nur mal wieder das verschiedene wege nach rom Führen :)
procedure TForm1.ListView1DblClick(Sender: TObject);
var von, bis, TeilOne, TeilTwo : double; gesamt, TagGes, NachtGes : Double; begin TagGes := 0; TeilOne := 0; TeilTwo := 0; Gesamt := 0; FEingabe.Datum.Text := ListView1.ItemFocused.Caption; FEingabe.Von.text := ''; FEingabe.bis.Text := ''; if FEingabe.showModal = mrOK then begin With Tage[strtoint(ListView1.ItemFocused.Caption)] do begin Tag := TagName[DayOfTheWeek(StrToDate(ListView1.ItemFocused.Caption+'.'+inttostr(Monat.Items.IndexOf(Monat.Text)+1)+'.'+Jahr.Text))]; ArVon := Feingabe.Von.Text; ArBis := Feingabe.Bis.Text; von := StrToDateTime(FEingabe.Von.Text); bis := StrToDateTime(Feingabe.bis.Text); if von > bis then begin TeilOne := (StrToDateTime('23:59:59') - von); // zeit bis um 00:00 Uhr errechnen TeilTwo := (bis - StrToDateTime('00:00:01')); // zeit von null bis endzeit errechnen Gesamt := TeilOne + TeilTwo + StrToDateTime('00:00:02'); // Gesamtstunden errechnen NightCalc(von,bis,Gesamt,NachtGes); end else begin Gesamt := (bis - von); if Gesamt > (NachtGes) then Gesamt := (bis-von) else Gesamt := NachtGes; TagCalc(von,bis,NachtGes); end; if (von >= strtotime('20:00')) and (bis >= strtotime('20:00')) then NachtGes := gesamt; if (von <= strtotime('06:00')) and (bis <= strtotime('06:00')) then NachtGes := gesamt; TagGes := Gesamt - NachtGes; TStd := format('%.2f',[TagGes*24]); NStd := format('%.2f',[NachtGes*24]); GesamtStd := format('%.2f',[Gesamt*24]); end; with ListView1.ItemFocused do begin Subitems.Clear; SubItems.Add(Tage[strtoint(ListView1.ItemFocused.Caption)].Tag); SubItems.Add(FEingabe.Von.Text); Subitems.Add(Feingabe.bis.Text); Subitems.Add(Tage[strtoint(ListView1.ItemFocused.Caption)].TStd); Subitems.Add(Tage[strtoint(ListView1.ItemFocused.Caption)].NStd); Subitems.Add(Tage[strtoint(ListView1.ItemFocused.Caption)].GesamtStd); end; ListView1.GetNextItem(ListView1.ItemFocused,sdBelow,[isNone]).Selected := true; ListView1.GetNextItem(ListView1.ItemFocused,sdBelow,[isNone]).Focused := true; end; end; Danke für die Antowrten. gruss Sascha |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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