Domino 9 und frühere Versionen > ND8: Entwicklung

Verschachtelte @If-Abfragen

(1/3) > >>

buzi:
Hallo zusammen,

ich habe eine Frage wie man verschachtelte If-Abfragen in Formelsprache am besten formuliert. Es geht darum, dass ein Preis in Abhängigkeit der Mitgliedschaft (ja/nein) und der ausgewählten Kategorie berechnet wird. Zunächst wird anhand des Namens das Kunden-Dokument gefunden, um herauszufinden ob er Mitglied ist oder nicht (das funktioniert nach meinen Tests). Aber die If-Fragen laufen immer bis zum Ende durch also am Schluß steht "n.b.8" im Preis-Feld.

Die Formel meines Preis-Felds sieht bislang so aus:

key := @If(iTeFirma="";iTeNachname + " " + iTeVorname;iTeFirma +" "+ iTeNachname +" " + iTeVorname);
values := @DbLookup ( "":"Nocache"; "":""; "vwKunden "; key; "iTeMitgliedVon" );
isMitglied := @IsMember("Verband B"; values);

@If(iTeKategorie!="" & @Contains(iTeKategorie;"1.") & isMitglied ; "10 € / 1. Jahr"; "n.b.1");
@If(iTeKategorie!="" & @Contains(iTeKategorie;"1.") & !isMitglied ; "20 € / 1. Jahr"; "n.b.2");

@If(iTeKategorie!="" & @Contains(iTeKategorie;"2.") & isMitglied ; "20 € / 1. Jahr"; "n.b.3");
@If(iTeKategorie!="" & @Contains(iTeKategorie;"2.") & !isMitglied ; "30 € / 1. Jahr"; "n.b.4");

@If(iTeKategorie!="" & @Contains(iTeKategorie;"3.") & isMitglied ; "40 € / 1. Jahr"; "n.b.5");
@If(iTeKategorie!="" & @Contains(iTeKategorie;"3.") & !isMitglied ; "50 € / 1. Jahr"; "n.b.6");

@If(iTeKategorie!="" & @Contains(iTeKategorie;"4.") & isMitglied ; "60 € / 1. Jahr"; "n.b.7");
@If(iTeKategorie!="" & @Contains(iTeKategorie;"4.") & !isMitglied ; "70 € / 1. Jahr"; "n.b.8");

Hinweis: Wenn ich nur die erste If-Zeile stehen lasse, und im Kategorie-Feld "1." auswähle, klappt es - dann steht "10 € / Jahr" im Preis-Feld. Aber sobald die anderen IF-Zeilen dazu kommen geht es schief.

Kann man das in Formelsprache überhaupt elegant lösen oder braucht man Lotus Script dafür?

tks:
Auszug aus der Designer-Hilfe:

@If( condition1 ; action1 ; condition2 ; action2 ; ... ; condition99 ; action99 ; else_action )

Also nicht für jede Bedinung ein @If, sonder alles in eines.

Peter Klett:
Ich würde das ganze erst einmal etwas entzerren und ggf. @Return verwenden.

Annahme: Du gibst kein Ergebnis, wenn iTeKategorie leer ist

@If (iTeKategorie = ""; @Return (""); "");

Dann hast Du Kategorien, von denen Du nur den Zahlenwert zur Berechnung verwenden willst. Den würde ich mir einmalig in eine Variable rechnen

_k := @If (@Contains (iTeKategorie; "1."); "1" ; @Contains (iTeKategorie; "2."); "2"; @Contains (iTeKategorie; "3."); "3"; @Contains (iTeKategorie; "3."); "3"; @Contains (iTeKategorie; "4."); "4"; "");

Möglicherweise beginnt die Kategorie mit der Zahl, dann wäre es einfacher so

_k := @Left (iTeKategorie; 1)

oder

_k := @Left (iTeKategorie; ".")

Für die Mitgliedschaft würde ich mir auch noch einen Wert ermitteln

_m := @If (isMitglied; "1"; "0");

Danach kannst Du diese Werte zusammenfassen und damit wesentlich einfacher rechnen

_km := _k + _m;

@If (_km = "11"; "10 €"; _km = "10"; "20 €"; ...


da Nichtmitglieder anscheinend immer 10 € mehr bezahlen, ließe sich das auch noch anders in die Formel einbauen, indem am Ende nur einmalig die 10 € aufgeschlagen werden, falls kein Mitglied.

Die "schöne" Formulierung solcher Mehrfachbedingung ist prinzipiell nicht von der Sprache abhängig, auch in Script kann man das krautig schreiben.


thkn777:
Mi­ni­mal­in­va­siv an Deinem ursprünglichen Code geändert:


--- Code: ---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
--- Ende Code ---

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:


--- Code: ---@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."
);
--- Ende Code ---

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.

Bastel123:
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.

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

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln