0

Darlehen mit Sondertilgung berechnen?

Hallo,

ich bin neu hier und fange gerade an mich bei Ninox einzuarbeiten. Bisher sieht es schon sehr vielversprechend aus. Allerdings gibt es eine Aufgabe, von der ich mir noch nicht sicher bin, wie ich sie von Excel zu Ninox übertragen bekomme. Vielleicht könnt ihr mir weiter helfen.

Ich möchte die Zahlungsstöme von mehreren Immobilenkrediten auswerten. Meine Idee war eine Tabelle für das Darlehen anzulegen mit Zinssatz, Darlehensbetrag, Laufzeit, etc. und eine Untertabelle, die die monatlichen Tilgungen und Zinszahlungen berechnet. Ich denke, diese Untertabelle könnte durch eine For Schleife gefüllt werden. In eine Standardfall würde das auch wunderbar funktionieren und ich könnte mir ausrechnen wieviel Zinsen ich in einem bestimmten Zeitraum Zahle. Eigentlich bräcute ich nichtmal eine Untertabelle dafür. Mein Knackepunkt sind jedoch die Sondertilgungen. Ich möchte eine beliebigen Periode eine Sondertilgung hinzufügen können und in den folgenden Perioden müssten Zins und Tilgung neu berechnet werden.

Habt ihr einen guten Ansatz wie man diese Aufgabenstellung am besten in Ninox darstellt?

 

Vielen Dank im Voraus,

Frederik

25 Antworten

