AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Habe den überblick verloren....

Ein Thema von dor557 · begonnen am 11. Jan 2009 · letzter Beitrag vom 15. Jan 2009
Antwort Antwort
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Habe den überblick verloren....

  Alt 11. Jan 2009, 22:15
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:
  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]);
Hoffe es ist so weit verständlich... die Verschiedenen Variablen sind Double werte...

Danke für Jeden tipp...

Gruss Sascha
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Habe den überblick verloren....

  Alt 11. Jan 2009, 22:24
Ich würde ertmals DateTimePicker zur Auswahl der Uhrzeiten verwenden
Zudem gibt es in der Unit DateUtils Funktionen zur Zeitberechnung
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

Re: Habe den überblick verloren....

  Alt 11. Jan 2009, 22:41
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 ??
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
teosuper

Registriert seit: 23. Nov 2008
11 Beiträge
 
#4

Re: Habe den überblick verloren....

  Alt 12. Jan 2009, 21:57
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
Teo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

Re: Habe den überblick verloren....

  Alt 13. Jan 2009, 01:30
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:
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;
cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von dor557
dor557

Registriert seit: 23. Okt 2004
Ort: Walldorf
197 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

Re: Habe den überblick verloren....

  Alt 15. Jan 2009, 01:00
@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:
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;
und dann noch die

Delphi-Quellcode:
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;
und der aufruf geht dann wie folgt :

Delphi-Quellcode:
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;
das ergebnis ist das geleiche denke ich mal. man sieht nur mal wieder das verschiedene wege nach rom Führen

Danke für die Antowrten.

gruss Sascha
Sascha Nickel
Man muss die Dinge nehmen wie sie kommen, man kann aber auch dafür sorgen das die dinge so kommen wie man sie nehmen möchte.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 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