Rechnen mit Datem
Ich möchte eine kleine Vertragsdatenbank realisieren (Zeitschriftenabos, Softwareabos und was es da sonst heute noch gibt). Dazu soll mit anhand der Vertrragslaufzeit der Beginn der nächsten Laufzeit ausgegeben werden und mit der Kündigungsfrist das Datum, bis zu dem man spätestens kündigen müsste, wenn man es wollte. Ich scheitere momentan aber schon beim ersten Teil (vermute aber, dass man die Lösung des ersten Teils modifiziert auch für den zweiten Teil einsetzen könnte)
Gegeben sind (u.a.)
- ein Feld "Vertrag ab" als Datumsfeld mit dem Start-Datum eines Vertrages
- ein Feld "Vertragslaufzeit" als Auswahlliste mit verschiedenen Laufzeiten (monatlich, Quartal usw)
- ein Feld "Beginn nächste Laufzeit" - das habe ich als Berechnungsfeld angelegt, denn wenn ich das richtig sehe würde sich ein Datumsfeld nur aktualisieren lassen wenn sich irgendwas am Inhalt der Tabelle bzw des Datensatzes ändert - das ist in dem Fall aber ja eher nicht der Normalfall
Folgenden Code habe ich bisher:
let vertrag := 'Vertrag ab';
let monate := 1;
if Vertragslaufzeit = "Jährlich" then
let monate := 12;
void
end;
if Vertragslaufzeit = "Halbjährlich" then
let monate := 6;
void
end;
if Vertragslaufzeit = "Quartal" then
let monate := 3;
void
end;
while (vertrag <=today()) do
vertrag := date((vertrag), month(vertrag) + monate, day(vertrag));
end;
'Beginn nächste Laufzeit' := format(vertrag, "DD.MM.YYYY");
Mit der letzten Zeile soll das Ergebnis der Datumsberechnung ausgegeben werden - nur das klappt nicht, da gibt es im Editor eine Fehlermeldung "die Tabelle ist kein einfaches Datenfeld. Mache ich als letzte Zeile "nur"
format(vertrag, "DD.MM.YYYY");
oder
vertrag;
gibt es zwar keine Fehlermeldung, aber es wird auch nichs angezeigt.
Nun weiß ich nicht mehr weiter - kann mir jemand auf die Sprünge helfen?
8 Antworten
-
Hallo Markus,
die Formel für "Beginn nächste Laufzeit":
---
let monate := switch text(Vertragslaufzeit) do
case "Jährlich":
12
case "Halbjährlich":
6
case "Quartal":
3
default:
0
end;
date (year('Vertrag ab'),month('Vertrag ab')+monate,day('Vertrag ab')+1)
---
Leo
-
Hallo Leo,
Danke Dir!
Ich habe es noch ein wenig erweitert, da ja seit "Vertrag ab" schon mehrere Vertragslaufzeiten vergangen sein können:
let monate := switch text(Vertragslaufzeit) do
case "Jährlich":
12
case "Halbjährlich":
6
case "Quartal":
3
default:
1
end;
let vertragAb := 'Vertrag ab';
let heute := today();
while vertragAb <= heute do
vertragAb := date(year(vertragAb), month(vertragAb) + monate, day(vertragAb)+1)
end
;
vertragAb -
Hallo Markus,
jetzt kapiere ich wofür du die Schleife eingebaut hast. Sehr schön.
-
Hi, danke für diesen etwas älteren Beitrag. Hat mir sehr geholfen.
Allerdings erhalte ich bei der Version von Markus ein nicht nachvollziehbares Datum in der Zukunft, welches in den Tagen nicht den korrekten Wert anzeigt.
Bei "Vertrag ab" 16.06.2020 erscheint bei jährlichem Intervall bspw. der 18.06.2022. Gewünscht wäre der 17.06.2022 (Stand heute). Sieht hier jemand den Fehler?
Vielen Dank vorab!!
-
Hallo Daniel,
bei zwei Jahren kommen über der Schleife auch die zwei Tage zum Datum dazu. Um dies zu korrigieren würde ich die Formel so umschreiben:
---
let monate := switch text(Vertragslaufzeit) do
case "Jährlich":
12
case "Halbjährlich":
6
case "Quartal":
3
default:
1
end;
let vertragAb := 'Vertrag ab';
let heute := today();
while vertragAb <= heute do
vertragAb := date(year(vertragAb), month(vertragAb) + monate, day(vertragAb))
end
;
date(year(vertragAb), month(vertragAb), day(vertragAb)+1)
---
Leo
-
Hallo Leo!
Wow, vielen Dank für diese schnelle Rückmeldung. Jetzt klappt es
-
@Leo Rückfrage: Kannst du dir erklären, warum im monatlichen Intervall das nächste Datum als 02.07.2021 angezeigt wird - unabhängig davon, ob ich als Start den 31.05.2021 bzw. 01.06.2021 angebe? Vielen Dank!
-
weil Juni 30 Tage hat. Ninox interpretiert 31.06 als 01.07. Plus ein Tag ergibt 02.07.
Content aside
- vor 3 JahrenZuletzt aktiv
- 8Antworten
- 2290Ansichten