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]