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
-
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.
-
Hallo, ich war die letzten Tage etwas abgelenkt aber werde es diese Woche mit dem Vorschlag versuchen! Vielen Dank!!!
-
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"
-
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.
-
Hallo Uwe ...
UweG said:
Wenn man date(2023,2,31) eingibt, sollte es einem AuffallenDas 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.
-
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.
Content aside
- Status Answered
- vor 1 JahrZuletzt aktiv
- 8Antworten
- 124Ansichten
-
3
Folge bereits