Autor Thema: @Success und @Failure in "input validation"  (Gelesen 2554 mal)

Offline Frankonian

  • Frischling
  • *
  • Beiträge: 4
  • Geschlecht: Männlich
@Success und @Failure in "input validation"
« am: 30.01.08 - 00:00:28 »
Nun, ich besuche dieses Forum schon sehr lange und bin ganz ehrfürchtig. Toll, so ein Forum, habe schon oft was dazu lernen können ... Hier zunächst ein Danke an die fleißigen Autoren.

Wenn ich nun ein Problem beschreibe, so möge man mir verzeihen, dass ich viele englische Ausdrücke verwende, aber ich habe schon immer mit den englischsprachigen LN-Clients gearbeitet und zum Teil weiß ich gar nicht wie es im Deutschen heißt.

Nun ein Beitrag zum Thema "Man kann alt werden wie eine Kuh, man lernt doch immer noch dazu"  ;D

Stellt Euch folgendes vor:

Eine Form (Maske) enthält  Autoren- und Leserfelder.
Es gibt noch ein Feld, wo der Ersteller des Dokuments angeben soll, ob dies Dokument "öffentlich" (public) oder mit Zugriffsschutz (managed access) ausgestattet werden soll: Feld ISCategory -> radio buttons "public" (p) und "managed access" (m).
Wenn "public", dann soll das Leserfeld nicht gefüllt werden (Auswahlfeld über Adressbuch). Wenn "managed access", dann soll das Leserfeld nicht leer bleiben, also gefüllt werden (mit Personen und / oder Gruppen).
Und dann ist da noch eine dritte Überprüfung (Validierung)
nachträglich hinzu gekommen: Wenn ein @-Zeichen im Leserfeld ist, hat der Benutzer offensichtlich eine SMTP-email-Adresse reinkopiert und SMTP-Adressen funktionieren nicht als Leserfeldeinträge.

Ich sagte hier ausdrücklich "nachträglich" hinzugekommen.
Mit den zwei Prüfungen ging noch die Validierung und sobald die dritte Validierung hinzukam, ging diese nur teilweise.

So haben die zwei Validierungen ursprünglich ausgesehen:

@If(ISCategory="m" & ISReaderSelection="";
    @Failure("Within a document with managed access you have to select minimum one group or person as reader");
    @If(ISCategory="p" & ISReaderSelection!="";
        @Failure("You assigned restricted read access within this public document. Please correct this!");
        @Success));


Ja, den zweiten @If hätte ich mir sparen können, aber der Code stammt noch aus den frühen Zeiten (3.3) und ich weiß nicht mehr ob da schon if-then-elseif-elseif-...-else-endif Konstrukte möglich waren.

Nun gut, später habe ich noch die dritte Validierung hinzugefügt, so dass der Code nun so aussah:


@If(ISCategory="m" & ISReaderSelection="";
    @Failure("Within a document with managed access you have to select minimum one group or person as reader");
    @If(ISCategory="p" & ISReaderSelection!="";
        @Failure("You assigned restricted read access within this public document. Please correct this!");
        @Success));
@If(@Contains(ISReaderSelection;"@");
    @Failure("You have got a @ character in the reader field. Email addresses can't be used in reader fields. Please correct.");
    @Success);


Ich bilde mir immer noch ein, dass ich das Ganze zu der Zeit, als ich das einbaute mit Erfolg in den verschiedenen Varianten testete und es funktionierte.

Nun ist aber von Benutzern gemeldet worden, dass da komische Dinge passieren und die Validierung nicht mehr so greift, wie es sein sollte.
habe das nachgeprüft und ganz komische Effekte festgestellt.

Zur Überprüfung habe ich @Do (  ) Absätze gemacht und noch mit @Prompt ausgegeben wo ich gerade im Code bin und welche Werte bestimmte Felder und temporäre Variablen haben, etc.
Ich bin darauf gekommen, dass der Code in den Validierungszweig zwar rein läuft, aber das entsprechende @Failure statement nicht greift.
Unglaublich.
Dann habe ich vermieden, dass in dem Code mehrere @Success statements sind und siehe da, das hat den entscheidenden Erfolg gebracht.
Dieser Code funktioniert einwandfrei:


@If(@Contains(ISReaderSelection;"@");
    @Failure("You have got a @ character in the reader field. Email addresses can't be used in reader fields. Please correct.");
    ISCategory="m" & ISReaderSelection="";
    @Failure("Within a document with managed access you have to select minimum one group or person as reader");
    ISCategory="p" & ISReaderSelection!="";
    @Failure("You assigned restricted read access within this public document. Please correct this!");
    @Success)


Ich habe zwar zu @Failure gelesen, dass dies außerhalb der "input validation" anders regiert, aber bin ja innerhalb der Validierung (input validation) mit dem Code geblieben.

Von der Designerhilfe zu @Failure:
Usage
@Failure is mainly used in input validation formulas for editable fields, although you can also use it in agents and form formulas. When @Failure is used in formulas other than input validation formulas, the result is the input string; Lotus Notes/Domino displays no prompts or messages.

zu @Success:
Returns 1 (True). Use this function with @If in field validation formulas to indicate that the value entered satisfies the validation criteria.

So, nun, wie geht es weiter? Was war eigentlich der Fehler?
Ich bilde mir ein, es lag daran, dass ich eventuell in ein @Success gelaufen bin und weiter unten in Code ein @Failure deshalb nicht mehr gewirkt hat.
Liege ich damit richtig?

