AGB  ·  Datenschutz  ·  Impressum  







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

Berechnungen mit Arbeitstagen

Ein Thema von Fridolin · begonnen am 28. Okt 2009 · letzter Beitrag vom 28. Okt 2009
Antwort Antwort
Fridolin

Registriert seit: 8. Jan 2007
71 Beiträge
 
Delphi 2006 Architect
 
#1

Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 12:39
Hallo zusammen,

ich habe folgendes Problem:

Ich möchte von einem Datum eine Anzahl x Tage substrahieren. Das besondere dabei ist, dass in der Berechnung die Wochenenden übersprungen werden sollen.

Wenn also z.B. der 22.09.2009 das Enddatum ist (am Ende des Tages ist das Projekt abgeschlossen) und ich nun Rückwerts rechnen will, um zu berechnen, wann man anfangen muss, dann muss ich rechnen:

Endtermin - x = Starttermin

z.B. :

ohne Berücksichtigung der Wochenenden:
22.09.2009 - 30 = 24.08.2009

mit Berücksichtigung der Wochenenden:
22.09.2009 - 30 = 12.08.2009

Gibt es dafür evtl. eine fertige Funktion?

Ich bin für jede Hilfe sehr dankbar!

Mit freundlichen Grüßen,

Fridolin
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 12:42
Hallo,

würde ich selber schreiben.
Delphi-Quellcode:
iMaxDays:= 10;
iDays:= 0;


tdtStartDate:= '22.09.2009';
tdtCurDate:= tdtStartDate+1.0;

repeat
  tdtCurDate:= tdtCurDate-1.0;
  if DayOfWeek(tdtCurDate)<>So and <>Sa then
  begin
    Inc(iDays);
    if iDays=iMaxDays then break;
  end;
until False;

Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 13:07
Hier ist noch ein Beitrag mit nochmehr Beispielen.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 13:08
Theoretisch sollte es möglich sein, dieses auch ohne Schleife zu berechnen,
aber irgendwie wollte das gard nicht so klappen

- schauen wo in der Woche man sich gerade befindet
- das Datum zum Wochenanfang zurückrechnen und sich die Tage in der aktuellen Woche merken
- Restzeit durch 5 mal 7 (Ganzzahldivision ... Rest merken)
- Produkt nehmen und die gemerten Tage/Reste wieder dazurechnen
- Datum - diese Summe = Anfang
(nja, so in etwa irgendwie)


aber mit 'ner Schleife ginge es wohl auch so
(DayOfTheWeek: 1=Montag ... 7=Sonntag)
Delphi-Quellcode:
Type TDayOfTheWeekSet = Set of 1..7;

Function IncDays(D: TDateTime; Days: Integer = 1; Ignored: TDayOfTheWeekSet = [6, 7]): TDateTime;
  Var i: Integer;

  Begin
    i := 0;
    While Days > 0 do Begin
      If not (DayOfTheWeek(D + i) in Ignored) Then Dec(Days);
      Inc(i);
    End;
    While Days < 0 do Begin
      If not (DayOfTheWeek(D + i) in Ignored) Then Inc(Days);
      Dec(i);
    End;
    Result := D + i; // wegen Rundungsfehlern erst hier einrechnen
  End;

Function DecDays(D: TDateTime; Days: Integer = 1; Ignored: TDayOfTheWeekSet = [6, 7]): TDateTime;
  Begin
    Result := IncDays(D, -Days, Ignored);
  End;
[edit]
die Definition des SET vergessen

nja, wenn ich den Baitrag von marabu so seh, dann lieg ich schonmal mit meiner Überlegung nicht ganz falsch
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#5

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 13:40
Ich möchte hier gerne noch in den Raum werfen, daß eigentlich auch der Samstag ein Werktag ist
Darum die Frage, ob das nicht parametrisierbar sein könnte, Mo-Fr oder eben Mo-Sa.

Sherlock
Oliver
  Mit Zitat antworten Zitat
Fridolin

Registriert seit: 8. Jan 2007
71 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 13:46
Bei uns ist am Samstag (Gott sei Dank) der Laden dicht .

Ich danke euch allen!

Mit himitsu Lösung hat es wunderbar funktioniert .

Vielen Dank!

Gruß,

Fridolin
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 13:50
Zitat von Fridolin:
Bei uns ist am Samstag (Gott sei Dank) der Laden dicht .

Ich danke euch allen!

Mit himitsu Lösung hat es wunderbar funktioniert .

Vielen Dank!

Gruß,

Fridolin
Mal noch ne Frage: Was ist denn mit Feiertagen?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 13:53
Hallo,

Zitat:
Feiertage
deshalb ja auch meine Schleife.

Es soll ja Leute geben, die z.B. Montag frei haben,
dafür Samstag arbeiten.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: Berechnungen mit Arbeitstagen

  Alt 28. Okt 2009, 14:24
Mit veränderbaren Tagen wird ein Schleifenloses rechnen aber immer schwerer


Delphi-Quellcode:
// 1=Monday ... 7=Sunday

Function IncDays(D: TDateTime; Days: Integer = 1;
  WorkingDays: TDayOfTheWeekSet = [1..5]): TDateTime;

Function IncDays(D: TDateTime; Days: Integer; WorkingDays: TDayOfTheWeekSet;
  Holidays: Array of TDateTime): TDateTime;

Function DecDays(D: TDateTime; Days: Integer = 1;
  WorkingDays: TDayOfTheWeekSet = [1..5]): TDateTime;

Function DecDays(D: TDateTime; Days: Integer; WorkingDays: TDayOfTheWeekSet;
  Holidays: Array of TDateTime): TDateTime;
Delphi-Quellcode:
Uses Math, DateUtils;

Type TDayOfTheWeekSet = Set of 1{Monday}..7{Sunday};

Function IncDays(D: TDateTime; Days: Integer = 1;
    WorkingDays: TDayOfTheWeekSet = [1..5]): TDateTime; Overload;

  Var i: Integer;

  Begin
    i := 0;
    While Days > 0 do Begin
      If DayOfTheWeek(D + i) in WorkingDays Then Dec(Days);
      Inc(i);
    End;
    While Days < 0 do Begin
      If DayOfTheWeek(D + i) in WorkingDays Then Inc(Days);
      Dec(i);
    End;
    Result := D + i;
  End;

Function IncDays(D: TDateTime; Days: Integer; WorkingDays: TDayOfTheWeekSet;
    Holidays: Array of TDateTime): TDateTime; Overload;

  Var i: Integer;

  Function isWorkingDays: Boolean;
    Var i2: Integer;
      D2: TDateTime;

    Begin
      Result := DayOfTheWeek(D + i) in WorkingDays;
      If not Result Then Exit;
      Result := False;
      D2 := Trunc(D + i);
      i2 := High(Holidays);
      While i2 >= Low(Holidays) do
        If SameValue(Trunc(Holidays[i2]), D2) Then Exit Else Dec(i2);
      Result := True;
    End;

  Begin
    i := 0;
    While Days > 0 do Begin
      If isWorkingDays Then Dec(Days);
      Inc(i);
    End;
    While Days < 0 do Begin
      If isWorkingDays Then Inc(Days);
      Dec(i);
    End;
    Result := D + i;
  End;

Function DecDays(D: TDateTime; Days: Integer = 1;
    WorkingDays: TDayOfTheWeekSet = [1..5]): TDateTime; Overload;
  Begin
    Result := IncDays(D, -Days, WorkingDays);
  End;

Function DecDays(D: TDateTime; Days: Integer; WorkingDays: TDayOfTheWeekSet;
    Holidays: Array of TDateTime): TDateTime; Overload;
  Begin
    Result := IncDays(D, -Days, WorkingDays, Holidays);
  End;
$2B or not $2B
  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:32 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