Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Andreas Huhn am 25.10.05 - 11:12:50

Titel: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 11:12:50
Hi,

Ob eine Checkbox gehakt ist überprüfe ich so:
Code
@If(chk1_1="l" ...

Nun möchte ich eine Meldung ausgeben wenn keine von 20 Boxen gehakt ist. Einen @And Operator konnte ich nicht finden und in der Hilfe auch sonst keine Möglichkeit die Bedingungen zu verknüpfen, da die Syntax wie folgt lautet:

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



Nun hab ich mir eine Notkonstruktion überlegt mit der ich zumindest das Ziel erreichen könnte, auch wenn es alles andere als elegant ist:
Code
n := 0;

@If(chk1_1!="l" ; n := n+1  ; chk1_2!="l" ; n := n+1  ; chk1_3!="l" ; n := n+1  ; chk1_4!="l" ; n := n+1  ; chk1_5!="l" ; n := n+1  ; chk1_6!="l" ; n := n+1  ; chk1_7!="l" ; n := n+1  ; chk1_8!="l" ; n := n+1  ; chk1_9!="l" ; n := n+1  ; chk1_10!="l" ; n := n+1  ; chk1_11!="l" ; n := n+1  ; chk1_12!="l" ; n := n+1  ; chk1_13!="l" ; n := n+1  ; chk1_14!="l" ; n := n+1  ; chk1_15!="l" ; n := n+1  ; chk1_16!="l" ; n := n+1  ; chk1_17!="l" ; n := n+1  ; chk1_18!="l" ; n := n+1  ; chk1_19!="l" ; n := n+1  ; chk1_20!="l" ; n := n+1  ;  n := 0 );

Nun müsste doch n = 20 sein wenn  kein Haken gesetzt ist. Wenn ich den Wert von n mit  @SetField in ein Feld schreiben lasse kommt aber immer 1 raus, egal ob keiner oder alle Haken gesetzt sind.

Könnt ihr mir eine etwas elegantere Lösung dafür aufzeigen?

Grüße,

Andreas
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 11:31:36
Hi,

das ist auch logisch so. Denn du deklarierst n jedesmal neu. Erstze n:n+1 überall durch @Set("n"; n+1).


Code
n := 0;

@If(chk1_1!="l" ; @Set("n"; n+1)  ; chk1_2!="l" ; @Set("n"; n+1)  ; .... chk1_20!="l" ; @Set("n"; n+1)  ;  "" );



Axel
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 13:04:37
Das funktioniert leider noch nicht ganz.

Wenn ich n NICHT initialisiere ( n := 0;  -> seit R6 doch eigentlich nicht mehr nötig, oder?) dann wird eine Fehlermeldung ("Falscher Datentyp für Operator oder @Funktion: Text erwartet") geworfen.

Ansonsten wird immer 1 ausgegeben:

Code
n:=0;

@If(chk1_1!="l" ; @Set("n"; n+1)  ; chk1_2!="l" ; @Set("n"; n+1)  ; chk1_3!="l" ; @Set("n"; n+1)  ; chk1_4!="l" ; @Set("n"; n+1)  ; chk1_5!="l" ; @Set("n"; n+1)  ; chk1_6!="l" ; @Set("n"; n+1)  ; chk1_7!="l" ; @Set("n"; n+1)  ; chk1_8!="l" ; @Set("n"; n+1)  ; chk1_9!="l" ; @Set("n"; n+1)  ; chk1_10!="l" ; @Set("n"; n+1)  ; chk1_11!="l" ; @Set("n"; n+1)  ; chk1_12!="l" ; @Set("n"; n+1)  ; chk1_13!="l" ; @Set("n"; n+1)  ; chk1_14!="l" ; @Set("n"; n+1)  ; chk1_15!="l" ; @Set("n"; n+1)  ; chk1_16!="l" ; @Set("n"; n+1)  ; chk1_17!="l" ; @Set("n"; n+1)  ; chk1_18!="l" ; @Set("n"; n+1)  ; chk1_19!="l" ; @Set("n"; n+1)  ; chk1_20!="l" ; @Set("n"; n+1)  ;  "" );

@SetField("Z1";n)

Z1 ist ein Textfeld.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: klaussal am 25.10.05 - 13:09:31
... und n ist ein... ???-Feld  ;D
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 13:13:44
Nein, das Feld n gibt es jetzt nicht mehr. n ist jetzt ja auch eine temporäre Variable.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 13:20:03
Hi,

ist eigentlich ja auch logisch, dass n immer 1 ist. Die gesamte IF-Abfrage wird immer nur einmal ausgeführt und nicht die Abfragen nacheinander.

Was soll denn das Ganze werden?


Axel
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 13:26:27
Also sobald eine Condition True ist wird die zugehörige Action ausgeführt und dann nicht mehr weiter überprüft?

Wie ich im ersten Posting geschrieben habe. Ich würde gerne den Fall daß in keinem der 20 Felder ein Haken gesetzt ist erkennen und darauf reagieren können.

Wie man @If Abfragen kombiniert konnte ich (auch nicht über die Hilfe) in Erfahrung bringen. Darum habe ich nach einem Kontrukt gesucht das es mir erlaubt das Ergebnis irgendwie ablesen zu können. Daher der umständliche Versuch. Wenn ihr etwas besseres wisst, würde ich das sehr gerne erfahren.

Vlg.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: klaussal am 25.10.05 - 13:27:11
Code
@SetField("Z1";n)

Zitat
Nein, das Feld n gibt es jetzt nicht mehr.

Das widerspricht sich jetzt aber, oder ?
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 13:32:11
Code
@SetField("Z1";n)

Zitat
Nein, das Feld n gibt es jetzt nicht mehr.

Das widerspricht sich jetzt aber, oder ?

Ist der Inhalt meiner Variablen n denn zu diesem Zeitpunkt der Wertübergabe an das Feld denn schon wieder verloren?

Selbst mit einem Feld n ändert sich nichts am angezeigten Ergebnis.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 13:33:51
Wie ich im ersten Posting geschrieben habe. Ich würde gerne den Fall daß in keinem der 20 Felder ein Haken gesetzt ist erkennen und darauf reagieren können.


Wenn's nur darum geht, dann kannst du das auch so machen:

Code
n := 0;

@If(chk1_1="l" ; @Set("n"; 1)  ; chk1_2="l" ; @Set("n"; 1)  ; .... chk1_20="l" ; @Set("n"; 1)  ;  "" );


Somit ist wenn kein Häkchen gesetzt wurde n = 1, sonst 0.


Axel
 
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 13:42:05
Ich hab jetzt sicherheitshalber nochmal die Auswahlwerte aller Boxen überprüft damit auch wirklich überall ein "l" drin steht.

Das komische ist nämlich daß immer eine "1" zurückgeliefert wird, egal ob alle oder gar kein Haken gesetzt ist.

Mir ist grad noch eine Idee gekommen daß ich es mit 20 ineinander verschachtelten @If probieren könnte. Da die innerste ja nur erreicht wird wenn 19 mal TRUE vorangegangen ist.

Wie würdet ihr das lösen wenn ihr so ein Problem hättet?
Titel: Re: @If - mehrere Bedingungen
Beitrag von: klaussal am 25.10.05 - 13:51:07
Zitat
Wie würdet ihr das lösen wenn ihr so ein Problem hättet?

Das kommt immer auf die Aufgabenstellung an, so pauschal kann man wenig dazu sagen.
Vorschlag: Schaltfläche ins Doc (überprüfen auf Richtigkeit der Eingaben), wenn alles ok, Flag setzten und Speichern zulassen, ansonsten FM + nicht speichern. Das hätte den Vorteil, dass man die ganze Validierung in LS machen könnte und das geht viel eleganter als in Formeln.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 13:51:24
Hi,

wie sieht denn deine @If-Abfrage nun aus? Hast du dahingehend geändert, dass du auf gleich "l" abfrägst und nicht auf ungleich?

Ich hab's bei mir probiert, allerdings nicht mit 20 sondern nur mit 4 Feldern.

Mir ist grad noch eine Idee gekommen daß ich es mit 20 ineinander verschachtelten @If probieren könnte. Da die innerste ja nur erreicht wird wenn 19 mal TRUE vorangegangen ist.

Das ist aber im Prinzip das Gleiche was du jetzt schon hast.


Wie würdet ihr das lösen wenn ihr so ein Problem hättet?

Eigentlich genauso.


Axel
 
Titel: Re: @If - mehrere Bedingungen
Beitrag von: mibo11 am 25.10.05 - 13:58:30
Wie ich im ersten Posting geschrieben habe. Ich würde gerne den Fall daß in keinem der 20 Felder ein Haken gesetzt ist erkennen und darauf reagieren können.

Ich komme mit meinem Posting zwar etwas spät, aber warum macht ihr das eigentlich so kompliziert?

Belege doch einfach die Checkboxen mit Aliaswerten = "1", danach summierst du alle Checkboxen, vorher @Texttonumber natürlich nicht vergessen, wenn Summe > 0, dann wurde mindestens eine Checkbox ausgewählt.

Gruß Sascha
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 14:10:50
So viel komplizierter ist die andere Lösung auch nicht.


Axel
Titel: Re: @If - mehrere Bedingungen
Beitrag von: mibo11 am 25.10.05 - 14:13:45
So viel komplizierter ist die andere Lösung auch nicht.

Stimmt, für jemanden, der gerne viel Code schreibt nicht.  :)

Gruß Sascha

PS: Kommt eine Checkbox dazu, fängt man wieder an wilde IF's zu verschachteln.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Gandhi am 25.10.05 - 14:16:25
Wenn Feld leer, dann sei der Wert 0 gesetzt
Ist es gefüllt, dann habe es den Wert 1

Und dann kommt etwas vollkommen verblüffendes (für die allermeisten Notesentwickler) zum einsatz:
Eine einfache Oder-Verknüpfung (genau das willst Du nämlich offenbar tun.
Da 0=@False und 1=@True ist bieten sich diese Werte geradezu an.

Die Lösung wäre dann
_result:=n1|n2|...|n20;

Noch einfacher gehts wohl kaum...
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 25.10.05 - 15:01:26
Hab mit den ungleichs angefangen und dann auf = umgestellt. Vor lauter Code dann aber die ! nicht mal mehr bemerkt  ::)

So nun tuts zumindest. Danke euch!

Die Code-ärmere Version von Ghandi werd ich nachher noch probieren. Zunächst bin ich mal froh daß die Funktionalität da ist.

Danke!

Vlg

P.S. Etwas spät da das Board von Zeit zu Zeit ein wenig überlastet zu sein scheint.
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Gandhi am 25.10.05 - 15:24:20
Ach ja: Logische Operatoren in Formula language sind natürlcih aufgeführt:
| ist oder
& ist und
! ist nicht

