0

rollierende Verlängerung

Liebe Forumsteilnehmer:innen,

wie kann eine formel für eine verlängerung um einen monat aussehen, die ab einem datum beginnt und sich bei erreichen des nächsten datums immer wieder rollierend um einen monat verlängert?

22 Antworten

null
    • truthein
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Du willst alle 30 Tage das Zieldatum um 30 weitere Tage vorverschieben, ich geh mal von 30 Tage = 1 Monat aus:

    start + (floor(days(von, fliess) / 30) + 1) * 30

    «fliess» ist das bewegliche Datum (zB. today()), «start» ist ein festes Startdatum. Ergebnis der Formel ist das nächste ganzzahlige Vielfache von 30 Tagen nach «start», das «fliess» vorausliegt. So in der Art müsste das gehen.

    • Horst_Fertig
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Servus !

    Und erst einmal Verständisfrage meinerseits: Wer oder was, oder welches "Ereignis" soll denn solch eine (wie auch immer gebaute) Formel auslösen? Ein Trigger (falls ja, auf welcher Ebene), ein Klick auf einen Button der dann eine bestimmte (andere) Aktion auslöst?

    Oder eben ein konkretes (und manuell oder durch eine andere Aktion, wie z.B. das Erstellen einer Rechnung, etc.) verändertes Datumsfeld ("Letztes Ereignis") wie in diesem kleinen Beispiel...

    Grüße

    HF

    • Wilfried_Hennen
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Zur Erläuterung:

    Ich habe ein Startdatum (=Lieferbeginn) und ein 1. Endedatum (SV_LZ_bis); Nach dem Erreichen des 1. Endedatum soll eine Vertragsverlängerung immer um einen Monat in die Zukunft erfolgen.

    Beispiel:

    Das 1. Endedatum ist der 15.07.2023; nach Überschreiten des 15.07.2023 wäre das nächste Endedatum der 14.08.2023, nach Überschreiten des 14.08.2023 wäre das nächste Endedatum der 13.09.2023 usw.

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen

       ich denke, dass es so funktioniert:

      let df := days(Enddatum, today());
      if df >= 0 then
          (1 + floor(df / 30)) * 30 + Enddatum
      else
          Enddatum
      end

      oder geht das nicht?

      • Horst_Fertig
      • vor 9 Monaten
      • Gemeldet - anzeigen

       

      Servus !

      Ernsthaft? Jeden Monat rückt das "Enddatum" damit um einen Tag nach vorn (15.07 - 14.08. - 13.09. etc.?).

      Wie wäre denn so eine Konstruktion...

      Ich hoffe, der Screenshot und die kleinen Erläuterungen darin sind halbwegs verständlich. Und möglicherweise vielleicht sogar das Ziel der Übung, oder kapier ich das Ziel der Übung völlig falsch?

      Grüße

      HF

      • Horst_Fertig
      • vor 9 Monaten
      • Gemeldet - anzeigen

       

      Hoppla, hatte etwas im Text des Screenshots vergessen, deshalb hier nochmal neuer Versuch...

      • mirko3
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Hi Wilfried. Was wäre denn das Wunschergebnis für den 31.01.2023? Mirko

      • Wilfried_Hennen
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Hi Mirko,

      für meine Zwecke ist das deutsche Vertragsrecht maßgebend. Dort wird üblicherweise eine "Monatsverlängerung" als "genau 30 Tage" interpretiert. Das bedeutet, dass die Verlängerung des Vertrags um den Zeitraum eines Monats genau 30 Tage beträgt, unabhängig von der tatsächlichen Anzahl der Tage im betreffenden Monat.

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Wilfried Henneneben, ja, deswegen hab ich ja auch 30 Tage genommen. Wieso funktioniert das denn nicht mit der Formel für ein Formelfeld (?) (s.o.) Was klappt da nicht?

      • mirko3
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Okay. Dann könnte es so gehen. Mirko

      let dat := SV_LZ_bis;
      date(year(dat), month(dat), day(dat) + 30)
      
      • Horst_Fertig
      • vor 9 Monaten
      • Gemeldet - anzeigen

       

      Servus !

      Also wenn's denn doch die exakt 30 Tage jeweils sein sollen, trifft die Formel von trut hein (s.u.) den Nagel sicherlich auf den Kopf, denke ich...

      Falls es aber doch mal "Monat" sein darf (oder soll) wäre zu meinem weiter oben gezeigten Screenshot ("Momentanes Enddatum") das folgende mein Weg dahin gewesen...

      if Status = 2 then
          "Abo wurde beendet"
      else
          let myM := (year(today()) - year(Startdatum)) * 12 + month(today()) - month(Startdatum) + 1;
          text(date(date(year(Startdatum), month(Startdatum) + myM, day(Startdatum))))
      end

       

      Grüße

      HF

      • Wilfried_Hennen
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Hallo Mirko,

      ich habe deiner Formel noch etwas vorangestellt:

      if today() >= '1.SV_LZ_bis' and Vertragsstand = "aktiv" then
          let dat := '1.SV_LZ_bis';
          date(year(dat), month(dat), day(dat) + 30)
      else
          null
      end

      Dann funktioniert es für die erste Verlängerung.

      Wenn allerdings das Datum der 1. Verlängerung erreicht/überschritten ist, dann müssten wieder 30 Tage verlängert werden. Das geht dann doch wohl nur mit einem weiteren Feld?!

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Wilfried Hennen ich bleibe bis auf Gegenbeweis dabei, das geht so in genau einem Formelfeld:

      let df := days(Enddatum, today());
      if df >= 0 then
          (1 + floor(df / 30)) * 30 + Enddatum
      else
          Enddatum
      end

      wieso sollte das nicht gehen?

      • Wilfried_Hennen
      • vor 9 Monaten
      • Gemeldet - anzeigen

      ich habe deine Formel angepasst in

      let df := days('1.SV_LZ_bis', today());
      if df >= 0 then
          (1 + floor(df / 30)) * 30 + '1.SV_LZ_bis'
      else
          '1.SV_LZ_bis'
      end

      und mit folgendem Datumswert geprüft:

      1. SV_LZ_bis = 31.08.2023

      Dann darf in dem Feld nächste_SV_LZ_bis (das neue Formelfeld) "nichts" stehen, da ja der 31.08.2023 noch nicht erreicht ist. Allerdings steht in diesem Feld der 31.08.2023!

      Habe ich bei der Anpassung der Formel etwas falsch gemacht?

      • Ninox-Professional
      • planoxpro
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Ersetze im "else"-Zweig  '1.SV_LZ_bis' durch "null" (ohne Anführungszeichen). Dann steht da ggf. "nichts".

      • Wilfried_Hennen
      • vor 9 Monaten
      • Gemeldet - anzeigen

      ok, danke passt!

      Mir ist noch eingefallen, dass als weitere Bedingung das Feld=Vertragsstand auf "aktiv" stehen muss. Setze ich das als erste Bedingung?

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Edit: Das war glaub ich Quatsch, hab zu schnell getippt, ein Formelfeld kann keine Zuweisungen machen ....

      Wilfried Hennen  Frage ist, wann diese Zuweisung geschehen soll. Ich gehe mal davon aus, dass du das dann möchtest, wenn auch das rollende Datum angezeigt wird. In dem Fall setzt du deinen Zuweisungsbefehl «Vertragsstand := "aktiv"» in den "if df >=0" Zweig.

      • Ninox-Professional
      • planoxpro
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Wobei die Abfrage auf den Textwert der Auswahl ("aktiv") mit text() erfolgen sollte, also

      text(Vertragsstand) = "aktiv"

      Oder alternativ eben auf die Nummer des Auswahl-Eintrags "aktiv".

      Wenn ich es richtig sehe, würde allerdings gar kein Datum mehr angezeigt, sobald der Vertragsstand bspw. auf "gekündigt" gesetzt wird, auch wenn das Datum in der Zukunft liegt. Ich bin mir auch nicht sicher, ob sich das überhaupt alles mit einem einzigen Formelfeld abbilden ließe.

    • truthein
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Weiss ich grad auch nicht. Das Formelfeld zeigt das rollenden Datum. Wie nun simultan ein anderer Feldwert gesetzt wird (?) weiss ich jetzt auch nicht. Das müsste selber eine Formel sein oder so etwas. Das ist eine neue Frage.

    Oder müssen wir das anders verstehen, so dass das rollende Datum nur dann angezeigt wird, falls "Vertragsstand = aktiv"?

      • Wilfried_Hennen
      • vor 9 Monaten
      • Gemeldet - anzeigen

      So sollte es sein: Die Formel wird nur ausgeführt, wenn der Vertragsstand "aktiv" ist.

      Wenn beide Bedingungen erfüllt sind (das festgelegte Datum liegt in der Vergangenheit oder heute, und der Vertragsstand ist "aktiv"), wird das nächste Datum berechnet.

      let df := days('1.SV_LZ_bis', today());
      if df >= 0 and Vertragsstand = "aktiv" then
          (1 + floor(df / 30)) * 30 + '1.SV_LZ_bis'
      else
          null
      end

      Nach meinen letzten Tests liefert die Formel das gewünschte Ergebnis.

      Vielen Dank

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Gerne. Dann ist die Sache jetzt gelöst, schön.

      (Die Mahnungen von   über Vertragsbehandlung hören sich darüberhinaus aber auch sehr vernünftig an, vielleicht hast du solche Dinge schon. Hier gings ja um das rollende Datum)

    • Ninox-Professional
    • planoxpro
    • vor 9 Monaten
    • Gemeldet - anzeigen
     said:
    Oder müssen wir das anders verstehen, so dass das rollende Datum nur dann angezeigt wird, falls "Vertragsstand = aktiv"?

    Technisch wäre das sicher die einfachste Lösung, aber wie gesagt würde dann ja gar kein Datum mehr angezeigt. Man wüsste also auch nicht, ob der Vertrag noch läuft bzw. bis wann er gelaufen ist. Außerdem müsste ja auch das Auswahlfeld für den Vertragsstatus taggenau umgestellt werden.

    Mir erscheint es generell sinnvoller, bei so wichtigen Dingen wie Verträgen eigene Datenfelder für das Kündigungs- und das Ablaufdatum des Vertrages zu pflegen. Die Berechnung könnte täglich über einen Button oder automatisiert über einen Trigger erfolgen, z. B. beim Öffnen der Datenbank.

Content aside

  • vor 9 MonatenZuletzt aktiv
  • 22Antworten
  • 143Ansichten
  • 5 Folge bereits