Autor Beitrag
whitef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 202
Erhaltene Danke: 1

Windows X
Delphi XE X
BeitragVerfasst: Sa 09.01.16 23:54 
Hallo,

es liegt ein Datum vor (bsp. heute). zu diesem tag werden + N (bsp. 14 Tage) Tage berechnet.
Nun möchte ich prüfen ob Datum + N ein Feiertag, ein SA oder ein SO ist. Falls dies der Fall ist, dann verwende Datum + N + 1 (bzw. Datum + N + i) und prüfe dies erneut ob Feiertag/SA/SO.

Ich habe bereits die aktuellen Feiertage in einem Array. Und die Prüfung auf SA/SO habe ich mit "FormatSettings.ShortDayNames[DayOfWeek( ... )" umgesetzt;
nur fehlt mir momentan die integrierung von beidem...

Wie würdet ihr dies lösen?

Folgendes besteht bereits:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TFormDates.FormShow(Sender: TObject);
    var Feiertage : TFeiertageTable;
    i, FristDauer: Integer;
    DatumHeute, DatumFrist: TDate;
    DatumFristShortDay: String;
begin

  // Feiertage ermitteln & in Array "Feiertage" schreiben... (in extra Unit ausgelagert)
  Feiertage := GetFeiertageTable(CurrentYear);

  // FRIST
  FristDauer := 14;
  DatumHeute := Date();
  DatumFrist := IncDay(DatumHeute, FristDauer);
  DatumFristShortDay := FormatSettings.ShortDayNames[DayOfWeek( DatumFrist )];

  // Check ob DatumFrist ein Feiertag ist...
  for i := Low(Feiertage) to High(Feiertage) do
  begin
    if DatumFrist = Feiertage[i].Date then
    begin
      FristDauer := FristDauer + 1;
      DatumFrist := IncDay(DatumHeute, FristDauer);
      DatumFristShortDay := FormatSettings.ShortDayNames[DayOfWeek( DatumFrist )];
    end;
  end;
end;
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62
Erhaltene Danke: 27

Win95 - Win11 / MSServer2000 - MSServer2019
Delphi 6pro / XE4
BeitragVerfasst: So 10.01.16 11:59 
Hmm..

Wieso erst den Wochentag zu einem string machen? Vor allem, da der Wochentag Sprachspezifisch ist?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
uses
  DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if DayOfTheWeek(now) in [6,7then ShowMessage('Wochentag ist Sa/So!');
end;


Bei DayOfTheWeek ist 6 der Samstag und 7 der Sonntag.

Lagere deine Prüfroutine für den Feiertag in eine eigene Funktion aus, da Du nach jeder Incrementierung des Datums (IncDay()) sowohl auf Sa/So wie auch (wenn nicht Sa/So) auf Feiertag prüfen musst.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
uses
  DateUtils;

type
  TFeiertageTable = array of TDateTime;

function GetFeiertage : TFeiertageTable;
begin
  // array mit Feiertagen füllen und zurück geben
end;

function CheckInFeiertage(ADate : TDateTime; AFeiertageTable : TFeiertageTable):boolean;
var
  i : integer;
begin
  result := false;
  for i := 0 to length(AFeiertageTable)-1 do begin
    if DateOf(ADate) = DateOf(AFeiertageTable[i]) then begin
      result := true;
      break;
    end;
  end;
end;

function CheckInWeekend(ADateTime : TDateTime):boolean;
begin
  result := DayOfTheWeek(ADateTime) in [6,7];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  StartDate : TDateTime;
  FristDauer : integer;

  NextDate : TDateTime;
  Feiertage : TFeiertageTable;
begin
  StartDate := now;
  FristDauer := 14;
  Feiertage := GetFeiertage;


  NextDate := IncDay(StartDate,FristDauer); // Inc um FristDauer Tage

  while CheckInWeekend(NextDate) or CheckInFeiertage(NextDate,Feiertage) do
    incDay(NextDate,1);  // Um einen Tag erhöhen, wenn Sa/So/Feiertag

  // NextDate hat nun den nächsten Wochentag nach Sa/So/Feiertag
end;
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Mo 11.01.16 17:26 
Zur besseren Lesbarkeit kann man auch die Konstanten benutzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function CheckInWeekend(ADateTime : TDateTime): Boolean;
begin
  Result := DayOfTheWeek(ADateTime) in [DaySaturday, DaySunday];
end;
Florian71
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 24.08.17 23:13 
Um rauszufinden ob ein Datum ein Feiertag ist oder nicht, kannst Du diesen Web-Service / Micro-Service ausprobieren:

smart-webservice.com...blicholiday-service/

Da kann man auch Postleitzahlen / Bundesländer berücksichtigen lassen, z.B. ob das Datum 15.08.2017 im bundesland NRW ein Feiertag ist oder so.

Benötigt allerdings ein REST Zugriff - klappt z.B. über Indy Komponenten.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 25.08.17 00:23 
- Nachträglich durch die Entwickler-Ecke gelöscht -