0

Betrag aus Datensatz Vormonat

Hallo, ich habe ein simple Datenbank, in welcher die IST-Salden jedes Monats eingetragen sind und der Jahresgewinn/verlust errechnet wird. Nun benötige ich für die Planung der kommenden Monate als PLAN- Startwert jeweils den IST-Jahresgewinn/verlust des Vormonats. Ich habe es mit select versucht, komme aber leider auf keinen grünen Zweig. Danke für eure Hilfe!

8 Antworten

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

    Hallo alexandra, pro Monat ein Datensatz? Mit jeweils einem Datum und einem Betrag? Und es soll der Betrag des Vormonats ermittelt werden, ausgehend vom heutigen Tagesdatum? Dann könnte man es so versuchen:

    let myDay := date(today());
    let lastMonth := yearmonth(date(year(myDay), month(myDay) - 1, day(myDay)));
    first(select TABELLE where yearmonth(DATUM) = lastMonth).Betrag
    

    Oder soll beim Anlegen eines neuen Monats/Datensatzes automatisch der Betrag des Vormonats ermittelt und in ein Feld des neuen Datensatzes übernommen werden? Dann könnte man einen Trigger "Bei neuem Datensatz" erstellen:

    let myNr := number(this);
    VORMONAT := last(select TABELLE where number(Nr) < myNr).BETRAG
    

    Das würde allerdings voraussetzen, dass alle Monate tatsächlich nacheinander erfasst wurden. Ansonsten könnte man auch hier wieder mit yearmonth() auf DATUM zugreifen, allerdings als Trigger "Nach Änderung" im Feld DATUM:

    let lastMonth := yearmonth(date(year(DATUM), month(DATUM) - 1, day(DATUM)));
    VORMONAT := first(select TABELLE where yearmonth(DATUM) = lastMonth).Betrag

    Aber ich habe jetzt viel spekuliert. Falls kein Vorschlag passt, bitte noch etwas mehr Kontext.

    • alexandra
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo, ich war die letzten Tage etwas abgelenkt aber werde es diese Woche mit dem Vorschlag versuchen! Vielen Dank!!!

    • alexandra
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Noch ein kleiner Nachtrag: die erste Variante war die für mich passende. Was mir allerdings auffällt ist, dass bei 

    month(myDay) - 1

    offenbar immer 30 Tage abgezogen werden, sodass ich in Monaten mit 31 Tagen nicht den Betrag aus dem Vormonat, sondern aus dem laufenden Monat erhalte. Ich habe nun einfach zusätzlich noch 5 Tage (zumindest aber 2) abgezogen, um gesichert im Vormonat zu landen. 

    let myDay := date(today());
    let lastMonth := yearmonth(date(year(myDay), month(myDay) - 1, day(myDay)-5));
    first(select TABELLE where yearmonth(DATUM) = lastMonth).Betrag

    Danke nochmal für die rasche Hilfe"

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

      alexandra Verdammt, du hast Recht! In Monaten mit 31 Tagen wird falsch gerechnet. Aber nicht in allen, "nur" im März, Mai, Juli, Oktober und Dezember.

      Herrjeh, Ninox und Datumswerte ... Ich werde das als Bug melden.

      Für deinen Anwendungsfall kannst du das Problem aber umgehen, indem du statt "month() - 1" den day()-Wert auf 0 setzt. Dann wird immer der letze Tag des Vormonats genommen. Das funktioniert zuverlässig:

      let lastMonth := yearmonth(date(year(myDay), month(myDay), 0))
      
      • alexandra
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro 

      Danke dir, das ist natürlich viel schöner so ohne Krücke!

    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    alexandra planox. pro
    date() rechnet mit den Zahlen, die vorgegeben werden.
    Wenn man date(2023,2,31) eingibt, sollte es einem Auffallen, dass man für den Februar ein Datum mit 31 Tagen erzeugen möchte und das nicht funktionieren kann.
    Mit einer Formel ist es halt nicht auf den ersten Blick ersichtlich.

    Der einzige Weg ist hier aus meiner Sicht eine Logik zu bauen, die überprüft welcher Endtag 28/29/30/31des Monats möglich ist und mit dem vorgegebenen Tag vergleicht. Entsprechend wird dann der Tag korrigiert, wenn der vorgegebene Tag größer als der mögliche Tag ist.

    Meiner Meinung nach handelt es sich hier nicht um einen Bug, da date() manchmal mit falschen Werten bestückt wird.

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

    Hallo Uwe ...

    UweG said:
    Wenn man date(2023,2,31) eingibt, sollte es einem Auffallen

    Das hat aber so niemand eingegeben. Bezugsdatum ist today(), das kann der 1., der 18. oder der 31. sein. Von Ninox bekommt man bei month()-1 als Ergebnis den 01.02., 18.02. - oder eben den 03.03., also 28 Tage zurück. Der 03.03. wird aber auch am 31.01. für month()+1 zurückgegeben. Hier werden 31 Tage addiert.

    Bei aller Sympathie: Wo ist da die Logik? Eine clevere Software ermittelt den Monat und nimmt, wenn es den angegebenen Tag in diesem Monat nicht gibt, den nächstniedrigeren existierenden Tag, was in beiden Beispielen der 28.02. wäre. Monatsende plus/minus 1 Monat sollte das Ende des nächsten/vorherigen Monats ergeben.

    Klar, man kann die Abfrage und ggf. Korrektur als Workaround scripten, aber m. E. gehört sowas als Basic in die Funktion selber. DAS ließe sich dann auch jedem erklären. Die Rechnung da oben nicht, sorry.

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

    Der Vollständigkeit halber hier auch noch mal: Uwe hat mich davon überzeugt, dass die Berechnung von month() in der Programmierung wohl so üblich und deshalb kein Fehler ist. Muss man nicht gut oder richtig finden, aber akzeptieren und bei Bedarf eben selbst einen Workaround bauen.