0

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

null
    • mirko3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hi Florian. Das ist noch sehr abstrakt. Wie sieht denn eine solche Formel im Textfeld aus. Gruß Mirko

    • Wegener & Hinz GmbH
    • green_cup
    • vor 1 Jahr
    • Gemeldet - anzeigen

    ----------------------------------------------------------------------------------------------

    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

    • john_eans
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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

    • Wegener & Hinz GmbH
    • green_cup
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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
    end

    function 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;

    • Wegener & Hinz GmbH
    • green_cup
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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
  • 76Ansichten
  • 4 Folge bereits