Da das ganze in ND6 umgesetzt werden soll kannst Du Dir auch noch Schreibarbeit sparen:

@For( _i:=1 ; _i<=20 ;_i:=_i+1 ;
_result:=_result | feld;
)

Vorraussetzung, dass die Checkbox ein einzelnes Feld ist (was kein Problem sein sollte, wenn ich die Aufgabenstellung richtig verstanden habe).
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 15:33:07
Vorraussetzung, dass die Checkbox ein einzelnes Feld ist (was kein Problem sein sollte, wenn ich die Aufgabenstellung richtig verstanden habe).

Das glaube ich nicht so ganz. Ich vermute mal das hängt hiermit http://atnotes.de/index.php?topic=26572.0 zusammen.

Auf dem Trip mit der For-Schleife war ich auch schon. Hab's aber wieder verworfen, weil es getrennte Felder sind.

Aber deine Lösung hat was. Einfacher geht's sicher nicht mehr.


Axel
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Gandhi am 25.10.05 - 15:39:17
OK. ist dann eben folgender Code anzuwenden:

@For( _i:=1 ; _i<=20 ;_i:=_i+1 ;
_feldwert:=@getfield("feldname_"+@trim(@text(_i)));
_result:=_result | _feldwert;
)

Logische Operatoren haben was. Auch im Script. Leider sehe ich bei meinen wechselnden Arbeitsverhältnissen, dass sie extrem selten angewendet werden - allenfalls zum aneinanderhängen von if Klauseln, was letztendlich sehr schade ist, da sich die Sachen oft mit logischen Ausdrücken (und entsprechenden Variablennamen) viel sprechendere Scripte/Formulas erstellen lassen.

Titel: Re: @If - mehrere Bedingungen
Beitrag von: Axel am 25.10.05 - 16:03:15
@GetField hat mir gefehlt. Ich sehe schon, es ist mal wieder an der Zeit eine genaueren Blick auf die Formelbefehle und -funktionen zu werfen. 


Axel
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Andreas Huhn am 26.10.05 - 10:43:56
Ich glaub Ghandi's Methode ist die effizienteste und kürzeste und veranschaulicht mir die Technik recht schön.

Danke Axel und Ghandi!
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Simsala am 27.10.05 - 15:04:18
Sorry das ich mich nochmal kurz einmische aber. Warum so ein Aufwand?


Probiere doch mal folgendes:

ERG:=@Explode( Chk1_1 +"~"+Chk1_2 +"~"+Chk1_3 +"~"+Chk1_4 +"~"+Chk1_5 ...
; "~" ; 0 )
@if(@elements(erg)=0;"FEHLER";"Sie haben " + @Text(@elements(erg)) +  " Boxen geklickt");

Das wäre ja wohl dann der kürzeste Code oder ??

Mit explode eine Liste bauen die KEINE leeren elemente enthält und mit elements dann abfragen wieviele drin sind. Und schon bist du fertig. !!
Titel: Re: @If - mehrere Bedingungen
Beitrag von: Gandhi am 27.10.05 - 15:39:01
Je nach Anzahl der Felder ist das wohl möglich - aber warum eine Liste bauen, wenn ich mit

feld1 | feld2 |...|feldn

zum gleichen Ergebnis komme?

Und für viele Felder ist der Code
@For( _i:=1 ; _i<=20 ;_i:=_i+1 ;
_result:=_result | @texttonumber(@getfield("feldname_"+@trim(@text(_i))));
)
in der Kürze wohl kaum zu unterbieten.
Und besonders aufwändig ist das nicht