Ich habe den Code mit @Prompt - Ausgaben erweitert, dass ich weiß, ob der entsprechende Code durchlaufen wird und siehe da: Sobald der erste @Success durchlaufen wird, greifen weitere @Failure statements nicht mehr.



@If(@Contains(ISReaderSelection;"@");
    @Do(
    @Failure("You have got a @ character in the reader field. Email addresses can't be used in reader fields. Please correct.");
@Prompt([Ok];"in first if";"@ in ISReaderSelection")
       );
    @Success);
@If(ISCategory="m" & ISReaderSelection="";
    @Do(
    @Failure("Within a document with managed access you have to select minimum one group or person as reader");
    @Prompt([Ok];"in second if";"ISCategory=m & ISReaderSelection=emty")
    );
    @Success);
@If(ISCategory="p" & ISReaderSelection!="";
    @Do(
    @Failure("You assigned restricted read access within this public document. Please correct this!");
    @Prompt([Ok];"in third if";"ISCategory=p & ISReaderSelection=not emty")
    );
    @Success)


Wenn die jeweilige Bedingung (@If(condition) wahr (true) is, so läuft er in den @Do, führt den @Prompt aus, aber das @Failure statement kommt nicht hoch.

Habe schon recht an mir gezweifelt. Und bis jetzt habe ich nichts gefiúnden, dass man nicht mehrere @Success stements innerhalb einer Validierung verwenden sollte.

Wer hat ähnliche Erfahrung gemacht?
Liege ich mit meiner Vermutung richtig und gibt es Literatur, wo beschrieben ist, dass man dies und jenes mit @Success und @Failure lassen sollte?

?????
« Letzte Änderung: 30.01.08 - 02:21:51 von Frankonian »

Offline gab

  • Frischling
  • *
  • Beiträge: 45
Re: @Success und @Failure in "input validation"
« Antwort #1 am: 30.01.08 - 09:09:17 »
Ganz ehrlich, ich mag input validation nicht, weil es bei jedem Document Refresh ausgeführt wird und ich Feldvalidierungen lieber zentral codiert sehen will.

Zu deinem Problem:

"Zur Überprüfung habe ich @Do (  ) Absätze gemacht und noch mit @Prompt ausgegeben wo ich gerade im Code bin und welche Werte bestimmte Felder und temporäre Variablen haben, etc.
Ich bin darauf gekommen, dass der Code in den Validierungszweig zwar rein läuft, aber das entsprechende @Failure statement nicht greift.
Unglaublich."


Dein @prompt , den du eigentlich zur Kontrolle eingebaut hast, überschreibt leider intern den Rückgabewert von @failure, so dass dein Dokument daher gespeichert wird. Input Validierungen dürfen nur Rückgabewerte per @failure und @sucess beinhalten, sonst fällt Notes an dieser Stelle 'auf die Nase' 

HTH

- Gabor

Glombi

  • Gast
Re: @Success und @Failure in "input validation"
« Antwort #2 am: 30.01.08 - 09:34:41 »
Dein Konstrukt ist schon etwas seltsam, daher ist es mir vorher nicht aufgefallen, dass Notes so reagiert.
Offenbar wird in Eingabevaliderungsformeln nur der LETZTE Ausdruck geprüft!

In diesem Beispiel kommt KEINE Meldung, falls ISReaderSelection leer ist!
@If(
   ISReaderSelection = "";
      @Failure("Fehler 1");
   @Success
);
@If(
   ISReaderSelection != "";
      @Failure("Fehler 2");
   @Success
)



Also muss Dein Code so lauten:


@If(
   ISCategory="m" & ISReaderSelection="";
          @Failure("Within a document with managed access you have to select minimum one group or person as reader");
   ISCategory="p" & ISReaderSelection!="";
            @Failure("You assigned restricted read access within this public document. Please correct this!");
   @Contains(ISReaderSelection;"@");
          @Failure("You have got a @ character in the reader field. Email addresses can't be used in reader fields. Please correct.");
          @Success
)


Andreas
« Letzte Änderung: 30.01.08 - 09:36:33 von Glombi »

Glombi

  • Gast
Re: @Success und @Failure in "input validation"
« Antwort #3 am: 30.01.08 - 09:40:06 »
Damit es auch mit mehreren IFs geht, musst Du @Return(@Failure(...)) verwenden!

@If(
   ISReaderSelection = "";
      @Return(@Failure("Fehler 1"));
   @Success
);
@If(
   ISReaderSelection != "";
      @Return(@Failure("Fehler 2"));
   @Success
)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: @Success und @Failure in "input validation"
« Antwort #4 am: 30.01.08 - 19:26:15 »
Andreas spricht wahr, und Notes arbeitet korrekt. Da @Failure dem Continue= False in LS entspricht, wird immer nur der Status am Ende des Formelkonstrukts ernst genommen. Ein @Failure im ersten Konstrukt wird durch ein @Success im nachfolgenden Konstrukt überschrieben.

In der Regel gibt es für ein @Return (was dem "Exit Sub" in LotusScript entspricht) vollkommen unnötig, statt dessen hängt man die Bedingungen aneinander oder (unleserlicher) schachtelt die @Ifs (und das muss auch erstmal Sinn machen). Also:

@If (Bedingung1; Aktion; alternative Aktion; Bedingung2; alternative Aktion; Bedingung3; alternative Aktion; ....).
Wichtig hierbei: Bei der ersten Erfüllung einer Bedingung wird der Code nicht weiter ausgeführt - also genau das, was der Franke ja will.

HTH,
Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz