0

Berechnung Arbeitstage

Hallo Zusammen,

zuerst allen eine schöne Weihnacht.

Ich habe folgendes Problem. Ich brauche für meine Urlaubsplanung die exakten Arbeitstage. D.h. auch die Feiertage sollten berücksichtigt werden. Derzeit zähle ich die Tage mit folgender Formel:

workdays(Bis, Von)

Natürlich werden hier jetzt die Feiertage nicht berücksichtigt. Die Feiertage habe ich über einen Code realisiert:

var DatumAlsText := text(Datum);
var DatumAlsJahr := substr(DatumAlsText, 6, 10);
var DatumOhneJahr := substr(DatumAlsText, 0, 6);
var BerechnungsDatum := number(DatumAlsJahr);
let Farbe_blau := "rgb(191, 207, 255)";
function getOstersonntag(myYear : number) do
let k := myYear / 100;
let m := 15 + (3 * k + 3) / 4 - (8 * k + 13) / 25;
let s := 2 - (3 * k + 3) / 4;
let a := myYear % 19;
let d := (19 * a + m) % 30;
let r := (d + a / 11) / 29;
let og := 21 + d - r;
let sz := 7 - (myYear + myYear / 4 + s) % 7;
let oe := 7 - (og - sz) % 7;
let os := og + oe;
let OsterMonat := 2 + floor((os + 30) / 31);
let OsterTag := os - 31 * floor(OsterMonat / 4);
date(myYear, OsterMonat, OsterTag)
end;
function getKarfreitag(myYear : number) do
let myDate := getOstersonntag(myYear);
date(year(myDate), month(myDate), day(myDate) - 2)
end;
function getOstermontag(myYear : number) do
let myDate := getOstersonntag(myYear);
date(year(myDate), month(myDate), day(myDate) + 1)
end;
function getChristiHimmelfahrt(myYear : number) do
let myDate := getOstersonntag(myYear);
date(year(myDate), month(myDate), day(myDate) + 39)
end;
function getPfingstSonntag(myYear : number) do
let myDate := getOstersonntag(myYear);
date(year(myDate), month(myDate), day(myDate) + 49)
end;
function getPfingstMontag(myYear : number) do
let myDate := getOstersonntag(myYear);
date(year(myDate), month(myDate), day(myDate) + 50)
end;
function getFronleichnam(myYear : number) do
let myDate := getOstersonntag(myYear);
date(year(myDate), month(myDate), day(myDate) + 60)
end;
function getBussUndBettag(myYear : number) do
let startDate := date(myYear, 11, 22);
let startDayOfWeek := weekday(startDate);
let targetDayOfWeek := 2;
let diff := 0;
if startDayOfWeek < targetDayOfWeek then
diff := 2 - startDayOfWeek - 7
else
if startDayOfWeek > targetDayOfWeek then
diff := 2 - startDayOfWeek
end
end;
date(year(startDate), month(startDate), day(startDate) + diff)
end;
function getNeujahr(myYear : number) do
date(myYear, 1, 1)
end;
function getHeiligeDreiKoenige(myYear : number) do
date(myYear, 1, 6)
end;
function getTagDerArbeit(myYear : number) do
date(myYear, 5, 1)
end;
function getTagDerDeutschenEinheit(myYear : number) do
date(myYear, 10, 3)
end;
function getAllerheiligen(myYear : number) do
date(myYear, 11, 1)
end;
function getErstenWeihnachtstag(myYear : number) do
date(myYear, 12, 25)
end;
function getZweitenWeihnachtstag(myYear : number) do
date(myYear, 12, 26)
end;
let Auswertung := switch Datum do
case getNeujahr(BerechnungsDatum):
text("Neujahr")
case getHeiligeDreiKoenige(BerechnungsDatum):
text("Heilige Drei Könige")
case getKarfreitag(BerechnungsDatum):
text("Karfreitag")
case getOstermontag(BerechnungsDatum):
text("Ostermontag")
case getTagDerArbeit(BerechnungsDatum):
text("Tag der Arbeit")
case getChristiHimmelfahrt(BerechnungsDatum):
text("Christi Himmelfahrt")
case getPfingstMontag(BerechnungsDatum):
text("Pfingstmontag")
case getFronleichnam(BerechnungsDatum):
text("Fronleichnam")
case getTagDerDeutschenEinheit(BerechnungsDatum):
text("Tag der Deutschen Einheit")
case getAllerheiligen(BerechnungsDatum):
text("Allerheiligen")
case getErstenWeihnachtstag(BerechnungsDatum):
text("Erster Weihnachtsfeiertag")
case getZweitenWeihnachtstag(BerechnungsDatum):
text("Zweiter Weihnachtsfeiertag")
end;
styled(Auswertung, Farbe_blau, "BLACK", "")

