0

Monate anteilig berechnen

Guten Morgen,

ich habe folgendes Problem:

Im Zuge einer Vermietung möchte ich Artikel zu einem Monatspreis abrechnen. Den Zeitraum der Abrechnung möchte ich aber frei wählen können. 

Meine erste Idee war, den Monatspreis auf den Tag runter zu rechnen und dann mit der Anzahl der Tage zu multiplizieren, was aber durch die unterschiedlichen Monatslängen Probleme macht. 

Ein paar Beispiele für mögliche Abrechnungszeiträume:

1.8.21 - 31.8.21  -> kein Problem; voller Monatspreis

1.8.21 - 15.9.21  -> 1 voller Monat(mit 31Tagen) + 15 Tage(von30) also:   1x Monatspreis + "Tagespreis"(= Preis / AnzahlTageMonat * 15)

1.8.21 - 3.10.21  -> hier stecken Monate mit 30 und 31 Tagen drin. Abrechnung per Anzahl Tage funktioniert also nicht, da in einem der Monate der errechnete Monatspreis nicht mehr stimmt.

15.8.21- 10.10.21 -> auch hier wieder das Problem mit den unterschiedlichen Monatslängen. 

 

Ich könnte mir auch vorstellen, mit der Zahl 30,41 zu arbeiten. Wobei ich nicht weiß, wie ich Ninox verklickere, dass ab jetzt nur noch jeder Monat 30,41 Tage hat.

Bei der Zählung der RestTage gibt es hier auch wieder Probleme, weil:

Monatspreis / 30,41 = Tagespreis

Tagespreis * 31 abzurechnende Tage > Monatspreis

Tagespreis * 30 abzurechnende Tage < Monatspreis.

 

Wäre evtl ein richtiger Ansatz, den jeweiligen Monat als Dezimalzahl anzuzeigen?

Also in etwa so:

1.9.21 - 15.9.21         15/30 Tage = 0,5 Monate

1.10.21 - 15.10.21     15/31 Tage = 0,48 Monate

1.9.21 - 10.11.21       2 Monate + 10/30 Tage = 2,33 Monate  

1.1.21 - 15.2.21         1 Monat + 15/28 = 1,53 Monate

Und diese Zahl dann mit dem Monatslistenpreis multiplizieren?  

 

Freue mich auf euer Feedback.

4 Antworten

null
    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Daniel,

    angenommen, du hast die dem Datensatz die Datumsfelder Anfang und Ende. Dann kannst du in einem Funktionsfeld und der Formel:

    ---

    let myDays := 0;
    let myMonths := 0;
    let myStart := Anfang;
    let myEnd := Ende;
    if day(Anfang) > 1 then
    myDays := day(date(year(Anfang), month(Anfang) + 1, 0)) - day(Anfang) + 1;
    myStart := date(year(Anfang), month(Anfang) + 1, 1)
    end;
    if day(date(year(Ende), month(Ende) + 1, 0)) > day(Ende) then
    myDays := myDays + day(Ende);
    myEnd := date(year(Ende), month(Ende), 1)
    end;
    let myArr := unique(for i in range(days(myStart, myEnd)) do
    yearmonth(date(year(myStart), month(myStart), day(myStart) + i))
    end);
    myMonths := cnt(myArr);
    myMonths + " volle Monate, " + myDays + " Tage"

    ---

    Die Anzahl der vollen Monaten und Tagen anzeigen lassen. Wichtig für die weiter Berechnung sind die Variablen myMonths und myDays. Diese muss du noch mit Monats- bzw. Tagespreisen multiplizieren. Bei dieser Berechnungsgrundlage ist es so, dass bei der Buchng vom 02.08.21 bis 29.09.21 die 59 Tage als Ergebnis erscheinen (keine vollen Monate).

    Leo

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

    Super!! Vielen Dank! Das funktioniert. Ich werde mich in den nächsten Tagen damit befassen.... bis die nächsten Fragen aufkommen.

    VG Daniel

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

    Nochmal eine Rückfrage zum Verständnis. (Ich will ja nicht nur anwenden);

     

    let myArr := unique(for i in range(days(myStart, myEnd)) do
    yearmonth(date(year(myStart), month(myStart), day(myStart) + i))
    end);

     

    Verstehe ich das richtig, dass (da "myStart" jeweils den ersten eines Monats darstellt) hier in "i" alle ersten Tage der Monate zwischengespeichert/gezählt werden, die zwischen "myStart" und "myEnd" liegen und dann zu "myStart" addiert werden? - was dann die Anzahl der vollen Monate ergibt? 

     

    Gruß,

    Daniel

    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Nein,es ist komplizierter:

    mit days(myStar, myEnd) wird die Anzahl der Tage zwischen zwei Datums ermittelt. Dann wird eine Schleife erstellt welche sich so viele Male wiederholt wie viele Tage ermittelt sind. (for i in range(.....) do. Dabei wird i jedesmal um 1 größer (0,1,2,3.....). In jedem Schritt wird zuerst ein Datum gebildet (date (year (myStart),month(myStart),day(myStar)+i)). Und direkt danach wird daraus Jahr und Monat als Text ermittelt. So kriegt man für den Intervall 01.08.2021-01.10.2021 31 mal "2021/08" und 30 mal "2021/09". Mit unique () wird daraus ein Array mit 2 Einträgen welche mit cnt werden diese auch als Zahl ermittelt.

    die Methode ist ziemlich rechenintensiv und bei größeren Zeitintervallen (mehrere Jahre) würde ich überlegen auch eine einfachere Rechnung ohne Schleife zu machen.

    Leo

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 4Antworten
  • 322Ansichten