Minimalinvasiv an Deinem ursprünglichen Code geändert:
x := @If(iTeKategorie!="" & @Contains(iTeKategorie;"1.") & isMitglied ; "10 € / 1. Jahr"; "n.b.");
x := @If(x="n.b." & iTeKategorie!="" & @Contains(iTeKategorie;"1.") & !isMitglied ; "20 € / 1. Jahr"; x);
x := @If(x="n.b." & iTeKategorie!="" & @Contains(iTeKategorie;"2.") & isMitglied ; "20 € / 1. Jahr"; x);
...
x := @If(x="n.b." & iTeKategorie!="" & @Contains(iTeKategorie;"4.") & !isMitglied ; "70 € / 1. Jahr"; x);
x
Das ist zwar nicht "verschachtelt" in dem Sinne, geht die Möglichkeiten aber - so wie von Dir geplant - der Reihe nach durch. Die einzelnen Abfragen schleppen "n.b." als (Zwischen-)Wert für x solange mit, bis ein Wert ermittelt werden kann. Oder bis zum bitteren Ende.
Ansonsten das, was tks vorschlug: einfach so machen, wie in der Designer-Hilfe steht, ich finde das jetzt nicht wirklich schlimm:
@If(
iTeKategorie!="" & @Contains(iTeKategorie;"1.") & isMitglied ; "10 € / 1. Jahr";
iTeKategorie!="" & @Contains(iTeKategorie;"1.") & !isMitglied ; "20 € / 1. Jahr";
iTeKategorie!="" & @Contains(iTeKategorie;"2.") & isMitglied ; "20 € / 1. Jahr";
...
iTeKategorie!="" & @Contains(iTeKategorie;"4.") & !isMitglied ; "70 € / 1. Jahr";
"n.b."
);
Was genau Du unter elegant verstehst, weiß ich nicht. Gute Planung und ein sinnvolles Vorgehen beim Prüfen und Ermitteln derartiger Werte ist aber eine gute Idee und kommt nicht nur der Lesbarkeit des Codes sondern auch der Performance zugute. Ideen dazu hat ja schon Peter geäußert.
Ich wünsche viel Erfolg.
Man kann auch einfach doppelte Abfragen vermeiden, das spart Platz und ist damit lesbarer.
Also so etwa in der Art:
@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")
)
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:_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"
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?" )