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
-
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
-
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
-
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
-
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.
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?
-
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
-
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
-
Super, vielen Dank! Ich bin schon gespannt auf Teil b)!
-
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
-
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
-
Hallo Frederik,
vielen Dank für die Rückmeldung.
lg, Torsten
-
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))
endGanz 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
-
Hallo Frederik,
ich habe Deine DB gerade mal importiert und einen Tilgungsplan erstellen lassen - bei mir driftet nichts weg:
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
-
Axo, die Excel hab ich mir nicht angeschaut, sorry - hab 'ne gewisse Antipathie fremden .xls gegenüber... :-)
-
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?
-
Es sollte heissen: "Nun stimmt die Berechnung"
-
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?
-
Weitere Erkenntnis: Das Problem besteht in der Mac App. In der Cloud arbeitet das Script richtig.
-
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
-
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))
endend
-
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?
-
Interessant wäre auch noch, wenn der Zahlungsplat mit einer vierteljährlichen Fälligkeit erzeugt werden kann.
-
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
-
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
endAber 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