0

Wochenende bei Datumsausgabe in Datumsfeld überspringen

Ich habe ein Datumsfeld, welches mit einem Fälligkeitsdatum versehen ist. Bei wiederholenden Tasks wird dieses Datum entsprechend in die Zukunft verschoben. Sehr unschön ist aber dabei, dass die Wochenenden nicht berücksichtigt und übersprungen werden. Das kann ich gut mit einem Berechnungsfeld lösen, hätte aber gerne nur ein Datumsfeld mit Fälligkeitsangabe.

Ausgelöst wird die Aktion über einen Button "Erledigt" und folgendem Skipt:

let day := number(day(Datum));

let month := number(month(Datum));

let year := number(year(Datum));

let datum := Datum;

switch Wiederholung = 1 do

case Frequenz = 1:

                Datum := date(year, month, day + 'Häufigkeit')

case Frequenz = 2:

                Datum := date(year, month, day + 'Häufigkeit' * 7)

case Frequenz = 3 and day = 30:

                Datum := date(year, month + 'Häufigkeit' + 1, 0)

case Frequenz = 3 and day = 31:

                Datum := date(year, month + 'Häufigkeit' + 1, 0)

case Frequenz = 3 and month = 2 and day = 28:

                Datum := date(year, month + 'Häufigkeit' + 1, 0)

case Frequenz = 3 and month = 2 and day = 29:

                Datum := date(year, month + 'Häufigkeit' + 1, 0)

case Frequenz = 3:

                Datum := date(year, month + 'Häufigkeit', day)

case Frequenz = 4 and day(Datum) = 30:

                Datum := date(year, month(Datum) + 1 + 3 * 'Häufigkeit', 0)

case Frequenz = 4 and day(Datum) = 31:

                Datum := date(year, month(Datum) + 1 + 3 * 'Häufigkeit', 0)

case Frequenz = 4:

                Datum := date(year, month + 3 * 'Häufigkeit', day)

case Frequenz = 5:

                Datum := date(year + 'Häufigkeit', month, day)

end;

if Wiederholung != 1 then Datum := datum end;

if Wiederholung != 1 then Status := 1 end;

let x := Nr;

let c := (create Dokumentation);

let ma := first((select Mitarbeiter)[userEmail() = 'Ninox ID'].number(Nr));

let txt_einzel := "Erledigt";

let txt_tag := "Erledigt - " + weekdayName(day(datum)) + " | KW " + format(week(datum), "00") + " | " + year(datum);

let txt_woche := "Erledigt - KW " + format(week(datum), "00") + " | " + year(datum);

let txt_monat := "Erledigt - " + monthName(month(datum)) + " | " + year(datum);

let txt_quartal := "Erledigt - Q" + quarter(datum) + " | " + year(datum);

let txt_jahr := "Erledigt - " + year(datum);

let txt := if Wiederholung != 1 then

                               txt_einzel

                else

                               if Frequenz = 1 then

                                               txt_tag

                               else

                                               if Frequenz = 2 then

                                                               txt_woche

                                               else

                                                               if Frequenz = 3 then

                                                                               txt_monat

                                                               else

                                                                               if Frequenz = 4 then

                                                                                              txt_quartal

                                                                               else

                                                                                              if Frequenz = 5 then txt_jahr end

                                                                               end

                                                               end

                                               end

                               end

                end;

c.(Aufgaben := x);

c.(Bearbeiter := ma);

c.(Erledigungsmeldung := txt);

c.(Erledigungsdatum := today());

 

Hat jemand eine Idee ob das geht und wenn ja, wie.

Danke.

10 Antworten