null
    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

     

    zum einen könnte man in der Untertabelle die Felder Tilgung und Zinszahlung als Berechnungsfelder dynamisch halten, je nach Datenmenge könnte die damit entstehende Vielzahl von Berechnungsfeldern sich dann allerdings irgendwann negativ auf die Performance auswirken (auch wenn ich's bisher noch nicht wirklich so weit gebracht habe :-).

     

    Eine Alternative wäre, die Datensätze der Untertabelle nach Eingabe einer Sondertilgung per Skript anzupassen. Also in einem ersten Schritt alle vorhandenen Tilgungsdatensätze mit Datum nach der Sonderzahlung löschen und im zweiten Schritt gemäß der geänderten Bedingungen neu erstellen zu lassen.

     

    lg, Torsten

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten,

     

    danke für deine schnelle Antwort.

     

    Für eine bessere Auswertung würde ich gerne für jede Zahlung einen Record anlegen. Die Berechnung von Zins und Tilgung würde ja innerhalb eines jeden Records stattfinden. Für die Berechnung brauche ich aber in jedem Record den Restwert des vorherigen Records. Wenn ich neue Records erstelle, dann weiß ich wie ich den vorherigen Endwert übernehme. Aber gäbe es auch die möglichkeit diese Übertragung des Restwertes auf die nächste Zeile auch bei bestehenden Records einfach nur zu aktualisieren?

     

    Lg,

    Frederik

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    das sollte prinzipiell kein Problem sein. In Unkenntnis des Datenmodells fällt's etwas schwer, einen brauchbaren Code vorzulegen. Gibt's die Möglichkeit, Deine DB-Version mit Spieldaten zu bekommen?

     

    lg, Torsten

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Thorsten,

    die  DB  gibt es noch nicht wirklich, da mir die Umsetzung nicht klar ist. Bzw. es gibt eine DB in Airtable der aber genau dieses Feature fehlt, weil dort nicht wirklich umsetzbar. Daher meine Fragerrei :)

    Ich habe jetzt aber mal einen rudimentären Ansatz zur Veranschaulichung zusammengezimmert.

    Darlehen und Tilgung

    Die Buttons sind aktuell nur Dummies und die Werte sind teilweise auch noch manuell eingetragen. Bei dem Button "Erstelle Tilgungsplan" würde ich wahrscheinlich sowas https://www.youtube.com/watch?v=eaAHmt5hy90 mit einer For Schleife verbinden. Der Button "Aktualisiere Tilgungsplan" bereitet mir allerdings noch Kopfzerbrechen. Mit dem Button müsste ich den Wert "Restschuld am Ende der Periode" in das Feld "RestschuldVorperiode" des nächsten Datensatzes kopieren. Gibt es dafür eine gute Methode? Oder sollte ich die Tabelle lieber ganz anders aufbauen?

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    das ist doch mal ein Anfang - genau so etwas meinte ich das. Magst Deinen Ansatz zum Download zur Verfügung stellen?

     

    lg, Torsten

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen
    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    wunderbar.

     

    Kurzes Update:

    Den Restschuldvortrag automatisch berechnen geht offensichtlich nicht, weil das Feld ja zur Ermittlung der Tilgung herangezogen wird, welche wiederum Einfluss auf den Restschuldvortrag hat. Ninox verweigert wegen der "circular reference" den entsprechenden Code. (Danke an dieser Stelle an Leo, der das mit mir gemeinsam heute erkundet/gestestet hat).

     

    Die Lösung ist, den Vortrag a) beim Erstellen des Tilgungsplans berechnen zu lassen und b) bei Ergänzung durch Sondertilgung entsprechend zu aktualisieren. den Teil a) habe ich bereits implementiert, an Teil b) bin ich dran, kann aber noch was dauern...

     

    lg, Torsten

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Super, vielen Dank! Ich bin schon gespannt auf Teil b)!

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    https://www.dropbox.com/s/0ti5l2ux6jru62c/Immobilien3.ninox?dl=0

     

    Der Button "Tilgungsplan erstellen" ist nur zu Beginn verfügbar, das dortige Skript müsste ggfls. um einen Starttermin ergänzt werden - im Moment nehme ich den nächsten Monatsersten an.

     

    Die Überträge sollten sich automatisch aktualisieren, sobald sich im Datensatz des Kapitaldienstes etwas ändert.

     

    Probier's mal aus und lass mich wissen, ob's so passt...

     

    lg, Torsten

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten,

    ich habe jetzt ein bisschen testen können und ich muss sagen, dass es sehr gut funktioniert. Den Code im Button habe ich jetzt noch leicht modifiziert und das Startdatum hinzugefügt:

    do as server
    let my := this;
    let myDate := date(year(Tilgungsbeginn), month(Tilgungsbeginn), day(Tilgungsbeginn));
    while myDate < 'Ende der Zinsbindung' do 
    let myNew := (create Kapitaldienst);
    myNew.(
    Datum := myDate;
    Darlehen := my;
    'Kapitaldienst dieser Monat' := my.'Monatliche Rate';
    RestschuldVorperiode := my.Nettodarlehensbetrag - sum(my.Kapitaldienst[Datum < myDate].'Tilgung dieser Monat') - sum(my.Kapitaldienst[Datum < myDate].Sondertilgung)
    );
    myDate := date(year(myDate), month(myDate) + 1, day(myDate))
    end

    end

    Vielen Dank nochmal! (Es kommen bestimmt bald noch weitere Fragen :) ) 

    Lg, Frederik

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    vielen Dank für die Rückmeldung.

     

    lg, Torsten

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten,

    leider funktioniert das tolle Script doch nicht so wie gewünscht. Nach einigen Perioden driften die Beträge ab. Hier ist mal eine Excel die beschreibt, wie die Rechnung aussehen sollte:

    https://www.dropbox.com/s/nwcmi1p64sd6mta/Darlehen%20Excel.xlsx?dl=0

    und hier nochmal eine aktuelle Version der NinoxDB zum Vergleich:

    https://www.dropbox.com/s/j3jidi2jilyahru/Immobillien%20Darlehen%20Test.ninox?dl=0 

    Ich habe die Vermutung, dass es an der Zeile mit RestschuldVorperiode:=... liegt.

    do as server
    let my := this;
    let myDate := date(year(Tilgungsbeginn), month(Tilgungsbeginn), day(Tilgungsbeginn));
    while myDate <= 'Ende der Zinsbindung' do 
    let myNew := (create Kapitaldienst);
    myNew.(
    Datum := myDate;
    Darlehen := my;
    'Kapitaldienst dieser Monat' := my.'Monatliche Rate';
    RestschuldVorperiode := my.Nettodarlehensbetrag - sum(my.Kapitaldienst[Datum < myDate].'Tilgung dieser Monat') - sum(my.Kapitaldienst[Datum < myDate].Sondertilgung)
    );
    myDate := date(year(myDate), month(myDate) + 1, day(myDate))
    end

    Ganz sicher bin ich mir aber nicht, da ich das Script nicht vollständig durchblicke.

    Brauche ich eigentlich die Cloud Version von Ninox um dieses Script auszuführen oder geht das auch mit der Mac Version? 

    Danke,

    Frederik

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    ich habe Deine DB gerade mal importiert und einen Tilgungsplan erstellen lassen - bei mir driftet nichts weg:

    Screenshot 2020-02-25 23.28.55

    Ich nutze die NinoxCloud in der MacApp - das "do as server ... end" sorgt dafür, dass das Script auf dem Ninox-Server direkt läuft. Den Effekt des Wegdriftens hatte ich bei dem Script, welches in der Tabelle Kapitaldienst den Tilgungsplan aktuell hält (waren immer nur ein paar Cent) - das habe ich mit "order by Datum" in den Griff bekommen. DAS Problem hast Du ja aber beim erstmaligen Erstellen des Tilgungsplans noch gar nicht bzw. das Skript arbeitet sich ja eh im Datum nach vorne.

     

    lg, Torsten

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Axo, die Excel hab ich mir nicht angeschaut, sorry - hab 'ne gewisse Antipathie fremden .xls gegenüber... :-)

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten,

    ich habe den Fehler gefunden und wir sind nah am Ziel.

    Statt RestschuldVorperiode := my.Nettodarlehensbetrag - sum(my.Kapitaldienst[Datum < myDate].'Tilgung dieser Monat') - sum(my.Kapitaldienst[Datum < myDate].Sondertilgung)

    muss es

    RestschuldVorperiode := my.Nettodarlehensbetrag - sum(my.Kapitaldienst[Datum <= myDate].'Tilgung dieser Monat') - sum(my.Kapitaldienst[Datum <= myDate].Sondertilgung)

    heissen. Stimmt die Berechnung.

     

    Allerdings gibt es jetzt noch ein neues Problem. Ninox bricht die Kalkulation nach ca. 115 Datensätzen frühzeitig ab. Wobei die Anzahl der Datensätze gelegentlich schwankt. In der Regel bräuchte ich aber mindestens 120 bis 180 Datensätze. Seltener auch mal bis zu 480. Kann man da was machen?

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Es sollte heissen: "Nun stimmt die Berechnung"

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich habe weiter getestet: Es scheint eine Laufzeitbegrenzung für die While Schleife zu geben. Nach ca. 113 bis 119 neuen Records hört Ninox auf neue Records zu erstellen. Dabei ist es egal ob es Lokal oder als "do as server" läuft.

    Kann man diese Begrenzung irgendwie umgehen? 

    • FBHB
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Weitere Erkenntnis: Das Problem besteht in der Mac App. In der Cloud arbeitet das Script richtig.

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Frederik,

     

    Deine Erfahrung kann ich bestätigen - ich hatte die DB zwar in der MacApp, dort aber in der NinoxCloud liegen. Dort lief die Schleife ohne "do as server" wie bei Dir nicht vollständig durch... :-/

     

    Woran das konkret liegt, oder ob bzw. wie man dem sonst entgegenwirken kann, kann ich leider nicht sagen, da müsste der Ninox-Support vielleicht mal draufschauen.

     

    Hilfsweise könnte man dem Skript im Button als Schleifenstart, wenn bereits Datensätze im Tilgungsplan vorhanden, das letzte Datum +1 Monat - oder - wie gehabt den Tilgungsbeginn übergeben. Also sowas wie:

     

    let myDate := if Kapitaldienst then let myLast := max(Kapitaldienst.Datum);date(year(myLast),month(myLast)+1,day(myLast)) else date(year(Tilgungsbeginn), month(Tilgungsbeginn), day(Tilgungsbeginn));

     

    So sollte er nach weiterem Drücken den Tilgungsplan ergänzen, falls noch nicht vollständig...

     

    lg, Torsten

    • Michael.3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    do as server
    let my := this;
    let myDate := date(year(Tilgungsbeginn), month(Tilgungsbeginn), day(Tilgungsbeginn));
    while myDate <= 'Ende der Zinsbindung' do
    let myNew := (create Kapitaldienst);
    myNew.(
    Datum := myDate;
    Darlehen := my;
    'Kapitaldienst dieser Monat' := my.'Monatliche Rate';
    RestschuldVorperiode := my.Nettodarlehensbetrag - sum(my.Kapitaldienst[Datum <= myDate].'Tilgung dieser Monat') - sum(my.Kapitaldienst[Datum <= myDate].Sondertilgung)
    );
    myDate := date(year(myDate), month(myDate) + 1, day(myDate))
    end

    end

    • Michael.3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo! 

     

    Ich habe den o. g. Code in der Beispiel-Datenbank verwendet. und kann auch einen Annuitätenplan erzeugen. Allerdings ändert sich das Datum nach ca. 4 Jahren vom Monatsultimo auf den 2. des Folgemonats.

     

    Hat einer eine Idee?

    • Michael.3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Interessant wäre auch noch, wenn der Zahlungsplat mit einer vierteljährlichen Fälligkeit erzeugt werden kann.

    • Michael.3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    FBHB , Torsten Stang

     

    Hallo zusammen, 

     

    ich habe auch das Problem, dass die while-Schleife die Berechnung ab einer gewissen Anzahl von Monaten abbricht. von UweG habe ich eine Alternative vorgeschlagen bekommen. Die while-Schleife wird ersetzt durch for i in range(0, number(Laufzeit der Berechnung)).

     

    Hierzu habe ich dann die Laufzeitmonate zwischen Tilgungsbeginn und Ende der Zinsbindung berechnen lassen und dies dann als zweiten Wert in den Range-Ausdruck integriert.

     

    UweG , ich hoffe es ist für Dich ok, dass ich Deine Alternative hier genannt habe.

     

    Gruß

     

    Michael

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Michael Wenn es hilft und funktioniert, kein Problem.

    • Michael.3
    • vor 3 Monaten
    • Gemeldet - anzeigen

    Hallo zusammen,

     

    ich komme mit dieser Formel gut klar, um eine Annuität zu berechnet, sofern die monatlichen Raten gleich hoch bleiben, ist ja auch eigentlich das Wesen einer Annuität.

     

    do as server
        let my := this;
        let myDate := date(year(Tilgungsbeginn), month(Tilgungsbeginn), day(Tilgungsbeginn));
        for i in range(0, number(Laufzeit)) do
            let myNew := (create Kapitaldienst);
            myNew.(
                Datum := myDate;
                Darlehen := my;
                'Kapitaldienst dieser Monat' := my.'Monatliche Rate';
                RestschuldVorperiode := my.Nettodarlehensbetrag -
                    sum(my.Kapitaldienst[Datum < myDate].'Tilgung dieser Monat') -
                    sum(my.Kapitaldienst[Datum < myDate].Sondertilgung)
            );
            myDate := date(year(myDate), month(myDate) + 1, day(myDate))
        end
    end

     

    Aber wie muss ich das Skript ändern, wenn lediglich die 1. Rate sich von den Folgeraten unterscheidet? Ich habe Probleme diese zusätzliche Info und die Schleife so anzuordnen, dass der Zahlungsplan erstellt wird.

Content aside

  • vor 3 MonatenZuletzt aktiv
  • 25Antworten
  • 3720Ansichten
  • 2 Folge bereits