Domino 9 und frühere Versionen > ND8: Entwicklung
Verschachtelte @If-Abfragen
thkn777:
--- Zitat von: Bastel123 am 01.10.15 - 13:34:14 ---Noch ein Hinweis:
X:= @If(iTeKategorie!="" & @Contains(iTeKategorie;"1.") & isMitglied ; "10 € / 1. Jahr"; "n.b.1");
X:= @If(iTeKategorie!="" & @Contains(iTeKategorie;"1.") & !isMitglied ; "20 € / 1. Jahr"; "n.b.2");
etc.
geht durch alle @IF-Formeln, d.h ich kann den Wert auch "überschreiben", der letzte hat gewonnen.
--- Ende Zitat ---
Stimmt. Genau DAS ist ja das ursprüngliche Problem von buzi, das man durch das einfache Voranstellen von "X:=" in jeder Zeile auch nicht lösen kann.
--- Zitat ---X:= @If(
iTeKategorie!="" & @Contains(iTeKategorie;"1.") & isMitglied ; "10 € / 1. Jahr"; "n.b.1";
iTeKategorie!="" & @Contains(iTeKategorie;"1.") & !isMitglied ; "20 € / 1. Jahr"; "n.b.2");
"n.b.?"
)
bricht nach der ersten gültigen Formel ab, d. h. der erste gewinnt.
Da stolpert man schon mal drüber >:(
Sebastian
--- Ende Zitat ---
Ich kann mir nicht vorstellen, wie diese Formel überhaupt sinnvoll funktionieren soll.
Zusammenfassung: ???
Andrew Harder:
Man kann auch einfach doppelte Abfragen vermeiden, das spart Platz und ist damit lesbarer.
Also so etwa in der Art:
--- Code: ---@If (iTeKategorie = ""; @Return (""); "");
@If(isMitglied = @True;
@If(
@Contains(iTeKategorie;"1."); "10 € / 1. Jahr";
@Contains(iTeKategorie;"2."); "20 € / 1. Jahr";
@Contains(iTeKategorie;"3."); "40 € / 1. Jahr";
@Contains(iTeKategorie;"4."); "60 € / 1. Jahr";
"value for member not found")
;
@If(
@Contains(iTeKategorie;"1."); "20 € / 1. Jahr";
@Contains(iTeKategorie;"2."); "30 € / 1. Jahr";
@Contains(iTeKategorie;"3."); "50 € / 1. Jahr";
@Contains(iTeKategorie;"4."); "70 € / 1. Jahr";
"value for non-member not found")
)
--- Ende Code ---
Tode:
also ich persönlich würde ja mit Zahlen arbeiten und dann den Text ganz am Ende ergänzen. Wenn die Logik so ist, wie sie sich darstellt, dann wäre mein Code:
--- Code: ---_isMitglied := @IsMember("Verband B"; values);
REM "Abbrechen, wenn Kategorie leer";
@If( iTeKategorie = "" ; @Return( "" ) ; "" );
_nr := @TextToNumber( @Left( iTeKategorie ; "." ) );
REM "Abbrechen, wenn die am Anfang der Kategorie keine Zahl steht";
@If( @IsError( _nr ) ; @Return( "" ) ; "" );
REM "Rechnung: Kategorie * 10 + 10 € für Nichtmitglieder";
_amount := _nr * 10 + @If( _isMitglied ; 0 ; 10 );
REM "Text zurückgeben";
@Text( _amount ) + " € / 1. Jahr"
--- Ende Code ---
So ganz nebenbei würde ich den Betrag komplett als Zahl in einem eigenen Feld speichern, und den Text dann einfach auf das Feld beziehen... wer weiß, wann man den Betrag mal irgendwo braucht (Fiktive Anforderung: "Kannst Du uns zeigen, wie viel Euro das insgesamt sind?" )
Peter Klett:
Hallo Torsten,
das passt fast, nur ist die Beziehung zwischen Kategorienummer und Betrag nicht so linear. Mit einer kleinen Ergänzung geht das aber. Und um pingelig zu sein, könnte man die ersten beiden Zeilen weglassen, da _nr auch bei leerer Kategorie keine Zahl wird
_isMitglied := @IsMember("Verband B"; values);
REM "Abbrechen, wenn Kategorie leer";
@If( iTeKategorie = "" ; @Return( "" ) ; "" );
_nr := @TextToNumber( @Left( iTeKategorie ; "." ) );
REM "Abbrechen, wenn am Anfang der Kategorie keine Zahl steht";
@If( @IsError( _nr ) ; @Return( "" ) ; "" );
REM "Preis der Kategorie";
_preis := @Select (_nr; 10; 20; 40; 60; -1);
@If (_preis < 0; @Return (""); "");
REM "Rechnung: _preis + 10 € für Nichtmitglieder";
_amount := _preis + @If( _isMitglied ; 0 ; 10 );
REM "Text zurückgeben";
@Text( _amount ) + " € / 1. Jahr"
buzi:
Hallo zusammen,
danke für die zahlreichen Ideen und Hilfestellungen. Die Lösung von Torsten optimiert von Peter finde ich am "elegantesten"! Mit elegant meinte ich wenig Zeilen, keine redundante Formulierung und wenig Fehleranfälligkeit. Allerdings funktioniert bei mir die Funktion @TextToNumber nicht, sie gibt immer leer zurück. Wenn ich debugge, kann die iTeKategorie = "1. XXXX" sein, @Left macht's noch richtig, bringt die 1 zurück, aber @TextToNumber bringt "" zurück. Wen ich die Beschreibung von @TextToNumber richtig verstehe, müsste es in dem Fall ja sogar ohne @Left gehen aber das tut auch nicht...
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln