Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   nächster oder vorhergehender Arbeitstag (https://www.delphipraxis.net/19389-naechster-oder-vorhergehender-arbeitstag.html)

shmia 2. Apr 2004 08:44


nächster oder vorhergehender Arbeitstag
 
hier zeige ich zwei Funktionen zur Berechnung des nächsten oder vorhergehenden Arbeitstags.
Arbeitstage sind Montag bis Freitag :spin2:

Feiertage werden über eine Callback-Funktion ausgefiltert.
Man kann auch ohne Callback-Funktion arbeiten; dann könnten Feiertage
allerdings als Arbeitstage angesehen werden.

Zuerst die Deklarationen im Interface:
Delphi-Quellcode:
// callback function for holidays
THolidayCallback = function(const d: TDateTime): boolean;

function PrevWorkingDay(const date:TDateTime; callback:THolidayCallback): TDateTime;
function NextWorkingDay(const date:TDateTime; callback:THolidayCallback): TDateTime;
und nun die eigentlichen Funktionen:
Delphi-Quellcode:
function PrevWorkingDay(const date: TDateTime; callback: THolidayCallback): TDateTime;
begin
  Result := Int(date) - 1.0; // = Gestern

  if Assigned(callback) then
    while (DayOfWeek(Result) in [1,7]) or callback(Result) do
      Result := Result - 1.0
  else
    while (DayOfWeek(Result) in [1,7]) do
      Result := Result - 1.0;
end;

function NextWorkingDay(const date: TDateTime; callback: THolidayCallback): TDateTime;
begin
  Result := Int(date) + 1.0; // = Morgen

  if Assigned(callback) then
    while (DayOfWeek(Result) in [1,7]) or callback(Result) do
      Result := Result + 1.0
  else
    while (DayOfWeek(Result) in [1,7]) do
      Result := Result + 1.0;
end;
Und zu guter Letzt ein Beispiel für die Callback-Funktion und ein Anwendungsbeispiel:
Delphi-Quellcode:
function IsHoliday(const d: TDateTime): boolean;
var
  year, month, day;
begin
  Result := False;
  DecodeDate(d, year, month, day);
  if (month = 12) and ((day = 25) or (day = 26)) then
    result := True  // christmas
  else if (month = 12) and (day = 31) then
    result := True  // sylvester
  else if (month = 1) (day = 1) then
    result := True
  else
  begin
    // weitere Abfragen
    // z.B. in einer Datenbank Tabelle nachschauen
  end;
end;

procedure Test;
begin
  ShowMessage('nächster Arbeitstag: ' + DateToStr(NextWorkingDay(Now, IsHoliday)));
end;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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