0

Arbeitstage-Wochentage zählen

Ich habe folgende Angaben:

Workday: Anzahl der Arbeitstage

Start: Datum Beginn

Ich möchte eine Schleife von Start so lange durchlaufen bis ich die Gesamtdauer (mit Sa und So) habe.

Dazu habe ich folgende Funktion ersucht, aber es ist irgendwie der Wurm drin.

 

function kalk_Dauer(Workday : number,Start : date) do
    let AT := 0;
    let WT := 0;
    Workday := Workday + 1;
    while AT < Workday do 
        if weekday(Start) < 5 then AT = AT + 1 end;
        Start := Start + 1;
        WT := WT + 1
    end;
    WT
end;

 

Hat jemand dazu eine Idee ??

9 Antworten

null
    • Developer by Smartplanung
    • smartplanung
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Wie wird die Zahl für Workday ermittelt? cnt() aus einer Tabelle oder Anzahl zwischen zwei Datumsfeldern?

    Bekommst Du eine Endlosschleife, wenn Du die Funktion so aufrufst?

    Weil wenn ich den Code richtig verstehe, würde while AT < Workday immer zutreffen weil AT nur erhöht wird, wenn Start im Verlauf kein Sa/So ist. Wenn AT aber bei einem Sa noch kleiner wie Workday ist, wird das immer so weitergehen, weil AT nicht mehr erhöht wird.

    Was möchtest Du mit WT am Ende machen? Ein Datum berechnen? Vielleicht gibt es einen anderen Weg. Aber dafür bräuchte ich mehr Infos, wo die Werte für die Funktionsvariablen herkommen und was am Ende das Ziel ist und am besten, was für Felder/Tabellen zur Verfügung stehen.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Workday ist die Anzahl der erforderlichen Arbeitstage. Der Wert wird im Funktionsfeld gebildet (mit Feiertagstabelle):

      let d1 := workdays(Bauanfang, Bauende);
      let DatMin := date(Bauanfang);
      let DatMax := date(Bauende);
      let z := cnt(select Feiertage where Datum <= DatMax and Datum >= DatMin and aktiv = 1 and weekday(Datum) <= 4);
      d1 - z

      Das mit while AT<Workday ist natürlich falsch.......dann ist die Endlosschleife weg

      Mit WT möchte ich die Wochentage (Arbeitstage+Feiertage+Sa+So) übergeben.

      Besser gesagt, ich brauche Dauer als Wochentage die ich aus den notwendigen Arbeitstagen berechne.  

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

       also wenn das Anfangs- und Enddatum vorhanden ist:

      days(Bauanfang, Bauende)

      Das zählt die Tage zwischen beiden Datumswerten, egal ob Wochenende oder Feiertag dabei ist.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Das ist ein Bauablaufplan und da sind die Arbeitstage wichtig wenn ich die Leistung verschiebe. Je nach Start sind dann mehr oder weniger Feiertage dabei, das ist das Problem.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       habe die Lösung hier im Forum gefunden:

      let myT := 0;
      let myD := Datum;
      while myT < Arbeitstage do
         myD := date(year(myD), month(myD), day(myD) + 1);
         if weekday(myD) < 5 then
            if cnt(select Feiertage where Datum = myD) < 1 then
               myT := myT + 1
            end
         end
      end;
      myD
      • Rafael_Sanchis
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Hi I.R.

      You have some simple DB to share this example. Appreciate.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Die DB ist schon relativ komplex und sind viele dienstliche Daten enthalten. Ich protokolliere und rechne damit Baustellen ab. Der Teil Bauablaufplan ist nur ein kleines Modul davon. Vielleicht leere ich mal die Tabellen und dann könnte ich sie öffentlich machen. Ist aber alles in deutsch.

      • Rafael_Sanchis
      • vor 1 Jahr
      • Gemeldet - anzeigen

      no problem I.R I translate 🙂 Take your time Tanks.

      • Wegener & Hinz GmbH
      • green_cup
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Da programmiere ich schon seit Jahren rum (von Stunde 0 sozusagen). Darum sind einige Sachen aus heutiger Sicht nicht optimal gelöst.