Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Werktage zählen (https://www.delphipraxis.net/72925-werktage-zaehlen.html)

norbert3 9. Jul 2006 12:30


Werktage zählen
 
Hey Leute,

ich möchte die Werktage zwischen zwei eingegebenen Datumswerte zählen. Weiss leider nicht wie?

Um die Anzahl zu bekommen habe ich es mal so angefangen:
Delphi-Quellcode:
a := StrToDate(Edit1.Text);        //Startdatum
b := StrToDate(Edit2.Text);       //EndDatum
i := trunc(b)- trunc(a);
  Label5.Caption := 'Beantragte Tage incl. Wochenende: '+ IntToStr(i+1);
Mein Problem: Ich möchte kein Wochenende mitzählen!!
Mfg Norbert

Hansi 9. Jul 2006 12:40

Re: Werktage zählen
 
Hey,

Mit
Delphi-Quellcode:
datum := DayOfWeek(Edit1.Text)
bekommst du den Wochentag raus.

Delphi-Quellcode:
case datum of
    1: ...; // Sonntag
    2: ...; // Montag
    3: ...; // Dienstag
    4: ...; // Mittwoch
    5: ...; // Donnerstag
    6: ...; // Freitag
    7: ...; // Samstag
  Else
    ...
  end;

Mit den Integerwerten musst Du halt weitermachen.

Union 9. Jul 2006 12:46

Re: Werktage zählen
 
Und vielleicht hiltf Dir dabei auch dies Feiertage anzeigen

norbert3 9. Jul 2006 12:50

Re: Werktage zählen
 
Hey ,

mit DayOfWeek habe ich es schon probiert. Da erhalte ich aber nur den 1. Tag.

Wie bekommt man das hin, dass die Tage automatisch eventl. in einer Schleife bis zum Enddatum durchlaufen und auf ihren Wert geprüft werden?

Norbert

Jelly 9. Jul 2006 12:57

Re: Werktage zählen
 
Zitat:

Zitat von norbert3
Wie bekommt man das hin, dass die Tage automatisch eventl. in einer Schleife bis zum Enddatum durchlaufen und auf ihren Wert geprüft werden?

Delphi-Quellcode:
function CountWeekDays (Datum1, Datum2 : TDateTime) : integer ;
var
   i : integer ;

   function IstWerkTag (Datum : TDateTime) : boolean ;
   begin
        Result := not (DayOfWeek (Datum) in [1,7]) ; // 1=Sonntag, 7=Samstag
        // Hier kannst Du eventuell noch auf Feiertag prüfen
   end ;

begin
     Result := 0 ;
     for i := trunc(Datum1) to trunc(Datum2) do begin
         if IstWerkTag(i) then
              inc (Result) ;
     end ;
end ;

procedure TForm13.Button1Click(Sender: TObject);
var
  D1, D2 : TDateTime ;
begin
     D1 := EncodeDate (2006,1,1) ;
     D2 := EncodeDate (2006,12,31) ;
     caption := IntToStr (CountWeekDays (D1, D2)) ;
end;

marabu 9. Jul 2006 13:08

Re: Werktage zählen
 
Hier noch etwas Code, der ohne brute force auskommt:

Delphi-Quellcode:
uses
  DateUtils; // DayOfTheWeek(1) = Montag

function DaysBetweenEx(d1, d2: Cardinal): Cardinal;
// SA und SO werden nicht gezählt
var
  n, r, wd: Cardinal;
begin
  n := Succ(DaysBetween(Trunc(d1), Trunc(d2)));
  Result := n - (n div 7) shl 1;
  r := n mod 7;
  if r = 0 then Exit;
  if d2 > d1
    then wd := DayOfTheWeek(d1)
    else wd := DayOfTheWeek(d2);
  n := Pred(wd + r);
  if 6 in [wd, n] then Dec(Result);
  if 7 in [wd, n] then Dec(Result);
end;
Grüße vom marabu

norbert3 9. Jul 2006 13:24

Re: Werktage zählen
 
Hey,

erstmal danke für die schnellen Antworten.
@Jelly: wie gelingt es mir , die zwei Eingabefelder einzubinden?

mit einfach:
Delphi-Quellcode:
a := StrToDate(Edit1.Text);
klappt es nicht.

Was mache ich falsch??

Norbert


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