Mein Problem ist allerdings, dass ich bei workdays nur die Dauer der Tage bekomme. Also keine Auflistung der Tage. Somit kann ich die Feiertage nicht berücksichtigen. Hat einer von Euch eine Idee dazu?

 

Grüße Michael

4 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Michael, ohne deinen Code jetzt genau interpretiert zu haben: Ich persönlich würde grundsätzlich eher mit einer Tabelle arbeiten, welche die Feiertage enthält, als sie jedes Mal neu zu berechnen. Zumal sie sich ja auch nach Bundesländern unterscheiden. Eine solche Tabelle mitsamt einer globalen Funktion zur Ermittlung, ob Feiertag oder nicht, fändest du bspw. in der DB "210_GlobaleFunktion_IstFeiertag" im Webinar-Team.

    Die einzelnen Tagesdaten zur Überprüfung ließen sich über eine Schleife ermitteln. Bei obiger Variante mit Tabellen und globaler Funktion könnte das bspw. so aussehen (Berechnungsfeld oder Button):

    let myDat := Von;
    let EndDat := Bis;
    let myPLZ := PLZ;
    let UTage := 0;
    while myDat <= EndDat do
        if weekday(myDat) < 5 and not IstFeiertag(myPLZ, myDat) then
            UTage := UTage + 1
        end;
        myDat := myDat + 1
    end;
    UTage

    Wobei das "if not IstFeiertag(myPLZ, myDat)" die globale Funktion 'IstFeiertag' aufruft, welche ein "true" oder "false" zurückgeben müsste. Bei anderer Berechnung des Feiertages müsste man diesen Teil halt entsprechend ersetzen.

    Aus Performancegründen wäre es wohl auch besser, die Berechnung immer nur einmalig mit einem Button durchzuführen, der nur nach Änderung der Von-/Bis-Werte erscheint.

    Nur so als Idee.

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

    vielen Dank für deine Hilfe. Werde es mal versuchen umzusetzen. Bundeslandunterscheidung brauche ich nicht. Die Feiertage werden nur einmal berechnet, sobald ein Datum eingegeben wird. Des Wegen ist eine Gloable Funktion nicht so wichtig für mich. Hatte die Meinung das es einen einfachen Weg gibt die verschiedenen Daten der einzelnen Tage auszuwerten. Scheint wohl nicht so zu sein. Dann wurschtel ich mich halt mal durch.

    Gruß Michael

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Michael, ob du den Code als globale oder lokale Funktion implementierst oder auch direkt in den Code integrierst,ist letztlich egal. Aber in deiner Konstellation ohne Bundesländer und Zusatzinfos wäre es tatsächlich noch viel einfacher. Du bräuchtest in der Tabelle 'Feiertage' im Grunde nur die Felder 'Datum' und 'Bezeichnung'. Dann könntest du die Feiertage als Trigger "Nach Änderung" in den Feldern 'Von' und 'Bis' einfäch zählen und von den Arbeitstagen abziehen. Hier mal am Beispiel mit drei Feldern zur Anzeige der berechneten Arbeits-, Feier- und Urlaubstage:

    if Von and Bis then
        let VonDat := Von;
        let BisDat := Bis;
        let FTage := cnt(select Feiertage where Datum >= VonDat and Datum <= BisDat and weekday(Datum) < 5);
        Feiertage := FTage;
        Arbeitstage := workdays(VonDat, BisDat);
        Urlaubstage := Arbeitstage - Feiertage
    end

    • Michael_Martin
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

    vielen Dank für deine Unterstützung. Werde meine DB mal versuchen entsprechend zu programmieren. Dir einen guten Rutsch ins neue Jahr :-)