Abwertung des VK erstellen ?
Hallo
Ich möchte folgendes umsetzten.
Ich möchte einen Verkaufspreis abwerten
Z.B. 199,99 als festes Feld
Im Hintergrund wird über eine Funktion zwischen wareneingang und heute in Monaten das Alter ermittelt.
3 M 199,99 0% Restwert 199,99
9 M 199,99 - 15% Restwert 169,99
15 M 199,99 - 25% Restwert 149,99
36 M 199,99 - 100% Restwert 0,00
Mit OpenOffice Base konnte ich dies bereits umsetzen, hier komme ich nicht weiter.
Bitte um eure Hilfe - Vielen Dank im Voraus
16 Antworten
-
Hallo bow.
Das Alter in Monaten kannst du so Berechnen:
let MONATE := if day(today()) >= day(Datum) then
if month(today()) >= month(Datum) then
month(today()) - month(Datum) + (year(today()) - year(Datum)) * 12
else
(year(today()) - year(Datum)) * 12 - 1 - month(Datum) + month(today())
end
else
if month(today()) >= month(Datum) then
month(today()) - month(Datum) + (year(today()) - year(Datum)) * 12
else
(year(today()) - year(Datum)) * 12 - 1 - month(Datum) + month(today())
end - 1
end;
Die Berechnung des Restwertes hängt davon ab, ob du eine Stufenberechnung machst oder monatlich.Also ob mit 8 Monaten der Restwert immer noch mit 0% berechnet wird oder doch mit (15/6*5)%
Grüße
Leo -
Hi bow, mir ist die Logik der Abstufung nicht ganz klar. Was genau bedeutet die jeweilige Anzahl der Monate? "Von/ab" oder "bis"? Ausgehend vom ersten Eintrag "3 M" mit 0 Prozent Wertverlust wäre es m. E. wohl "bis". Dann ergäbe jedoch der letzte Eintrag keinen Sinn, es sei denn, der Artikel würde sich nach 36 Monaten automatisch in Luft auflösen. Denn weniger als Null kann er ja nicht kosten.
Ich habe jetzt einfach mal angenommen, bei einer Lagerdauer zwischen 15 und 36 Monaten betrüge der Wertverlust 50 %, und erst AB 36 Monaten 100 %. Dann könnte eine simple Lösung so aussehen (als Funktion im Berechnungsfeld 'Restwert' o. ä.):
let AnzMonate := ceil(days(Wareneingang, today()) / 30.4);
if AnzMonate > 3 then
if AnzMonate > 9 then
if AnzMonate > 15 then
if AnzMonate > 36 then
round(Normalpreis - Normalpreis / 100 * 100, 2)
else
round(Normalpreis - Normalpreis / 100 * 50.001, 2)
end
else
round(Normalpreis - Normalpreis / 100 * 25.001, 2)
end
else
round(Normalpreis - Normalpreis / 100 * 15.001, 2)
end
else
Normalpreis
end
Wobei die Berechnung der Anzahl der Monate hier nicht exakt auf den Tag genau erfolgt. Da habe ich's mir einfach gemacht. Wie das besser geht, hat Leo ja gepostet. -
Hallo Danke für eure Hilfe.
Das mit den Angabe der Monate hatte ich vor dem Beitrag bereits so mit der eingabe Funktion gelöst
(year(today()) - year(Wareneingang)) * 12 + month(today()) - month(Wareneingang) + day(today()) - day(Wareneingang)
Hoffe ist so richtig
Zu der Abwertung: die % und M sind Beispiele, real anders.
Der Artikel wird nach einer Weile abgewertet,
Hier wird dann dann darauf geachtet das die Ware zu einem bestimmten
Zeitpunkt verkauft sein muss, und was dieser im VK noch wert ist. Z.B Preisauszeichnung
Es geht hierbei auch den Artikel nicht unter Wert zu verkaufen,
Oder was gewinne ich wenn der Artikel früher verkauft wird, als das er in den nächsten Abschnitt rutscht.
1-3 M 199,99 0% Keine Abwertung 199,99
4-14 M 199,99 – 15% Restwert 169,99
15 - 35 M 199,99 – 25% Restwert 149,99
36 M 199,99 – 100% Restwert 0,00
In welchem Bereich wird der Code eingegeben und welche Sprache wird
Verwendet.
Gruß Bow -
Hast du deine Formel zur Berechnung der Monate ausprobiert? So, wie sie da steht, berechnet sie nämlich alles Mögliche, aber nicht die Anzahl der Monate seit dem Wareneingang.
Beispiel Wareneingang am 17.12.2017. Gerechnet wird:
2018 - 2017 = 1
* 12 = 12
+ 03 = 15
- 12 = 03
+ 10 = 13
- 17 = -4 <-- Monate?
Wenn du es exakt haben willst, dann nimm doch einfach Leos Code. Wenn er sich doch schon die Mühe macht. Oder falls es nicht taggenau sein muss, geht wahrscheinlich auch meine einfache Variante.
So oder so: An der weiteren Berechnung der Wertverluste ändert das natürlich erst mal nichts. Aber deine Aufstellung der Stufen ist jetzt eine andere. Oben ist noch der Zeitraum "9 Monate" dabei. Deshalb fehlte ein Prozentwert. Jetzt passt es von den Zeiträumen und den Abwertungen her. Der angepasste Code wäre dann (einzugeben unter "Funktion" eines beliebigen Berechnungsfeldes):
let AnzMonate := ceil(days(Wareneingang, today()) / 30.4);
if AnzMonate > 3 then
if AnzMonate > 14 then
if AnzMonate > 35 then
round(Normalpreis - Normalpreis / 100 * 100, 2)
else
round(Normalpreis - Normalpreis / 100 * 25.001, 2)
end
else
round(Normalpreis - Normalpreis / 100 * 15.001, 2)
end
else
Normalpreis
end
Wobei die hier im Code genutzten Prozentwerte natürlich auch aus Datenfeldern ausgelesen werden könnten. Z. B. so (mit Stufe2 als numerisches Datenfeld):
round(Normalpreis - Normalpreis / 100 * Stufe2, 2)
Wie gesagt, mein Code ist zugegebenermaßen etwas grobschlächtig, weil genau an deine Beschreibung angepasst. Wenn die Zeitstufen und Prozentwerte für verschiedene Artikel variabel sind, dann wird's natürlich etwas komplizierter. -
PS: Ach so, meintest du mit "Eingabe Funktion" vielleicht die visuelle Zusammenstellung von Formeln per Mouse? Falls ja: Schalte mal oben im Funktionsfenster von "Visuell" auf "Text" um und füge den obigen Beispielcode testweise per Copy and Paste dort ein.
-
guten Abend
irgendwas mache ich falsch nach Eingabe des Codes von Leo wird nichts ausgegeben (Datum habe ich Wareneingang geändert)
Gruß Bow -
Leos Code ermittelt nur die Anzahl der Monate. Mit diesem Wert (MONATE) erfolgt dann die Berechnung der Wertverluste.
Versuche es doch bitte einfach mal mit meinem Code, und zwar genau so, wie ich ihn um 3:27 pm gepostet habe. Damit sich in deinem Formular mal irgendwas Sichtbares tut. Verbessern kann man es dann immer noch. -
Hallo Bow,
die Formel zeigt nur wie die Formel aussehen kann. Die Variable MONATE ist für weitere Berechnungen gedacht. Um die Monate anzuzeigen muß du zusätzlich unten MONATE schreiben
let MONATE := if day(today()) >= day(Datum) then
if month(today()) >= month(Datum) then
month(today()) - month(Datum) + (year(today()) - year(Datum)) * 12
else
(year(today()) - year(Datum)) * 12 - 1 - month(Datum) + month(today())
end
else
if month(today()) >= month(Datum) then
month(today()) - month(Datum) + (year(today()) - year(Datum)) * 12
else
(year(today()) - year(Datum)) * 12 - 1 - month(Datum) + month(today())
end - 1
end;
MONATE
Grüße
Leo -
Super Danke
die Monate werden nun angezeigt.
------
welche Sprache wird hier in Ninox verwendet ? (Swift3?)
gibt es eine ausführliche Sprachreferenz zum nachschlagen
------
ich habe mir mal den Code aus openoffice gezogen
wie es später Berechnet werden soll mit den richtigen Monaten und Abwertungen
hoffe es macht nichts mit den verschiedenen Angaben
Gruss Bow
PS:
der Login hier zum Forum ist schwer zu finden, sollte man mal überdenken
CASE
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) < 2 THEN "VK-Wert"
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) < 5 THEN "VK-Wert" * 0.95
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) < 11 THEN "VK-Wert" * 0.90
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) < 18 THEN "VK-Wert" * 0.85
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) < 24 THEN "VK-Wert" * 0.60
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) < 36 THEN "VK-Wert" * 0.35
WHEN DATEDIFF( 'mm', "Wareneingang", CURRENT_DATE ) > 36 THEN "VK-Wert" * 0.00
END AS "RESTWERT", -
Guten Abend so hab es ich nun eingegben
mal sehen ob es klappt.
let ALTER := ceil(days(Wareneingang, today()) / 30.4);
if ALTER > 2 then
if ALTER > 5 then
if ALTER > 11 then
if ALTER > 18 then
if ALTER > 24 then
if ALTER > 36 then
if ALTER > 36 then
round(VK - VK / 100 * 100, 2)
else
round(VK - VK / 100 * 25.001, 2)
end
else
round(VK - VK / 100 * 65.001, 2)
end
else
round(VK - VK / 100 * 40.001, 2)
end
else
round(VK - VK / 100 * 15.001, 2)
end
else
round(VK - VK / 100 * 10.001, 2)
end
else
round(VK - VK / 100 * 5.001, 2)
end
else
VK
end -
Moin Bow, im Prinzip sieht's gut aus. Aber du hast da jetzt zwei mal "> 36" drin. Das führt zu keinem Fehler, ist aber überflüssig. Und die 25 % kommen niemals zur Anwendung. Nach deiner Formel hast du jetzt folgende Stufen:
Alter > 2 Monate = 5 Prozent
Alter > 5 Monate = 10 Prozent
Alter > 11 Monate = 15 Prozent
Alter > 18 Monate = 40 Prozent
Alter > 24 Monate = 65 Prozent
Alter > 36 Monate = 100 Prozent
Wenn es das ist, was du wolltest: Glückwunsch. Funktioniert!
Nun könntest du noch die erste Zeile zur Ermittlung des Alters in Monaten ("let ALTER :=" [...]) durch Leos Code ersetzen, dann hättest du für ALTER ein noch genaueres Ergebnis.
Was die Dokumentation betrifft: Das ist so eine Sache. Es gibt ein Manual, welches aber eher eine Funktions-Referenz und bei weitem nicht vollständig ist. Den Rest muss man sich zusammensuchen oder erfragen (entweder hier im Forum oder in den Kommentaren unter den Themen des Online-Manuals).
Online-Manual, Start:
http://manual.ninoxdb.de/de/first-steps/
Neue Funktionen, kurz angerissen:
https://ninoxdb.de/de/whatsnew -
Guten Abend zusammen,
bis jetzt funktioniert die Abwertung super.
ich hatte noch eine Idee die ich gerne einbauen würde.
es soll der nächste Zeitpunkt (Datum) angezeigt werden
wann es in die nächste Abwertung rutscht und wieviel Geld mir
verloren geht.
Gruss Bow -
Hallo zusammen
leider habe ich obiges noch nicht umsetzten können, da ich mit der Umsetztung des Codes noch nicht klar komme.
ich würde gerne folgendes umsetzen
die Artikel haben ein bestimmtes alter und nun würde ich gerne, wissen wieviel Tage mir noch bleiben bis zur nächsten Stufe und wieviel Geld mir verloren geht (oder abgewertet wird).
Vielen Danke für eure Hilfe.
@ Ninox - es wäre nicht schlecht wenn es ein video fürs coden gäbe
let ALTER := ceil(days(Wareneingang, today()) / 30.4);
if ALTER > 2 then
if ALTER > 5 then
if ALTER > 11 then
if ALTER > 18 then
if ALTER > 24 then
if ALTER > 36 then
round(VK - VK / 100 * 100, 2)
else
round(VK - VK / 100 * 75.001, 2)
end
else
round(VK - VK / 100 * 40.001, 2)
end
else
round(VK - VK / 100 * 19.001, 2)
end
else
round(VK - VK / 100 * 10.001, 2)
end
else
round(VK - VK / 100 * 5.001, 2)
end
else
VK
end;
ALTER
-
Hallo Bow,
so als Berechnungsfeld:
---
switch today() > Wareneingang do
case today() < date(year(Wareneingang), month(Wareneingang) + 2, day(Wareneingang)):
(
let AW := 'VK-Wert';
let ND := date(year(Wareneingang), month(Wareneingang) + 2, day(Wareneingang));
let DD := days(today(), date(year(Wareneingang), month(Wareneingang) + 2, day(Wareneingang)));
let DS := 'VK-Wert' - 'VK-Wert' * 0.95;
"der Aktueller Wert ist: " + AW + ".
Bis zur nächsten Stufe am: " + ND + " bleibt dir noch " + DD + " Tage.
Du verlierst " + DS + " Euro"
)
case today() < date(year(Wareneingang), month(Wareneingang) + 5, day(Wareneingang)):
(
let AW := 'VK-Wert' * 0.95;
let ND := date(year(Wareneingang), month(Wareneingang) + 5, day(Wareneingang));
let DD := days(today(), date(year(Wareneingang), month(Wareneingang) + 5, day(Wareneingang)));
let DS := AW - 'VK-Wert' * 0.9;
"der Aktueller Wert ist: " + AW + ".
Bis zur nächsten Stufe am: " + ND + " bleibt dir noch " + DD + " Tage.
Du verlierst " + DS + " Euro"
)
case today() < date(year(Wareneingang), month(Wareneingang) + 11, day(Wareneingang)):
(
let AW := 'VK-Wert' * 0.9;
let ND := date(year(Wareneingang), month(Wareneingang) + 11, day(Wareneingang));
let DD := days(today(), date(year(Wareneingang), month(Wareneingang) + 11, day(Wareneingang)));
let DS := AW - 'VK-Wert' * 0.85;
"der Aktueller Wert ist: " + AW + ".
Bis zur nächsten Stufe am: " + ND + " bleibt dir noch " + DD + " Tage.
Du verlierst " + DS + " Euro"
)
case today() < date(year(Wareneingang), month(Wareneingang) + 18, day(Wareneingang)):
(
let AW := 'VK-Wert' * 0.85;
let ND := date(year(Wareneingang), month(Wareneingang) + 18, day(Wareneingang));
let DD := days(today(), date(year(Wareneingang), month(Wareneingang) + 18, day(Wareneingang)));
let DS := AW - 'VK-Wert' * 0.6;
"der Aktueller Wert ist: " + AW + ".
Bis zur nächsten Stufe am: " + ND + " bleibt dir noch " + DD + " Tage.
Du verlierst " + DS + " Euro"
)
case today() < date(year(Wareneingang), month(Wareneingang) + 24, day(Wareneingang)):
(
let AW := 'VK-Wert' * 0.6;
let ND := date(year(Wareneingang), month(Wareneingang) + 24, day(Wareneingang));
let DD := days(today(), date(year(Wareneingang), month(Wareneingang) + 24, day(Wareneingang)));
let DS := AW - 'VK-Wert' * 0.35;
"der Aktueller Wert ist: " + AW + ".
Bis zur nächsten Stufe am: " + ND + " bleibt dir noch " + DD + " Tage.
Du verlierst " + DS + " Euro"
)
case today() < date(year(Wareneingang), month(Wareneingang) + 36, day(Wareneingang)):
(
let AW := 'VK-Wert' * 0.35;
let ND := date(year(Wareneingang), month(Wareneingang) + 36, day(Wareneingang));
let DD := days(today(), date(year(Wareneingang), month(Wareneingang) + 36, day(Wareneingang)));
let DS := AW;
"der Aktueller Wert ist: " + AW + ".
Bis zur nächsten Stufe am: " + ND + " bleibt dir noch " + DD + " Tage.
Du verlierst " + DS + " Euro"
)
default:
"der Aktueller Wert ist: 0,00 Euro. Du hast alles verloren"
end
---
Zieh das Fenster höher damit alle Zeilen zu sehen sind
Leo
-
Hallo leo
danke für deine hilfe.
hast du ne Info wie man, das programmieren lernen kann.
gruss Bow
-
Hallo Bow,
zum Selbststudium gibt es hier ziemlich detailliert die Funktionsbeschreibung:
https://ninoxdb.de/de/manual/erweiterte-Berechnungen/funktions-und-sprachreferenz
In den live Webinaren Mittwochs 16:00-18:00 zeigt Birger, wie man in Ninox "programmiert". Früher waren es "Tipps und Trix", jetzt erklärt Birger jedes Mal ein neues Thema.
Außerdem kann ich die Datenbank 0001_Ninox-Referenz im Webinar-Team 2019 empfehlen. Da hat der Copytexter tolle Arbeit geleistet.
Es gab mal auch eine Idee, dass Ninox selbst die live Workshops anbietet. Ich weiß aber nicht ob daraus etwas geworden ist.
Leo
Content aside
- vor 5 JahrenZuletzt aktiv
- 16Antworten
- 5387Ansichten