peter_rossa
I'm new here

dynamische Regel zur Überpfrüfung von Eingaben

Jump to solution

Hallo,

ich habe eine Absatzvorlage zur Erstellung von Kontaktdatensätzen. Ich möchte, dass das Formular eine Regel bekommt, die mir je nach Eingabe Felder markiert. Im Folgendem Fall geht es um die Adresse. Vorerst soll keine Prüfung der Felder sein. Jedoch wenn in Straße, Ort oder PLZ etwas eingegeben wurde, sollen die anderen beiden nicht ausgefüllten Felder markiert werden. Und dann weiterhin, je nachdem welches Feld dann noch ausgefüllt wurde, dieses dann nicht mehr angemarkert wird. Ich hoffe das war verständlich ausgedrückt Smiley Happy

Folgenden Code habe ich für jedes der 3 Elemente (cs_ort, cs_strasse, cs_plz) erstellt und angepasst, jedoch funktionieren diese nicht richtig:

[CODE]

<ON_RELEASE>   

        <IF>

            <NOT>

                <PROPERTY source="cs_ort" name="EMPTY"/>

            </NOT>           

        </IF>

        <WITH>

        <AND>

            <NOT>

                 <PROPERTY source="cs_strasse" name="EMPTY"/>

            </NOT>

            <NOT>

                 <PROPERTY source="cs_plz" name="EMPTY"/>

            </NOT>   

            </AND>

        </WITH>

        <DO>           

            <VALIDATION>

                <PROPERTY source="cs_strasse" name="VALID"/>

                <MESSAGE lang="*" text="The editor must not be empty!"/>

                <MESSAGE lang="DE" text="Der Editor darf nicht leer sein!"/>

            </VALIDATION>  

            <VALIDATION>

                <PROPERTY source="cs_plz" name="VALID"/>

                <MESSAGE lang="*" text="The editor must not be empty!"/>

                <MESSAGE lang="DE" text="Der Editor darf nicht leer sein!"/>

            </VALIDATION>           

        </DO>

    </ON_RELEASE>

[/CODE]

Ist es möglich, die 3 Regeln zu einer zu kombinieren? Zur Zeit werden dann alle Felder markeirt.

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo,

Es sollen also entweder alle oder keines der drei Felder gefüllt sein, richtig?

Grundsätzlich gibt es bei der o.g. Definition das Problem, dass ein vom Redakteur änderbarer Wert im IF-Teil steht, was in den meisten Fällen zu einer Art "Einbahnstraßenwirkung" führt und nicht gewollt ist - die Validierung sollte in beide Richtungen funktionieren (ungültig setzen UND wieder gültig setzen), es findet in der GUI kein "Reset" der Gültigkeit statt (das würde nur beim Speicherversuch passieren). Wenn beim IF-Block "false" herauskommt, wird der ganze Rest der Regel nicht mehr betrachtet.

Siehe hierzu auch FS5 Regeln: Regeln bei mehrsprachigen Projekten unbrauchbar?

Ob man diese Regeln in eine gießen kann, kommt darauf an, ob es reicht wenn alle Felder gemeinsam als gültig oder ungültig markiert werden sollen. Ich gehe aber mal davon aus, dass ein gefülltes Feld nie als fehlerhaft markiert werden soll, sondern alle leeren Felder, wenn mindestens eins gefüllt ist. Dann braucht man drei Regeln, da sich ja auch drei unabhängige Gültigkeitsstati ergeben können.

Zu den Regeln selber:

Manchmal ist es einfacher zu definieren, wann ein Feld UNGÜLTIG ist. Am Beispiel des Ortes:

"Der Ort ist ungültig, wenn er leer ist und mindestens eines der anderen Felder gefüllt ist".

Am einfachsten geht es mit ein bisschen Pseudocode weiter: Bedingung aufschreiben (möglilchst erstmal 1:1) und dann vereinfachen.

Bedingung gemäß Text:

ort.invalid = ort.empty && (!street.empty || !plz.empty)

Letztlich braucht man immer einen Ausdruck der Form x.valid=..., weil es eine <PROPERTY name="INVALID" /> nicht gibt. Also alles negieren:

ort.valid= !(ort.empty && (!street.empty || !plz.empty))

Sieht erstmal wild aus... Aber hier kann man gut die DeMorgan'schen Regeln anwenden [ !(A && B) = !A || !B ], zuerst die äußere Klammer:

ort.valid= !ort.empty || !(!street.empty || !plz.empty)

Und gleich nochmal für die zweite Klammer:

ort.valid = !ort.empty || (!!street.empty && !!plz.empty)

Doppelte Negation eliminieren, fertig:

ort.valid = !ort.empty || (street.empty && plz.empty)

Jetzt das Ganze in die XML-Syntax gießen:

