AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeitstage berechnen

Ein Thema von LogoPie · begonnen am 25. Jan 2005 · letzter Beitrag vom 23. Mai 2009
Antwort Antwort
Seite 2 von 2     12   
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#11

Re: Arbeitstage berechnen

  Alt 26. Jan 2005, 13:15
Danke euch
werd später dann wieder das ergebnis Posten,
wenn mir nicht vorher die Birne platzt.
Used Advantage Database Server
  Mit Zitat antworten Zitat
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#12

Re: Arbeitstage berechnen

  Alt 26. Jan 2005, 15:06
Halt Stop bevor sich jemand die mühe macht zu schreiben.
Hab da noch ne Idee.
Used Advantage Database Server
  Mit Zitat antworten Zitat
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#13

Re: Arbeitstage berechnen

  Alt 26. Jan 2005, 15:18
Wie so oft nur ne kleinigkeit

Hier nun das Ergebnis
Unit 1
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2, Feiertage;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var hdays : THolidayTable;
    i : Integer;
  // j : Integer;
begin
     hdays:=GetHolidayTable(2005);
   // Edit1.Text := IntToDate(j);
     listbox1.items.Clear;
     for
        i:=0 to high(hdays)do
        listbox1.items.Add(DateToStr(hdays[i].date)+' '+hdays[i].name);
end;

end.
Wie sicher schon jemand bemerkt hat habe ich versucht das Jahr über ein Editfeld einzugeben
mit mäßigem erfolg. Habe diverse Datentypen probiert, aber immer flogen mir neue Fehlermeldungen an
den Kopf. Vielleicht weiß ja jemand eine Lösung. Meist ging es um konfligte mit Date und Word.

Unit 2
Delphi-Quellcode:
unit Unit2;

interface

uses Windows, SysUtils;

type
    THoliday = Record
        Date: TDateTime;
        Name: String;
    End;
    THolidayTable = Array Of THoliday;

    Function GetHolidayTable(Year: Word): THolidayTable;

implementation

Function GetHolidayTable(Year: Word): THolidayTable;

    Procedure AddHoliday(DD, MM: Word; HDName: String); Overload;
    Begin
        SetLength(Result, High(Result) + 2);
        With Result[High(Result)] Do
        Begin
            Date := EncodeDate(Year, MM, DD);
            Name := HDName;
        End;
    End;

    Procedure AddHoliday(HDDate: TDateTime; HDName: String); Overload;
    Begin
        SetLength(Result, High(Result) + 2);
        With Result[High(Result)] Do
        Begin
            Date := HDDate;
            Name := HDName;
        End;
    End;

    Function GetEasterDate(YYYY: Word): TDateTime;
    Var
        A, B, C, D, E, F, G, H, I, K, L, M, N, P: Word;
        DD, MM: Word;
    Begin
        a := YYYY Mod 19;
        b := YYYY Div 100;
        c := YYYY Mod 100;
        d := b Div 4;
        e := b Mod 4;
        f := (b + 8) Div 25;
        g := (b - f + 1) Div 3;
        h := (19 * a + b - d - g + 15) Mod 30;
        i := c Div 4;
        k := c Mod 4;
        l := (32 + 2 * e + 2 * i - h - k) Mod 7;
        m := (a + 11 * h + 22 * l) Div 451;
        n := (h + l - 7 * m + 114) Div 31;
        p := (h + l - 7 * m + 114) Mod 31 + 1;
        DD := p;
        MM := n;
        Result := EncodeDate(YYYY, MM, DD);
    End;
Var
    EDate: TDateTime;
Begin
    AddHoliday(1, 1, 'Neujahr');
    AddHoliday(1, 5, 'Tag der Arbeit');
    AddHoliday(3, 10, 'Tag der deutschen Einheit');
    AddHoliday(25, 12, '1. Weihnachtsfeiertag');
    AddHoliday(26, 12, '2. Weihnachtsfeiertag');
    AddHoliday(1, 11, 'Allerheiligen');
    EDate := GetEasterDate(Year);
    AddHoliday(EDate + 60, 'Fronleichnam');
    AddHoliday(EDate - 2, 'Karfreitag');
    AddHoliday(EDate + 1, 'Ostermontag');
    AddHoliday(EDate + 39, 'Christi Himmelfahrt');
    AddHoliday(EDate + 50, 'Pfingstmontag');
End;

end.
Used Advantage Database Server
  Mit Zitat antworten Zitat
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#14

Neu Arbeitstage berechnen

  Alt 26. Jan 2005, 17:03
siehe einen darüber
Used Advantage Database Server
  Mit Zitat antworten Zitat
shmia

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

Re: Arbeitstage berechnen

  Alt 26. Jan 2005, 17:47
Also ich würde die Feiertagsliste vom Zählen der Arbeitstage getrennt halten.
Dies lässt sich mit einer Callback-Funktion erreichen.
siehe auch Code-Library: http://www.delphipraxis.net/internal...ct.php?t=22228

Delphi-Quellcode:
type
// callback function for holidays
THolidayCallback = function(const d:TDateTime):boolean;

function NumWorkDays(StartDate,EndDate:TDateTime; callback:THolidayCallback):Integer;
Begin
   Result := 0;
   While StartDate <= EndDate do
   begin
      If (DayOfWeek(StartDate) in [2..6]) and not callback(StartDate) Then
         Inc(Result);
      StartDate := StartDate + 1;
  End;
End;
Andreas
  Mit Zitat antworten Zitat
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#16

Re: Arbeitstage berechnen

  Alt 27. Jan 2005, 09:21
Blöd ist nur das sich das Datum direkt im Quelltext befinden muss.
Hab schon einige male probiert es über ein Textfeld abzufragen aber,
es tauchen immer wieder konflikte auf.
Vielleicht kann mir jemand den entscheidenen Tip geben.
Used Advantage Database Server
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Arbeitstage berechnen

  Alt 27. Jan 2005, 09:30
Zitat von LogoPie:
Blöd ist nur das sich das Datum direkt im Quelltext befinden muss....
Welches Datum muss ich im Quelltext befinden?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#18

Re: Arbeitstage berechnen

  Alt 27. Jan 2005, 09:41
Args Sorry nich das Datum das Jahr für die Berechnung meinte ich.
Used Advantage Database Server
  Mit Zitat antworten Zitat
LogoPie

Registriert seit: 7. Okt 2003
106 Beiträge
 
Delphi 5 Professional
 
#19

Re: Arbeitstage berechnen

  Alt 27. Jan 2005, 10:39
So hat hingehauen
Delphi-Quellcode:
year : Integer;
begin
     year := StrToInt (Edit1.Text);
     hdays:=GetHolidayTable(year);
Used Advantage Database Server
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#20

Re: Arbeitstage berechnen

  Alt 23. Mai 2009, 14:45
Ergänzung Ostersonntag:

Zitat Wikipedia:

Zitat:
Obwohl die Gaußsche Osterformel den Oster-Algorithmus elegant kurz darstellt, werden zwei Ausnahmen von ihr nicht erfasst. Heiner Lichtenberg hat 1997 eine Modifikation der Formel vorgeschlagen, mit der keine Ausnahmen extra beachtet werden müssen. Diese Formel ist nachfolgend wiedergegeben
http://de.wikipedia.org/wiki/Gaußsche_Osterformel

1. die Säkularzahl: K(X) = X div 100
2. die säkulare Mondschaltung: M(K) = 15 + (3K + 3) div 4 − (8K + 13) div 25
3. die säkulare Sonnenschaltung: S(K) = 2 − (3K + 3) div 4
4. den Mondparameter: A(X) = X mod 19
5. den Keim für den ersten Vollmond im Frühling: D(A,M) = (19A + M) mod 30
6. die kalendarische Korrekturgröße: R(D,A) = D div 29 + (D div 28 − D div 29) (A div 11)
7. die Ostergrenze: OG(D,R) = 21 + D − R
8. den ersten Sonntag im März: SZ(X,S) = 7 − (X + X div 4 + S) mod 7
9. die Entfernung des Ostersonntags von der
Ostergrenze (Osterentfernung in Tagen): OE(OG,SZ) = 7 − (OG − SZ) mod 7
10. das Datum des Ostersonntags als Märzdatum
(32. März = 1. April usw.): OS = OG + OE


hier habe ich folgenden Code nach dieser Formel gefunden:


http://cerebrumsoft.org/node/54

Delphi-Quellcode:
(* Hucke
  Berechnung des Ostersonntag
  Algorithmus nach Gauß
  modifiziert von Lichtenberg
  aus: Wikipedia "Gaußsche Osterformel" 26.02.2008
*)

 
uses
    sysutils;
 
function EasterSunday_Lichtenberg(const Jahr :integer): TDateTime;
var
    k, // Säkularzahl säkular = weltlich im Gegensatz zu kirchlich
    m, // säkulare Mondschaltung
    s, // säkulare Sonnenschaltung
    a, // Mondparameter
    d, // erster Vollmond im Frühling
    r, // kalendarische Korrekturgröße
    og, // Ostergrenze
    sz, // erster Sonntag im März
    oe, // Differenz Ostersonntag Ostergrenze (Osterentfernung)
    os, // Ostersonntag als Märzdatum
    tag,
    monat : integer;
 
begin
    k := Jahr div 100;
    m := 15 + (3 * k + 3) div 4 - (8 * k + 13) div 25;
    s := 2 - (3*k + 3 ) div 4;
    a := Jahr mod 19;
    d := (19 * a + m ) mod 30;
    r := d div 29 + (d div 28 - d div 29) * (a div 11);
    og := 21 + d - r;
    sz := 7 - (Jahr + Jahr div 4 + s ) mod 7;
    oe := 7 - (og - sz) mod 7;
    os := og + oe;
 
    if os <= 31 then begin
       Tag := os;
       Monat := 3;
    end
    else begin
       Tag := os - 31;
       Monat := 4;
    end;
 
    result := encodedate(jahr, Monat, Tag);
 
end;
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 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