2

Resttage Anzeige auch mit Formelfeld

Hallo zusammen 

Ich würde gerne das Formelfeld nutzen, welches die Restlaufzeit basierend auf einem Datum ebenfalls in einem Formelfeld berechnet. Die entsprechende Formel dafür ist unten aufgeführt.

Code für Restlaufzeit:

if today() = 'Fällig' then
    styled(text("Abgabe Heute!"), "orange", "black", "")
else
    if today() >= 'Fällig' + 1 then
        styled(text('Fällig' - today()), "red", "black", "")
    else
        if today() + 7 > 'Fällig' then
            styled(text('Fällig' - today()), "yellow", "black", "")
        else
            if not 'Fällig' then
                styled(text("???"), "", "black", "")
            else
                styled(text('Fällig' - today()), "green", "white", "")
            end
        end
    end
end

Code für Datumsberechnung:

if Wartung = 1 then
    let LetzteWartung := last(Wartungsregister.'📆 Ausgeführt');
    let 'EinJahrSpäter' := date(year(LetzteWartung) + number(text('Int./Jahr')), month(LetzteWartung), day(LetzteWartung));
    styled(format('EinJahrSpäter', "DD.MM.YYYY"), if today() > 'EinJahrSpäter' then
        "red"
    else
        if 'EinJahrSpäter' < 60 then "Orange" else "Green" end
    end)
end

Wenn ich die Berechnung mit einem Datumsfeld durchführe, funktioniert es einwandfrei. Allerdings, wenn ich stattdessen das Formelfeld mit dem berechneten Datum verwende, funktioniert es nicht mehr. Trotz meiner Versuche, den Code anzupassen, konnte ich das Problem nicht lösen.

Um mein Problem besser zu veranschaulichen, habe ich den unten angezeigten Printscreen mit der Feldbezeichnung erstellt. Ich kann die Restlaufzeit erfolgreich mit einem Datumsfeld berechnen, jedoch nicht mit einem Formelfeld.

Danke für eure Unterstützung.

28 Antworten

