Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

nächster oder vorhergehender Arbeitstag

  Alt 2. Apr 2004, 08:44
hier zeige ich zwei Funktionen zur Berechnung des nächsten oder vorhergehenden Arbeitstags.
Arbeitstage sind Montag bis Freitag

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]
Andreas
  Mit Zitat antworten Zitat