<ON_SAVE>

    <WITH>

        <OR>

            <AND>

                <PROPERTY source="cs_strasse" name="EMPTY" />

                <PROPERTY source="cs_plz" name="EMPTY" />

            </AND>

            <NOT>

                <PROPERTY source="cs_ort" name="EMPTY" />

            </NOT>

        </OR>

    </WITH>

    <DO>

        <VALIDATION>

            <PROPERTY source="cs_ort" name="VALID" />

            <MESSAGE lang="*" text="Der Ort muss gefüllt sein, wenn PLZ und/oder Straße angegeben werden" />

        </VALIDATION>

    </DO>

</ON_SAVE>

Das müsste dann natürlich einmal "RoundRobin" für alle drei Felder gemacht werden.

Viele Grüße

Michael

View solution in original post

0 Kudos
3 Replies
Peter_Jodeleit
Crownpeak employee

Nein, in einer Regel wird das nicht gehen, da ja immer nur die leeren Felder als "auszufüllen" markiert sein sollen. Das "IF" solltest du komplett entfernen und im "WITH" für Feld x dann sinngemäss formulieren: Feld x nicht leer oder (Feld y und Feld z leer).

Fachlich bedeutet das dann: Feld x ist valide, wenn es nicht leer ist oder wenn auch Feld y und z leer sind.

Peter
0 Kudos
mbergmann
Crownpeak employee

Hallo,

Es sollen also entweder alle oder keines der drei Felder gefüllt sein, richtig?

Grundsätzlich gibt es bei der o.g. Definition das Problem, dass ein vom Redakteur änderbarer Wert im IF-Teil steht, was in den meisten Fällen zu einer Art "Einbahnstraßenwirkung" führt und nicht gewollt ist - die Validierung sollte in beide Richtungen funktionieren (ungültig setzen UND wieder gültig setzen), es findet in der GUI kein "Reset" der Gültigkeit statt (das würde nur beim Speicherversuch passieren). Wenn beim IF-Block "false" herauskommt, wird der ganze Rest der Regel nicht mehr betrachtet.

Siehe hierzu auch FS5 Regeln: Regeln bei mehrsprachigen Projekten unbrauchbar?

Ob man diese Regeln in eine gießen kann, kommt darauf an, ob es reicht wenn alle Felder gemeinsam als gültig oder ungültig markiert werden sollen. Ich gehe aber mal davon aus, dass ein gefülltes Feld nie als fehlerhaft markiert werden soll, sondern alle leeren Felder, wenn mindestens eins gefüllt ist. Dann braucht man drei Regeln, da sich ja auch drei unabhängige Gültigkeitsstati ergeben können.

Zu den Regeln selber:

Manchmal ist es einfacher zu definieren, wann ein Feld UNGÜLTIG ist. Am Beispiel des Ortes:

"Der Ort ist ungültig, wenn er leer ist und mindestens eines der anderen Felder gefüllt ist".

Am einfachsten geht es mit ein bisschen Pseudocode weiter: Bedingung aufschreiben (möglilchst erstmal 1:1) und dann vereinfachen.

Bedingung gemäß Text:

ort.invalid = ort.empty && (!street.empty || !plz.empty)

Letztlich braucht man immer einen Ausdruck der Form x.valid=..., weil es eine <PROPERTY name="INVALID" /> nicht gibt. Also alles negieren:

ort.valid= !(ort.empty && (!street.empty || !plz.empty))

Sieht erstmal wild aus... Aber hier kann man gut die DeMorgan'schen Regeln anwenden [ !(A && B) = !A || !B ], zuerst die äußere Klammer:

ort.valid= !ort.empty || !(!street.empty || !plz.empty)

Und gleich nochmal für die zweite Klammer:

ort.valid = !ort.empty || (!!street.empty && !!plz.empty)

Doppelte Negation eliminieren, fertig:

ort.valid = !ort.empty || (street.empty && plz.empty)

Jetzt das Ganze in die XML-Syntax gießen:

<ON_SAVE>

    <WITH>

        <OR>

            <AND>

                <PROPERTY source="cs_strasse" name="EMPTY" />

                <PROPERTY source="cs_plz" name="EMPTY" />

            </AND>

            <NOT>

                <PROPERTY source="cs_ort" name="EMPTY" />

            </NOT>

        </OR>

    </WITH>

    <DO>

        <VALIDATION>

            <PROPERTY source="cs_ort" name="VALID" />

            <MESSAGE lang="*" text="Der Ort muss gefüllt sein, wenn PLZ und/oder Straße angegeben werden" />

        </VALIDATION>

    </DO>

</ON_SAVE>

Das müsste dann natürlich einmal "RoundRobin" für alle drei Felder gemacht werden.

Viele Grüße

Michael

0 Kudos

vielen Dank für die schnelle Hilfe, Michael. Genau nach dem hatte ich gesucht.

Grüße, Peter

0 Kudos