null
    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Stephan,

    leider kann man hier gar nicht erkennen ob der Kode richtig oder falsch ist.
    vielleicht hielft dier das:

    ---

    Datum:=if weekday(Datum)>4

    then

    date(year(Datum),month(Datum),day(Datum) - weekday(Datum)+7)

    else Date

    end

    ---

    Leo

    • Stephan_S
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Leo, 

    danke für die rasche Antwort. 

    Ich habe Deinen Code in den bestehenden Button Code integriert und es funktioniert :-).

    Nun frage ich mich, ob ich Feiertage auch integrieren kann, hast Du mir eine Idee wie der Code aussehen könnte.

    Ich habe dazu nichts passendes gefunden, was ich übernehmen könnte.

    Besten Dank nochmals für die Hillfe.

    Gruss Stephan 

    • Stephan_S
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo zusammen,

    ich habe eine neue Tabelle für die Feiertage (FeiertagDatum, Wochentag, Name und KW) erstellt, in der ich die Feiertage eintrage. Jetzt möchte ich gerne, dass beim betätigen des Button «Erledigt» in der Wiederholfunktion die Feiertage aus der Feiertagstabelle berücksichtigt werden und analog der Wochenendprüfung auf das nächst mögliche Datum übersprungen wird. Beiliegend einige Screens zur besseren Verständnis meines Anliegens.

    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Stefan,

    der Code kann hier so aussehen:

    ---

    while (weekday(Datum)>4 or cnt(select Feiertage where FeiertagDatum=Datum)>0) do
    Datum:=date(year(Datum),month(Datum),day(Datum)+1)
    end

    ---

    Dieser Code ersetzt auch die Formel für Wochenenden.

    Leo

    • Stephan_S
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Leo, 

    danke für die Mitteilung. Leider bekomme ich mit diesem Code immer eine Fehlermeldung (siehe Anhang) beim Vergleich FeiertagDatum=Datum. Auf was bezieht sich dieses Datum? Wenn ich z. B. das =Datum klein schreibe (=datum) verschwindet zwar die Fehlermeldung. Beim Ausführen des Buttons zählt das Datumsfeld aber laufend hoch und ich muss Ninox schliessen oder den Browser aktualisieren um es zu stoppen. Ich hoffe, Du kannst mir einen Lösungsvorschlag machen. Danke und Gruss Stephan

    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    hallo Stephan, Datum bezieht sich auf die Tabelle in welcher du dich gerade befindest. Damit das Datum in der where Klausel auch ansprechbar ist, muss man das Feld vorher als Variable  deklarieren. Versuche es so:
     

    let me:=this;
    while (weekday(me.Datum)>4 or cnt(select Feiertage where FeiertagDatum=me.Datum)>0) do
    me.Datum:=date(year(me.Datum),month(me.Datum),day(me.Datum)+1)
    end
    

    Leo

      • Stephan_S
      • vor 2 Jahren
      • Gemeldet - anzeigen

       Leonid Semik  Hallo Leo, so klappt es ausgezeichnet. Danke vielmals für die Unterstützung. Gruss Stephan

      • Rafael_Sanchis
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Stephan Stucki Hi Stephan, can you place the complete script. Thanks

      • Stephan_S
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Rafael Sanchis attached the code. Best regards Stephan 

       

      let day := number(day(Datum));
      let month := number(month(Datum));
      let year := number(year(Datum));
      let datum := Datum;
      switch Wiederholung = 1 do
      case Frequenz = 1:
          Datum := date(year, month, day + 'Häufigkeit')
      case Frequenz = 2:
          Datum := date(year, month, day + 'Häufigkeit' * 7)
      case Frequenz = 3 and day = 30:
          Datum := date(year, month + 'Häufigkeit' + 1, 0)
      case Frequenz = 3 and day = 31:
          Datum := date(year, month + 'Häufigkeit' + 1, 0)
      case Frequenz = 3 and month = 2 and day = 28:
          Datum := date(year, month + 'Häufigkeit' + 1, 0)
      case Frequenz = 3 and month = 2 and day = 29:
          Datum := date(year, month + 'Häufigkeit' + 1, 0)
      case Frequenz = 3:
          Datum := date(year, month + 'Häufigkeit', day)
      case Frequenz = 4 and day(Datum) = 30:
          Datum := date(year, month(Datum) + 1 + 3 * 'Häufigkeit', 0)
      case Frequenz = 4 and day(Datum) = 31:
          Datum := date(year, month(Datum) + 1 + 3 * 'Häufigkeit', 0)
      case Frequenz = 4:
          Datum := date(year, month + 3 * 'Häufigkeit', day)
      case Frequenz = 5:
          Datum := date(year + 'Häufigkeit', month, day)
      end;
      let me := this;
      while weekday(me.Datum) > 4 or cnt(select Feiertage where FeiertagDatum = me.Datum) > 0 do
          me.(Datum := date(year(me.Datum), month(me.Datum), day(me.Datum) + 1))
      end
      ;
      if Wiederholung != 1 then Datum := datum end;
      if Wiederholung != 1 then Status := 1 end;
      let x := Nr;
      let c := (create Dokumentation);
      popupRecord(c);
      let ma := first((select Mitarbeiter)[userEmail() = 'Ninox ID'].number(Nr));
      let txt_einzel := "Nicht ausgeführt";
      let txt_tag := "Nicht ausgeführt - " + weekdayName(day(datum)) + " | KW " + format(week(datum), "00") + " | " + year(datum);
      let txt_woche := "Nicht ausgeführt - KW " + format(week(datum), "00") + " | " + year(datum);
      let txt_monat := "Nicht ausgeführt - " + monthName(month(datum)) + " | " + year(datum);
      let txt_quartal := "Nicht ausgeführt - Q" + quarter(datum) + " | " + year(datum);
      let txt_jahr := "Nicht ausgeführt - " + year(datum);
      let txt := if Wiederholung != 1 then
              txt_einzel
          else
              if Frequenz = 1 then
                  txt_tag
              else
                  if Frequenz = 2 then
                      txt_woche
                  else
                      if Frequenz = 3 then
                          txt_monat
                      else
                          if Frequenz = 4 then
                              txt_quartal
                          else
                              if Frequenz = 5 then txt_jahr end
                          end
                      end
                  end
              end
          end;
      c.(Aufgaben := x);
      c.(Bearbeiter := ma);
      c.(Erledigungsmeldung := txt);
      c.(Erledigungsdatum := today());
      c.(Erledigungszeit := now());
      'zuletzt ausgeführt' := date(today())
      
      • Rafael_Sanchis
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Stephan Stucki To many thanks.