null
    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Das Berechnungsfeld gibt dir meines Wissens Text zurück und kein Datum.
    Dem entsprechend kann man es nicht so einfach als Datum weiter verwenden.
    Du musst aus dem Text erst wieder ein Datum bauen in dem du es in Jahr, Monat, Tag zerlegst und wieder als Datum mit date() zusammen baust.

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG danke. Kennst du ein Beispiel wie das aussehen sollte? Ich habe gerade keinen Plan wie sich das bewerkstelligen lässt. 😒

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Stephan, einen per styled() formatierten Datums-String könnte man z. B. so wieder in einen "echten" Datumswert umwandeln, mit dem sich dann auch wieder Berechnungen vornehmen ließen:

    let myD := number(item(split(text(STYLEDFELD), "."), 0));
    let myM := number(item(split(text(STYLEDFELD), "."), 1));
    let myJ := number(item(split(text(STYLEDFELD), "."), 2));
    date(myJ, myM, myD)
    

    Eine generelle Alternative wäre, das Berechnungsfeld unformatiert als 'Datum' zu belassen und die styled()-Formatierung dann erst in einem weiteren Berechnungsfeld vorzunehmen, welches einfach nur auf das mit dem Datum verweist. Dann hat man ein Feld mehr, spart sich aber das Konvertieren.

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro danke für deine Hilfe. Ich habe nun folgendes versucht: Wie vorgeschlagen habe ich ein Formelfeld ohne Style()-Formatierung erstellt.

      if Wartung = 1 then
          let LetzteWartung := last(Wartungsregister.'📆 Ausgeführt');
          let 'EinJahrSpäter' := date(year(LetzteWartung) + number(text('Int./Jahr')), month(LetzteWartung), day(LetzteWartung));
          format('EinJahrSpäter', "DD.MM.YYYY");
          let myD := number(item(split(text('EinJahrSpäter'), "."), 0));
          let myM := number(item(split(text('EinJahrSpäter'), "."), 1));
          let myJ := number(item(split(text('EinJahrSpäter'), "."), 2));
          date(myJ, myM, myD)
      end
      

      Ergebnis: 

      Dann habe ich ein neues Formelfeld für die Fälligkeit (Tage) erstellt die eine Style-Formatierung enthält.

      if today() = date(Datum) then
          styled(text(date("Abgabe Heute!")), "orange", "black", "")
      else
          if today() >= date(Datum) + 1 then
              styled(text(date(Datum - today())), "red", "black", "")
          else
              if today() + 14 > date(Datum) then
                  styled(text(date(Datum - today())), "yellow", "black", "")
              else
                  if not date(Datum) then
                      styled(text(date("???")), "", "black", "")
                  else
                      styled(text(date(Datum) - today()), "green", "white", "")
                  end
              end
          end
      end
      

      Nun habe ich aber wieder Schwierigkeiten, denn liegen die Werte über den definierten > 14 Tage ist alles okay und die Zahl scheint grün zu stimmen (Pic 1) liegt der Wert aber unter den 14 Tagen erscheint ein Datum!? (Pic 2)

      Pic 1:

      Pic 2: 

      Hast du eine Idee woran das  liegt?

      Danke und Gruss 

      Steph

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki sorry, irgendwie hatte ich einen Fehler im Code. Nach nochmaligem Versuch klappt es nun mal soweit.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki Kann ich so auf Anhieb jetzt gar nicht sagen. Die styled()-Parameter sind ja gleich. Ich persönlich würde der Übersichtlichkeit halber aber ohnehin etwas anders rangehen, mit days() die Differenz der Daten in Tagen berechnen und die Abfrage darauf beziehen. Zum Beispiel so (nicht getestet):
       

      if Datum then
         let myHG := "";
         let myVG := "Black";
         let myDiff := days(Datum, today());
         let myTxt := text(myDiff)
         if myDiff = 0 then
            myTxt := "Abgabe heute!";
            myHG := "Orange";
         else
            if myDiff < 0 then
               myHG := "Red";
            else
               if myDiff > 14 then
                  myHG := "Green";
                  myVG := "White";
               else
                  myHG := "Yellow";
               end
            end
         end
      else
         myTxt := "???"
      end;
      styled(myText + " Tage", myHG, myVG)

       

      EDIT: Ach so, sehe gerade, dass es nun bei dir funktioniert. Na ja, nimm's als Anregung. ;)

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro Danke! 🙂

    • Stephan_S
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Nun bin ich bereits wieder am Rudern! 😅

    Jetzt habe ich soweit alles vorbereitet und es scheint zu funktionieren, bis ich bemerkt habe, dass bei einer Ansicht einer Bedingung komplett anderes ist als bei den anderen.

    Die Resttage werden richtig dargestellt:

    Auch hier bei Resttage unter 60 Tage ist auch noch alles in Ordnung:

    Resttage unterschritten, auch noch alles in Ordnung:

    Aber jetzt kommt's! Resttage noch weit voraus: Was ist das für ein Zahl hinter den Tagen???

    Ich gehe davon aus, dass es sich um eine Stunde handelt aber ich kann mir beim besten Willen nicht erklären, wie diese hier plötzlich auftaucht. Einen Hinweis kann ich geben, es betrifft jede Zahl die über Hundert Tage geht, mit einer Ausnahme (siehe Screen unten)

    Aktuelle versuchte ich es mit diesen Formeln:

    Datumsermittlung: 

    if Wartung = 1 and Status = 1 or Wartung = 1 and Status = 2 then
        let LetzteWartung := last(Wartungsregister.'📆 Ausgeführt');
        let 'EinJahrSpäter' := date(year(LetzteWartung) + number(text('Int./Jahr')), month(LetzteWartung), day(LetzteWartung));
        styled(format('EinJahrSpäter', "DD.MM.YYYY"), if today() > 'EinJahrSpäter' then
            "red"
        else
            "Green"
        end);
        let myD := number(item(split(text('EinJahrSpäter'), "."), 0));
        let myM := number(item(split(text('EinJahrSpäter'), "."), 1));
        let myJ := number(item(split(text('EinJahrSpäter'), "."), 2));
        date(myJ, myM, myD)
    end
    

    Restzeit/Tage

    if Wartung = 1 and Status = 1 or Wartung = 1 and Status = 2 then
        if today() = 'Fälligkeitsdatum' then
            styled(text("Abgabe Heute!"), "orange", "black", "")
        else
            if today() >= 'Fälligkeitsdatum' + 1 then
                styled(text('Fälligkeitsdatum' - today()), "red", "black", "")
            else
                if today() + 30 > 'Fälligkeitsdatum' then
                    styled(text('Fälligkeitsdatum' - today()), "yellow", "black", "")
                else
                    if not 'Fälligkeitsdatum' then
                        styled(text("???"), "", "black", "")
                    else
                        styled(text('Fälligkeitsdatum' - today()), "green", "white", "")
                    end
                end
            end
        end
    end
    

     Ich hoffe jemand kennst das oder was ähnliches und kann mir einen guten Ratschlag geben.

    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hi Stephan. Das kommt wahrscheinlich von der Umrechnung des Datumsformats in number(). Dabei wird nun auch die zukünftige Stunde bei der Winterzeitumstellung eingerechnet. Versuche mal folgendes im Script für die Restzeit/Tage. Mirko

    if Wartung = 1 and Status = 1 or Wartung = 1 and Status = 2 then
        let LetzteWartung := last(Wartungsregister.' Ausgeführt');
        let oneyearlater := date(year(LetzteWartung) + number(text('Int./Jahr')), month(LetzteWartung), day(LetzteWartung));
        if today() = oneyearlater then
            styled(text("Abgabe Heute!"), "orange", "black", "")
        else
            if today() >= oneyearlater + 1 then
                styled(text(oneyearlater - today()), "red", "black", "")
            else
                if today() + 30 > oneyearlater then
                    styled(text(oneyearlater - today()), "yellow", "black", "")
                else
                    if not oneyearlater then
                        styled(text("???"), "", "black", "")
                    else
                        styled(text(oneyearlater - today()), "green", "white", "")
                    end
                end
            end
        end
    end 
      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko , danke! Ich habe es mal kurz getestet und es sieht ganz gut aus. Ich scheue es mir heute im Laufe des Tages nochmals genauer an und test es. Nochmals herzlichen Dank für deine Bemühungen. :-)

      Gruss Steph

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Hallo Mirko beim einem genaueren Versuch mit deiner Formel kommt es ebenfalls zu dem ominösen 1:00 

      Die verwendete Formel sieht folgt aus: 

      if Wartung = 1 and Status = 1 or Wartung = 1 and Status = 2 then
          let LetzteWartung := last(Wartungsregister.'📆 Ausgeführt');
          let oneyearlater := date(year(LetzteWartung) + number(text('Int./Jahr')), month(LetzteWartung), day(LetzteWartung));
          if today() = oneyearlater then
              styled(text("Abgabe Heute!"), "orange", "black", "")
          else
              if today() >= oneyearlater + 1 then
                  styled(text(oneyearlater - today()), "red", "black", "")
              else
                  if today() + 30 > oneyearlater then
                      styled(text(oneyearlater - today()), "yellow", "black", "")
                  else
                      if not oneyearlater then
                          styled(text("???"), "", "black", "")
                      else
                          styled(text(oneyearlater - today()), "green", "white", "")
                      end
                  end
              end
          end
      end
      

      Deine Formel wäre super, da alles in einer Formel enthalten ist. Unklar für mich ist, wo das 1:00 herkommen! 😓 Langsam denke ich an einen Bug, wie Beispielsweise beim bei diesem Eintrag hier: https://forum.ninox.de/t/h7h2q4m

      Ich lasse es mal stehen und gehe etwas nach fische Luft schnappen! 🥴

      Nochmals besten Dank für deine BemühungenMirko

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki 

      Ja, im Grunde ist es ein Bug, das kann man so sagen. Probleme entstehen zumeist dann, wenn Berechnungen von Datums- und Zeitwerten durchgeführt werden. Prinzipiell lässt sich die Fehlerquote mit zwei Maßnahmen reduzieren:

      Zum einen durch Vermeiden von Berechnungen mit Datums- und Zeitwerten, wenn irgend möglich. Siehe mein Beispiel mit days() oben. Dabei wird nur einmal die Differenz zwischen zwei Datumswerten ermittelt und als Zahl zurückgegeben, mit der dann problemlos Auswertungen und mathematische Operationen durchgeführt werden können.

      Wenn sich mathematische Operationen mit Datumsfeldern nicht vermeiden lassen, sollte man zum anderen konsequent die Funktion date() nutzen Also bspw. statt

      Datum + 3
      

      besser

      date(year(Datum), month(Datum), days(Datum) + 3)
      

      Erläuterung date():
      https://docs.ninox.com/de/skripten/funktionen-ueberblick/funktionen/date

      Erläuterung days():
      https://docs.ninox.com/de/skripten/funktionen-ueberblick/funktionen/days

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki Hi Stephan. Ich habe mal noch einen Verdacht. Ändere doch bitte mal die Zeile 2 im Code auf:

       let LetzteWartung := date(last(Wartungsregister.' Ausgeführt'));
      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Mirko Hoi Mirco, danke. Leider führt das nicht zum Erfolg. In der Zwischenzeit habe ich auch bemerkt, dass das selbe Phänomen auch mit einem Datumsfeld entsteht. Das hat ich nun etwas irritier!

      Ich werde mich mit dem nun an den Ninox Support wenden mit der Bitte dies zu prüfen. Ich melde mich wieder wenn ich eine Antwort habe. 

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro danke. Ich habe den Code von oben ausprobieren aber irgendwas geht bei mir nicht. Ich muss mir das nochmals genauer anschauen. Mit dem Problem wende ich mich nun an den Ninox Support. Jemand von ihnen soll das via Remote mal anschauen und prüfen an was das liegt. 

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki Kannst du mal eine Beispiel DB hochladen, die dein Datenmodell abbildet?

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG  Hallo Uwe, hier habe ich dir einmal die DB mit zweit Datensätzen als Muster. Wäre toll wenn du da was herausfinden würdest. 😉 Gruss Steph 

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki Erst einmal Danke.
      Für dich ist der Aufbau deiner Datenbank klar, aber ich als Unkundiger müsste schon wissen, wo ich suchen muss.
      Am besten mit einem zusätzlichen Datensatz, der den Fehler aufweist um das nach zu vollziehen.

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG ich habe in der DB zwei Datensätze angelegt. Beim Datensatz zwei ist der Fehler (im Beispiel ein Negativwert) ganz unten ersichtlich. Das Feld befindet sich nicht dort wo ich es dann letztendlich haben möchte.

      Ich hoffe nun ist es etwas klare für dich. 

      Gruss Steph

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki 
      Datum/Uhrzeit Berechnungen mathematisch durchzuführen ist immer eine heikle Sache.
      Das ist wie Birnen mit Äpfeln mathematisch zu berechnen.
      Wenn man das machen muss, sollte man zuerst schauen, ob es nicht entsprechende Ninox-Funktionen für diesen Fall gibt.

      Dazu kann ich nur wärmstens die NinoxDokumentation oder die von Axel gebaute Reference-DB empfehlen.
      Sobald ich zu Skripten beginne, ist die Reference-DB in einem anderen Fenster permanent geöffnet und wird von mir auch reichlich benutzt.

      Ist keine Funktion vorhanden, dann sollte man es wirklich herunter brechen in einzelne Zahlenwerte, mit denen man mathematisch arbeiten kann und das Ergebnis wieder mit den entsprechenden Funktionen zusammen bauen als was es dargestellt werden soll.

      Ich habe mal die Datenbank um ein Berechnungsfeld mit angepasstem Script erweitert.

       

      Ich vergaß anzumerken, das dieses Problem nichts mit den Zeitabweichungen auf manchen Servern zu tun hat.
      Diese Berechnungsdarstellung tritt sowohl auf Servern mit und ohne Zeitverschiebung auf.

      Wenn du wissen willst, ob dein Team davon betroffen ist, empfehle ich zur Überprüfung die DB '356_Zeit verschoben UweG' aus dem Webinarteam.

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG hey Uwe, vielen Dank! Es funktioniert. 😃 Du hast recht, ich sollte hier vielleicht anders vorgehen und künftig auch die Reference-DB berücksichtigen.

      Nochmals ein herzlichen Dank an dich Uwe und an all jene die beigetragen haben. 👍

      Ebenfalls ein guter Wochenstart 😉

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki Die Hauptarbeit haben Mirko und Axel gemacht. Ich ruhe mich nur auf den von anderen erarbeiteten Lorbeeren aus. ;-)

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG eine Frage habe ich noch für heute: 😉 

      Warum sortiert es in der Tabelle die Datum oder Tage nicht 100% in der Reihenfolge?

      Sortierung will ich nach Fälligkeit in Tagen. Spielen hier noch andere Filter eine Rolle dabei?

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Stephan Stucki Weil es sich um Text handelt und nicht um Zahlen.
      styled-felder geben nur Text  wieder.

      Möglich wäre ein Berechnungsfeld, wo du die Anzeige wieder in Zahlen umwandelst entsprechend sortierst und es außerhalb des Sichtbereichs schiebst. (Ganz nach Rechts)

      • Stephan_S
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG ja klar. Danke! 🙂