Individuelle Formel aus Text erzeugen
Hallo zusammen,
ich habe ein Modul für die Jahresziele von Mitarbeitern in dem zum einen händisch Bewertungen eingegeben werden können. Bei zielen die aber Kennzahlenabhängig sind (welche sowieso schon in Ninox erfasst sind) würde ich gerne Automatisieren dass diese in den jew. Zielen angezeigt werden. Jetzt hat natürlich jeder MA andere Ziele. Ich würde daher gerne ein Textfeld erstellen in das ich eine individuelle Formel eintippen kann. Dieses soll dann in einem Funktionsfeld berechnet werden. Ich komme aber nicht drauf wie ich aus dem Text wieder eine Formel machen kann.
Danke für Eure Hilfe vorab!
Gruß Flo
5 Antworten
-
Hi Florian. Das ist noch sehr abstrakt. Wie sieht denn eine solche Formel im Textfeld aus. Gruß Mirko
-
----------------------------------------------------------------------------------------------
if Formel then
let myT := Formel;
let Flag := true;
while Flag = true do
let myAR := split(myT, "(");
for i in myAR do
if contains(i, ")") then
let my := substr(i, 0, index(i, ")"));
let res := round(getMParser(my), Rundung);
myT := replace(myT, "(" + my + ")", text(res))
end;
Flag := if contains(myT, "(") then true else false end
end
end
;
let myRes := kauffRund_var(getMParser(myT) * Faktor, Rundung);
myRes
end----------------------------------------------------------------------------------------------
'Formel' ist das Textfeld
Habe ich hier im Forum gefunden, funktioniert für einfache Berechnungen
-
Hey,
also Formel in Textfeld geht mit der Funktion eval().
eval(Text, this)
Text ist dabei ein Textfeld.
Die Funktion zeigt dann immer das Ergebnis der Formel im Textfeld an.
Du kannst auch auf weitere Felder oder Tabellen verweisen. Im Prinzip schluckt eval() alles was auch Ninox kann. (logisch)
Achtung es erfolgt keine automatische Validierung.
VG
-
Zu meinen obigen Code fehlen noch 2 globale Funktionen:
function getMParser(myArr : text) do
var myS := split(join(splitx(myArr, "[\d.,]+"), ""), "");
var myN := for i in splitx(replace(myArr, ",", "."), "[\*\/\+\-]") do
number(i)
end;
for i from 0 to cnt(myS) do
if item(myS, i) = "*" or item(myS, i) = "/" then
let my1 := item(myN, i);
let my2 := item(myN, i + 1);
let myE := switch item(myS, i) do
case "*":
my1 * my2
case "/":
my1 / my2
end;
myN := for k from 0 to cnt(myN) do
switch k do
case i:
0
case i + 1:
myE
default:
item(myN, k)
end
end
end
end;
myS := for j from 0 to cnt(myS) do
let myJ := item(myS, j - 1);
if item(myS, j) = "*" or item(myS, j) = "/" then
if myJ = "-" then "-" else "+" end
else
item(myS, j)
end
end;
var myER := first(myN);
for i from 0 to cnt(myS) do
myER := switch item(myS, i) do
case "+":
myER + item(myN, i + 1)
case "-":
myER - item(myN, i + 1)
end
end;
myER
endfunction kauffRund_var(Wert : number,Rundung : number) do
let sgn := 0;
let ergebnis := 0;
if Wert > 0 then
sgn := 1
else
if Wert < 0 then sgn := -1 end
end;
let Rundung2 := "1";
for i from 1 to Rundung + 1 do
Rundung2 := Rundung2 + "0"
end;
let zergebnis1 := sgn * floor(abs(Wert) * number(Rundung2) + 0.5);
let zergebnis2 := number(Rundung2);
ergebnis := zergebnis1 / zergebnis2;
ergebnis
end; -
Und noch eine Ergänzung:
Faktor ist ebenfalls ein Zahlenfeld……ggf. auf 1 setzen
Rundung ist auch ein Zahlenfeld für die Rundungsstellen
Content aside
- vor 1 JahrZuletzt aktiv
- 5Antworten
- 112Ansichten
-
4
Folge bereits