- Posts: 31
- Thank you received: 1
Welcome to the LimeSurvey Community Forum
Ask the community, share ideas, and connect with other LimeSurvey users!
Validierung von Adressdaten
- AnnaBurmeister
- Topic Author
- Offline
- Junior Member
wir haben versucht unsere Abfrage von Kontaktdaten zu validieren. Im Manual fanden wir diese Angaben:
VALIDIERUNG HAUSNR.: /^[1-9][0-9]{0,}$/
VALIDIERUNG PLZ: /^([0-9][0-9][0-9][0-9][0-9])$/
VALIDIERUNG E-MAIL: /^.+?@.+?\..+$/
Anbei unsere Umsetzung , die leider immer Fehlermeldungen bringt.
Bei der Validierung der Hausnummer sind wir uns auch nicht sicher, ob eine Hausnummer "5a" eine Fehlermeldung bringen würde. Das sollte möglichst nicht der Fall sein.
Für Unterstützung bei der Umsetzung sind wir dankbar.
Viele Grüße
Anna
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
Und die Syntax ist falsch.
Hier musst Du die Funktion "regexMatch" benutzen regexMatch(pattern,QCode)
Bei der Hausnummer kannst Du ja noch ein [A-Za-z] dahintersetzen.
Und Du solltest den Validierungstip entsprechend des Fehlers anpassen, also z.B.
{if(is_empty(...),"Diese Frage ist eine Pflichtfage",if(!regexMatch(pattern,QCode),"Bitte geben Sie eine gültige PLZ ein",...
Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
jetzt etwas ausführlicher.
Zunächst zur "Teilfragenvalidierung. Wie im Handbuch steht
Sub-question validation equation (em_validation_sq)
Description
This is an equation that is used to validate each subquestion (text field) individually. Any text field that does not pass these validation conditions will have its background color turned pink (using the .em_sq_fn_validation CSS style) to highlight the error. Note that this is available in addition to the regular expression-based validation option.
Valid values
Any equation that makes use of the ExpressionScript syntax, without surrounding curly braces.
Examples
For example, if you want to allow only numbers that are a multiple of 3 as answers, the equation would be:
(this / 3) == floor(this/3)
The reserved variable this is automatically replaced by a reference to the active text entry cell.
werden hiermit durch eine einzige Funktion alle Teilfragen gleichzeitig validiert.
Wie im Beispiel - ALLE Eingaben müssen durch 3 teilbar sein.
Du hast aber für jede Zelle unterschiedliche Validierungen.
Gut, im Endeffekt läuft es auf diese Validierung hinaus:
!is_empty(Kontaktvalidiert_SQ002_SQ001.NAOK) AND !is_empty(Kontaktvalidiert_SQ003_SQ001.NAOK) AND !is_empty(Kontaktvalidiert_SQ005_SQ001.NAOK) AND !is_empty(Kontaktvalidiert_SQ006_SQ001.NAOK) AND !is_empty(Kontaktvalidiert_SQ007_SQ001.NAOK) AND !is_empty(Kontaktvalidiert_SQ008_SQ001.NAOK) AND regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',Kontaktvalidiert_SQ003_SQ001.NAOK) AND regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',Kontaktvalidiert_SQ005_SQ001.NAOK) AND regexMatch('/^.+?@.+?\..+$/',Kontaktvalidiert_SQ008_SQ001.NAOK)
Alle diese Bedingungen müssen ja für die Frage erfüllt sein.
Außerdem siehst Du den richtigen Gebrauch einer "Regular Expression".
Jetzt zum Hinweis:
Da es ziemlich verwirrend wäre, die Fehlermeldung "Das ist ein Pflichtfeld" anzuzeigen, wenn die Postleitzahl nur 4 Stellen hat, musst Du den Tipp entsprechend formulieren - mit einem geschachtelten IF-Statement.
Z.B. (nur ganz roh)
{if(is_empty(Kontaktvalidiert_SQ002_SQ001) OR is_empty(Kontaktvalidiert_SQ003_SQ001) OR is_empty(Kontaktvalidiert_SQ005_SQ001) OR is_empty(Kontaktvalidiert_SQ006_SQ001) OR is_empty(Kontaktvalidiert_SQ007_SQ001) OR is_empty(Kontaktvalidiert_SQ008_SQ001),"Mit * gekennzeichnete Felder sind Pflichtfelder",if(!regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',Kontaktvalidiert_SQ003_SQ001.NAOK),"Bitte, geben Sie eine gültige Hausnummer ein!",if(!regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',Kontaktvalidiert_SQ005_SQ001.NAOK),"Bitte, geben Sie eine gültige PLZ ein!",if(!regexMatch('/^.+?@.+?\..+$/',Kontaktvalidiert_SQ008_SQ001.NAOK),"Bitte, geben Sie eine gültige E-Mail-Adresse ein!",""))))}
Joffm
Na, irgendwann muss das Ding doch einmal fertig werden.
Volunteers are not paid.
Not because they are worthless, but because they are priceless
- AnnaBurmeister
- Topic Author
- Offline
- Junior Member
- Posts: 31
- Thank you received: 1
Der Feinschliff will mir jedoch einfach nicht gelingen.
Bei der Übernahme kam es stets zu Fehlermeldung für die Hausnummer: regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',Kontaktvalidiert_SQ003_SQ001.NAOK) Hier werden nur zweistellige Hausnummern angenommen. Mein Versuch die zwei Zahlen analog zu +[A-Za-z] mit einem + zu verbinden - regexMatch('/^[1-9]+[0-9]+[0-9]+[A-Za-z]?$/',KontaktStandort1_SQ003_SQ001.NAOK) -, brachte auch keine Abhilfe.
Und weil wir schon am Feinschliff sind: Wie lassen sich auch für die SQ001, SQ002, SQ006 und SQ012 angepasste Fehlermeldungen einfügen? Auch mit regex
SQ001: Bitte geben Sie die Bezeichnung des Standortes an.
SQ002: Bitte geben Sie die Straße des Standortes an.
SQ006: Bitte geben Sie den Ort des Standortes an.
SQ012: Bitte geben Sie an, ob an diesem Standort Mitarbeitende von Agentur für Arbeit, Jobcenter und dem örtlichen Träger der öffentlichen Jugendhilfe vertreten sind.
@Joffm: Ich hoffe, dass dieses Ding wirklich bald fertig ist. Mein Geduldsfaden ist am Ende, meine Kenntnisse auch. Umso größer mein Dank für die Unterstützung.
Anna
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
Das glaube ich nicht.regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',Kontaktvalidiert_SQ003_SQ001.NAOK) Hier werden nur zweistellige Hausnummern angenommen.
Es ist ja so: [1-9][0-9]+[A-Za-z]?
1 Zeichen von 1-9,
1 Zeichen von 0-9, dabei sagt hier das Pluszeichen "keinmal oder mehrmals".
1 Zeichen von A-Z oder a-z, bei welchem aber durch das Fragezeichen gesagt wird "die Klammer kommt nicht oder genau einmal vor".)
Ich meine, wenn Du RegEx verwenden willst, musst Du auch ein bisschen darüber wissen.
Hier kann man gut testen und üben:
regex101.com/
Und zum Validierungstipp:
Im Moment sieht es ja so aus für die einfachen Pflichtfelder:
{if(is_empty(KontaktStandort1_SQ002_SQ001) OR is_empty(KontaktStandort1_SQ003_SQ001) OR is_empty(KontaktStandort1_SQ005_SQ001) OR is_empty(KontaktStandort1_SQ006_SQ001) OR is_empty(KontaktStandort1_SQ007_SQ001) OR is_empty(KontaktStandort1_SQ008_SQ001),"Mit * gekennzeichnete Felder sind Pflichtfelder",
...
Wenn Du für jedes einzelne Feld eine separate Meldung haben willst, musst Du nur dieses ebenso aufgliedern wie es bei den anderen Feldern ist.
Es ist ja immer dasselbe Prinzip.
ODER Du kannst auch für jedes Feld einen separaten Tipp eintragen, etwa so:
{if(is_empty(KontaktStandort1_SQ001_SQ001),"'Bezeichnung des Standortes' ist ein Pflichtfeld<br/>","")}
...
{if(!regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',KontaktStandort1_SQ003_SQ001.NAOK),"Bitte geben Sie eine gültige Hausnummer ein!","")}
...
Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
ich habe mir einmal die Mühe gemacht, einen Validierungshinweis für jedes einzelne Feld zu machen.
{if(is_empty(KontaktStandort1_SQ002_SQ001),"Bitte, füllen Sie 'Straße' aus",if(is_empty(KontaktStandort1_SQ003_SQ001),"Bitte, füllen Sie 'Hausnummer' aus",if(!regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',KontaktStandort1_SQ003_SQ001.NAOK),"Bitte geben Sie eine gültige Hausnummer ein!",if(is_empty(KontaktStandort1_SQ005_SQ001),"Bitte, füllen Sie 'PLZ' aus",if(!regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',KontaktStandort1_SQ005_SQ001.NAOK),"Bitte geben Sie eine gültige PLZ ein!",if(is_empty(KontaktStandort1_SQ006_SQ001),"Bitte, füllen Sie 'Ort' aus",if(is_empty(KontaktStandort1_SQ007_SQ001),"Bitte, füllen Sie 'Telefon' aus",if(is_empty(KontaktStandort1_SQ008_SQ001),"Bitte, füllen Sie 'E-Mail-Adresse' aus",if(!regexMatch('/^.+?@.+?\..+$/',KontaktStandort1_SQ008_SQ001.NAOK),"Bitte geben Sie eine gültige E-Mail-Adresse ein!","")))))))))}
Die Gleichung kann ja so bleiben
!is_empty(KontaktStandort1_SQ001_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ002_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ003_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ005_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ006_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ007_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ008_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ012_SQ001.NAOK) AND regexMatch('/^[1-9]+[0-9]+[0-9]+[A-Za-z]?$/',KontaktStandort1_SQ003_SQ001.NAOK) AND regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',KontaktStandort1_SQ005_SQ001.NAOK) AND regexMatch('/^.+?@.+?\..+$/',KontaktStandort1_SQ008_SQ001.NAOK)
wobei der Standort ja aus einer Vorfrage eingepipet wird; kann also eigentlich entfallen.
Dann sieht es so aus:
1.
2.
3.
4.
5.
6.
Und wenn Du schon ganz genau sein willst, kannst Du auch die "Pflichtfeldsternchen" rot machen mit
Straße <span style="color:red"><sup>*</sup></span>
Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
- AnnaBurmeister
- Topic Author
- Offline
- Junior Member
- Posts: 31
- Thank you received: 1
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
Es wird anscheinend kein Fehlertext angegeben (er ist nicht rot), trotzdem ist die Frage noch fehlerbehaftet.
Also her mit dem lss export.
Joffm
Oh, sorry,
Ich habe gerade gesehen, dass ich die "alte" Validierungsgleichung als "kann so bleiben" eingefügt hatte.
!is_empty(KontaktStandort1_SQ001_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ002_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ003_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ005_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ006_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ007_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ008_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ012_SQ001.NAOK) AND regexMatch('/^[1-9]+[0-9]+[0-9]+[A-Za-z]?$/',KontaktStandort1_SQ003_SQ001.NAOK) AND regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',KontaktStandort1_SQ005_SQ001.NAOK) AND regexMatch('/^.+?@.+?\..+$/',KontaktStandort1_SQ008_SQ001.NAOK)
Da steht ja dieser Unsinn drin.
Nein , sie muss lauten:
!is_empty(KontaktStandort1_SQ001_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ002_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ003_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ005_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ006_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ007_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ008_SQ001.NAOK) AND !is_empty(KontaktStandort1_SQ012_SQ001.NAOK) AND regexMatch('/^[1-9][0-9]+[A-Za-z]?$/',KontaktStandort1_SQ003_SQ001.NAOK) AND regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',KontaktStandort1_SQ005_SQ001.NAOK) AND regexMatch('/^.+?@.+?\..+$/',KontaktStandort1_SQ008_SQ001.NAOK)
Volunteers are not paid.
Not because they are worthless, but because they are priceless
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
zunächst einmal musste ich wohl meiner Vergreisung Tribut zollen.
Ich hatte Deine Formulierung "Hier werden nur zweistellige Hausnummern angenommen." interpretiert als "Ich kann keine dreistelligen Hausnummern eingeben" und nicht als "Ich kann keine einstelligen..."
Daher muss das Pluszeichen in der RegEx durch ein Sternchen ersetzt werden.
Außerdem habe ich noch einen Validierungstext für die letzte Teilfrage (Dropdown) zugefügt; der Text sollte vielleicht geändert werden.
Wenn ich richtig liege, wird der Name ja aus einer Vorfrage eingefügt, oder?
Hier also das "Gesamtkunstwerk".
Bis dann
Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
- AnnaBurmeister
- Topic Author
- Offline
- Junior Member
- Posts: 31
- Thank you received: 1
Die Antworten hier im Forum sind echt große Klasse. Vielen Dank für all die Mühe der Antwortenden.
- AnnaBurmeister
- Topic Author
- Offline
- Junior Member
- Posts: 31
- Thank you received: 1
Nach ein paar Verschiebungen bekomme ich die Validierung in der Frage [Kontakt1OSS] nicht mehr zum Laufen.
Für
Kontakt1OSS_SQ002_SQ001
Kontakt1OSS_SQ003_SQ001
Kontakt1OSS_SQ005_SQ001
Kontakt1OSS_SQ006_SQ001
Soll allgemein "Mit * gekennzeichnete Felder sind Pflichtfelder!" angezeigt werden.
Für das Felder
Kontakt1OSS_SQ003_SQ001
if(!regexMatch('/^[1-9][0-9]*[A-Za-z]?([-][1-9][0-9]*[A-Za-z]?)?$/',Kontakt1OSS_SQ003_SQ001.NAOK),"Bitte geben Sie eine gültige Hausnummer ein!",
Die fettgedruckten Angaben sind eine neue Ergänzung
und für das Feld
if(!regexMatch('/^[0-9][0-9][0-9][0-9][0-9]$/',Kontakt1OSS_SQ005_SQ001.NAOK),"Bitte geben Sie eine gültige PLZ ein!")
Könnte mir bitte jemand helfen, wo sich der Fehler verbirgt?
Außerdem habe ich noch eine zweite Frage:
Ich würde gern als Antwort zu einigen Teilfragen von [Kontakt1OSS] die Angabe von [Kontaktinfozentral] pipen
z. B. SQ008 (E-Mail-Adresse der Anlaufstelle) --> Kontaktinfozentral_SQ001
So soll das am Ende aussehen:
E-Mail-Adresse der Anlaufstelle: [Angabe von Kontaktinfozentral]
Meine Versuche mit {Kontaktinfozentral_SQ001.shown} oder !is_empty(Kontaktinfozentral_SQ001.NAOK) als Angabe in der Relevanz-Gleichung der jeweiligen Teilfrage waren nicht erfolgreich.
Vielen Dank im Voraus für Hinweise!
- Joffm
- Away
- LimeSurvey Community Team
- Posts: 12881
- Thank you received: 3964
Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless