0

Berechnungsfeld

Hallo Zusammen, ich habe einen Code in ein Berechnungsfeld geschrieben. Leider bleibt das Berechnungsfeld leer. 

Hier der Code: 

if Abrechnung = 2 then 'Summe Netto' end;
if Abrechnung = 3 then 'Summe Netto' / 3 end;
if Abrechnung = 5 then 'Summe Netto' / 12 end

Wenn ich nun jedoch nur die erste Zeile des Codes stehen lasse und die anderen beiden lösche, funktioniert es.

Was mache ich falsch? 

12 Antworten

null
    • UweG
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Paul
    Probiere es mal in dieser Form:

    let Anzeige := "";
    if Text = 1 then Anzeige := "1" end;
    if Text = 2 then Anzeige := "2" end;
    Anzeige

    Gruss

    UweG

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Paul, ist 'Abrechnung' ein Auswahlfeld? Ich würde für mehrere gleichartige Abfragen eines Feldes statt "if" lieber "switch" benutzen. Versuch's mal so:

    switch number(Abrechnung) do
        case 2: 'Summe Netto'
        case 3: 'Summe Netto' / 3
        case 5: 'Summe Netto' / 12
        default: 0
    end

    Auf diese Weise könntest du bei Bedarf auch noch weitere Nummern abfragen und mit "default" als letztem Eintrag einen Standardwert definieren für den Fall, dass keiner der "case"-Werte zutrifft. Die "default"-Zeile kann aber auch einfach gelöscht werden.

    • Paul_Krummling
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe, interessanter Lösungsansatz. Habe soeben bemerkt, dass er nur den zuletzt geschriebene If - CODE ausführt... In meinem Falle:

    if Abrechnung = 5 then 'Summe Netto' / 12 end

    Wie kann ich den Code so abändern, dass er die jeweiligen Rechenaufgaben nach Bedingung löst? :)

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ach, Uwe war schneller. Ich würde aber dennoch die switch-Konstruktion empfehlen.

    • Paul_Krummling
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copywriter, vielen Dank! Das hat geholfen :)

    • UweG
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Paul
    Wie Copytexter geschrieben hat ist die switch..case Lösung eleganter.
    Zu bedenken ist hier aber, dass wenn du mehrere Befehle im case abarbeiten möchtest, diese in geschweifte Klammern setzen musst.

    Dein Script mit if...then sollte dann so aussehen:

    let Anzeige := "";

    if Abrechnung = 2 then Anzeige := 'Summe Netto' end;
    if Abrechnung = 3 then Anzeige := 'Summe Netto' / 3 end;
    if Abrechnung = 5 then Anzeige :=  'Summe Netto' / 12 end;

    Anzeige

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich fürchte, das funktioniert so nicht, Uwe. Berechnungsfelder geben immer nur einen einzigen Wert zurück. Wenn man nun mehrere abgeschlossene "if"-Abfragen nacheinander vornimmt, dann wird immer das Ergebnis der letzten zurückgegeben. Wenn man also mit "if"-Abfragen arbeiten will, dann muss man sie so verschachteln, dass am Ende nur ein Wert ermittelt wird.

    if number(Abrechnung) = 2 then
        'Summe netto'
    else
        if number(Abrechnung) = 3 then
            'Summe netto' / 3
        else
            if number(Abrechnung) = 5 then
                'Summe netto' / 12
            else
                0
            end
        end
    end

    • UweG
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter.

    Da muss ich leider widersprechen.
    Ich habe solch ein ein Modell erstellt und es funktioniert.
    Dadurch, dass ich eine Variable definiere und sie ganz am Ende ausgebe enthält sie den Wert, der in der if-Abfrage zutrifft.
    In deinem Modell wird das Ergebnis direkt in der if-Funktion ausgegeben. Da stimmt dein Einwand.
    Wenn ich als letztes eine Variable ausgebe, kann man ohne Verschachtelungen arbeiten.
    Hier ist der Default-Wert das 'let' bei der Variablendeklaration um im switch..case Vergleich zu bleiben. 

    Der Vorteil von if...then gegenüber switch...case ist die Möglichkeit in einer Bedingung mehrere Funktionen auszuführen.
    Das funktioniert bei switch...case nur bedingt mit geschweiften Klammern.
    Gruss
    Uwe

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Interessant. Mit geschweiten Klammer habe ich allerdings nicht verstanden. Bei switch kann men auch mehrere Anweisungen machen, diese müssen in einfachen Klammern sein.
    switch Wert do
    case 1:
    (tue dies;
    tue das;
    tue dies und das)
    case 2:
    ......

    end

    Wie machst es mit geschweiten Klammern?

    Leo

    • UweG
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Moin Leo
    Du hast natürlich Recht.
    Ich hatte mal einen Hinweis auf Klammern in der switch...case Anweisung falsch verstanden und das mit geschweiften Klammern probiert.
    Dabei kamen zuhauf Fehlermeldungen. Merkwürdigerweise haben jedoch einige Funktionskombinationen, die ich in der geschweiften Klammer platziert habe, funktioniert.
    Ich weiss aber nicht mehr welche.
    Gruss
    Uwe

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen. Auf die Idee, das so mit Variable und mehreren aufeinanderfolgenden if-Abfragen zu versuchen, wäre ich von mir gar nicht gekommen. Denn für genau sowas gibt es ja "switch". Aber ich lerne immer gerne dazu (im Ernst) und habe es deshalb natürlich gleich ausprobiert.

    Und siehe da - nachdem ich die initiale Variablenzuweisung auf den numerischen Wert 0 geändert hatte, ging's tatsächlich auch. Mich wundert zwar, dass es bei dir auch mit dem Leerstring funktioniert haben soll ("null" geht bei mir übrigens auch nicht), aber grundsätzlich hattest du recht: Man kann das so machen. Ich habe zwar noch keine Idee, wozu man es mal brauchen könnte - zum Thema "mehrere Befehlszeilen": siehe Leo -, aber man weiß ja nie. Auf jeden Fall wieder was gelernt. 

    • UweG
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Guten Morgen
    Du hast Recht.

    Leerstring geht nicht, da die Variable immer den gleichen Typ aufnehmen muss. Ich hatte ebenfalls die Variable auf 0 gesetzt, dies jedoch nicht kommuniziert.