0

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

null
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    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

    • Markus_Hagge
    • vor 6 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Markus,

    jetzt kapiere ich wofür du die Schleife eingebaut hast. Sehr schön.

    • 3VIERTEL Online Marketing
    • Daniel_Stoltzner
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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!!

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • 3VIERTEL Online Marketing
    • Daniel_Stoltzner
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Leo! 

    Wow, vielen Dank für diese schnelle Rückmeldung. Jetzt klappt es 🙏🏻

    • 3VIERTEL Online Marketing
    • Daniel_Stoltzner
    • vor 3 Jahren
    • Gemeldet - anzeigen

    @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!

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    weil Juni 30 Tage hat. Ninox interpretiert 31.06 als 01.07. Plus ein Tag ergibt 02.07.