x

Hauptkapitel

  1. LimeSurvey Cloud oder LimeSurvey CE?
  2. LimeSurvey Cloud - Schnellstartanleitung
  3. LimeSurvey CE - Installation
  4. Wie man eine gute Umfrage gestaltet (Leitfaden)
  5. Erste Schritte
  6. LimeSurvey-Konfiguration
  7. Einführung - Umfragen
  8. Umfrageeinstellungen anzeigen
  9. Umfragemenü anzeigen
  10. Umfragestruktur anzeigen
  11. Einführung - Fragen/Fragetypen
  12. Einführung - Fragegruppen
  13. Einführung - Umfragen - Management
  14. Optionen der Umfrage-Symbolleiste
  15. Mehrsprachige Umfrage
  16. Kurzanleitung - ExpressionScript
  17. Erweiterte Funktionen
  18. Allgemeine FAQ - Häufig gestellte Fragen
  19. Fehlerbehebung
  20. Tipps und Tricks
  21. Lizenzbestimmungen
  22. Änderungshistorie
  23. Plugins - Erweitert
 Actions

ExpressionScript - Presentation/de: Difference between revisions

From LimeSurvey Manual

Maren.fritz (talk | contribs)
Created page with "ExpressionScript - Präsentation"
 
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(164 intermediate revisions by one other user not shown)
Line 4: Line 4:




=Introduction=
=Einleitung=




LimeSurvey uses the new ExpressionScript (EM) module which lets LimeSurvey support more complex branching, assessments, validation, and tailoring. It replaces how LimeSurvey manages Replacements, [[Setting conditions|Conditions]], and [[Assessments]] on the back-end. It also speeds up processing considerably since it eliminates most run-time database reads. EM was developed by Dr. Thomas White (TMSWhite).
<div class="mw-translate-fuzzy">
LimeSurvey verwendet das neue Expression Manager (EM)-Modul, mit dem LimeSurvey komplexere Verzweigungen, Bewertungen, Validierungen und Anpassungen unterstützen kann. Es ersetzt die Art und Weise, wie LimeSurvey Ersetzungen, Bedingungen und Bewertungen im Backend verwaltet. Außerdem wird die Verarbeitung erheblich beschleunigt, da die meisten Datenbanklesevorgänge zur Laufzeit entfallen. EM wurde von Dr. Thomas White (TMSWhite) entwickelt.
</div>




==Key definitions==  
==Schlüsseldefinitionen==  




#'''Expression''': Anything surrounded by curly braces:
#'''Ausdruck''': Alles, was von geschweiften Klammern umgeben ist:
#*As long as there is no white space immediately after the opening brace or before the closing curly brace.
#*Solange sich unmittelbar nach der öffnenden Klammer oder vor der schließenden geschweiften Klammer kein Leerzeichen befindet.
#*The expression content is evaluated by EM, so it can contain mathematical formulas, functions, and complex string and date processing.
#*Der Inhalt des Ausdrucks wird von EM ausgewertet, sodass er mathematische Formeln, Funktionen und komplexe Zeichenfolgen- und Datumsverarbeitung enthalten kann.
#'''Tailoring''': Sometimes called "piping". It is the process of conditionally modifying text:
#'''Tailoring''': Wird manchmal als „Piping“ bezeichnet. Dabei handelt es sich um den Prozess der bedingten Änderung von Text:
#*You have access to all 'replacement fields', participant data, and response data.
#*Sie haben Zugriff auf alle „Ersatzfelder“, Teilnehmerdaten und Antwortdaten.
#*You also have easier access to questions, answers, and their properties.
#*Sie haben außerdem einfacheren Zugriff auf Fragen, Antworten und deren Eigenschaften.
#'''Relevance''' Equation: A new question attribute controlling question visibility:
#'''Relevanz''' Gleichung: Ein neues Frageattribut, das die Sichtbarkeit der Frage steuert:
#*If there is a relevance equation, then the question is only shown if the relevance evaluates to true.
#*Wenn eine Relevanzgleichung vorhanden ist, wird die Frage nur angezeigt, wenn die Relevanz als wahr ausgewertet wird.
#*Internally, all [[QS:Array_filter|array_filter]] and [[QS:Array_filter_exclude|array_filter_exclude]] commands become subquestion-level relevance.
#*Intern werden alle [[QS:Array_filter|array_filter]] und [[QS:Array_filter_exclude|array_filter_exclude]] Befehle auf Unterfragenebene relevant.
#'''SGQA''' (how variables were named in the past):
#'''SGQA''' (wie Variablen früher benannt wurden):
#*Stands for Survey-Group-Question-Answer
#*Steht für Survey-Group-Question-Answer
#*SGQA variable names look like 123X5X382X971, and may have subquestion suffixes.
#*SGQA-Variablennamen sehen wie 123X5X382X971 aus und können Unterfragesuffixe haben.
#*These variable names are specific to the underlying S/Q/G/A database codes, so they often need to be changed
#*Diese Variablennamen sind spezifisch für die zugrunde liegenden S/Q/G/A-Datenbankcodes und müssen daher häufig geändert werden
#'''Equation''' Question Type: [[Question type - Equation|A new question type]] that saves calculations or reports to the database:
#'''Gleichung''' Fragetyp: [[Fragetyp - Gleichung|Ein neuer Fragetyp]], der Berechnungen oder Berichte in der Datenbank speichert:
#*It is like a Boilerplate question, but its contents are saved to the database even if you set "Always Hide this Question".
#*Es ähnelt einer Standardfrage, aber der Inhalt wird in der Datenbank gespeichert, auch wenn Sie „Diese Frage immer ausblenden“ festlegen.
#'''Question Code''': This is the preferred variable name for EM:
#'''Fragecode''': Dies ist der bevorzugte Variablenname für EM:
#*This can be a descriptive name indicating the purpose of the question, making it easier to read complex logic.
#*Dies kann ein beschreibender Name sein, der den Zweck der Frage angibt und das Lesen komplexer Logik erleichtert.
#*Valid question codes should NOT start with a number, so when using the question code to number your questions, simply use "q1", or "q1a" or "g1q2".
#*Gültige Fragecodes sollten NICHT mit einer Zahl beginnen. Wenn Sie also den Fragecode zum Nummerieren Ihrer Fragen verwenden, verwenden Sie einfach „q1“, „q1a“ oder „g1q2“.
#*This is what becomes the variable name if you export data to SPSS or R. So, if you do statistical analysis, you need to create only unique question codes.
#*Dies wird zum Variablennamen, wenn Sie Daten nach SPSS oder R exportieren. Wenn Sie also statistische Analysen durchführen, müssen Sie nur eindeutige Fragecodes erstellen.




==Do I have to use EM?==
<div class="mw-translate-fuzzy">
==Muss ich EM verwenden?==
</div>




The short answer is "no". However, this heavily depends on the complexity of the survey you want to create.  
Die kurze Antwort lautet „Nein“. Dies hängt jedoch stark von der Komplexität der Umfrage ab, die Sie erstellen möchten.  


For example, the [[Setting conditions|Conditions editor]] covers some basic expressions that can be applied to the questions of your survey. However, the Conditions editor is limited. That is why the EM is used - it expands the realm of [[Expression_Manager_to_be_updated#Quick_start_tutorial|customization possibilities]].
<div class="mw-translate-fuzzy">
Der [[Bedingungen festlegen|Bedingungseditor]] deckt beispielsweise einige grundlegende Ausdrücke ab, die auf die Fragen Ihrer Umfrage angewendet werden können. Allerdings ist der Bedingungen-Editor eingeschränkt. Aus diesem Grund wird das EM verwendet – es erweitert den Bereich der [[Expression_Manager_to_be_updated#Quick_start_tutorial|Anpassungsmöglichkeiten]].
</div>




==Can I mix Conditions and Relevance equations?==
==Kann ich Bedingungen und Relevanzgleichungen mischen?==




Yes. You can use the [[Setting conditions|Conditions editor]] for some questions and [[QS:Relevance|Relevance equations]] for others.  
Ja. Für einige Fragen können Sie den [[Einstellungsbedingungen|Bedingungseditor]] und für andere [[QS:Relevance|Relevanzgleichungen]] verwenden.  


'''You cannot have both conditions and expressions set up in the same question!''' Once a condition is set up, it replaces whatever expression is written in the relevance equation field. Moreover, the [[QS:Relevance|Relevance equation]] field cannot any longer be manually edited.
'''Sie können nicht sowohl Bedingungen als auch Ausdrücke in derselben Frage einrichten!''' Sobald eine Bedingung eingerichtet ist, ersetzt sie jeden Ausdruck, der in das Relevanzgleichungsfeld geschrieben wird. Darüber hinaus kann das Feld [[QS:Relevance|Relevanzgleichung]] nicht mehr manuell bearbeitet werden.


Yet, there is a way to use both expressions and conditions within a question. As mentioned above, a condition replaces the relevance equation field. Once done, check what is the newly created equation and copy it in a text editor. Delete the newly created condition from the [[Setting conditions|Conditions editor]] and then edit the question by adding the condition-based expressions from your text editor file alongside the rest of expressions you wish to use.  
Dennoch gibt es eine Möglichkeit, sowohl Ausdrücke als auch Bedingungen innerhalb einer Frage zu verwenden. Wie oben erwähnt, ersetzt eine Bedingung das Relevanzgleichungsfeld. Wenn Sie fertig sind, überprüfen Sie die neu erstellte Gleichung und kopieren Sie sie in einen Texteditor. Löschen Sie die neu erstellte Bedingung aus dem [[Bedingungen festlegen|Bedingungseditor]] und bearbeiten Sie dann die Frage, indem Sie die bedingungsbasierten Ausdrücke aus Ihrer Texteditordatei zusammen mit den übrigen Ausdrücken hinzufügen, die Sie verwenden möchten.  




==How should I choose between Conditions and Relevance?==
==Wie soll ich zwischen Bedingungen und Relevanz wählen?==




Here is a list of the pros and cons of each style:
Hier ist eine Liste der Vor- und Nachteile jedes Stils:


{| class="wikitable"
{| class="wikitable"
!Style!!Pros!!Cons
!Stil!!Vorteile!!Nachteile
|-
|-
|Conditions||1. Nice [[Setting conditions|GUI]] for creating simple conditions. <br/>2. GUI well documented and understood by support team||1. Only supports simple comparisons and does not "AND" and "OR" conditions well. <br/>2. Cascading conditions work erratically <br/>3. Slow - database intensive -it can slow down long surveys. <br/>4. Some reported problems with reloading conditions.<br/>5. GUI doesn't scale well when there are dozens, hundreds, or thousands of questions. <br/>6. It could be slow to convert paper-based surveys since it must use [[SGQA identifier|SGQA]] names. <br/>7. Often need a programmer to custom-code logic needed for complex branching.
|Bedingungen||1. Schöne [[Bedingungen festlegen|GUI]] zum Erstellen einfacher Bedingungen.<br/> 2. GUI gut dokumentiert und vom Support-Team verständlich||1. Unterstützt nur einfache Vergleiche und funktioniert nicht gut mit „AND“- und „OR“-Bedingungen.<br/> 2. Kaskadierende Bedingungen funktionieren unregelmäßig.<br/> 3. Langsam – datenbankintensiv – kann lange Umfragen verlangsamen.<br/> 4. Einige haben Probleme mit den Nachladebedingungen gemeldet.<br/> 5. Die GUI lässt sich nicht gut skalieren, wenn es Dutzende, Hunderte oder Tausende von Fragen gibt.<br/> 6. Die Konvertierung papierbasierter Umfragen könnte langsam sein, da dabei [[SGQA-Kennung|SGQA]]-Namen verwendet werden müssen.<br/> 7. Oft ist ein Programmierer erforderlich, um die für komplexe Verzweigungen benötigte Logik individuell zu codieren.
|-
|-
|Relevance||1. Supports very complex logic, including 80+ functions and math/string operators. <br/>2. Perfect support for [[ExpressionScript_-_Presentation#Cascading_Conditions|cascading logic]]. <br/>3. Fast - no extra database calls, supporting 1000+ question surveys. <br/>4. No problems with reloading logic since it does not require [[SGQA identifier|SGQA]] codes. <br/>5. Syntax-highlighting scales to 1000+ question surveys. <br/>6. Easy and fast to use for groups wanting to computerize existing paper-based surveys. <br/>7. It easily supports semi-structured interviews and epidemiological surveys without needing a programmer.||1. No GUI for simple conditions - it makes use of [[Expression_Manager_to_be_updated#Syntax_Highlighting|syntax-highlighting]] instead.
|Relevanz||1. Unterstützt sehr komplexe Logik, einschließlich über 80 Funktionen und Mathematik-/String-Operatoren.<br/> 2. Perfekte Unterstützung für [[ExpressionScript_-_Presentation#Cascading_Conditions|kaskadierende Logik]].<br/> 3. Schnell – keine zusätzlichen Datenbankaufrufe, Unterstützung von Umfragen mit über 1000 Fragen.<br/> 4. Keine Probleme beim Neuladen der Logik, da keine [[SGQA-Kennung|SGQA]]-Codes erforderlich sind.<br/> 5. Syntax-Hervorhebungsskalen für Umfragen mit mehr als 1000 Fragen.<br/> 6. Einfach und schnell für Gruppen zu verwenden, die bestehende papierbasierte Umfragen computerisieren möchten.<br/> 7. Es unterstützt problemlos halbstrukturierte Interviews und epidemiologische Umfragen, ohne dass ein Programmierer erforderlich ist.||1. Keine GUI für einfache Bedingungen – stattdessen wird [[Expression_Manager_to_be_updated#Syntax_Highlighting|syntax-highlighting]] verwendet.
|}
|}




{{Note| '''Note:'''
{{Hinweis| '''Hinweis:'''
*We recommend you to use whatever fits better your needs.
*Wir empfehlen Ihnen, das zu verwenden, was Ihren Anforderungen besser entspricht.
*For a more detailed explanation of the EM features, click on the following [[EM and its features|link]].}}
*Für eine detailliertere Erklärung der EM-Funktionen klicken Sie auf den folgenden [[EM und seine Funktionen|Link]].}}


=Getting Started=
=Erste Schritte=




The best way to get started with the EM is to:
Der beste Weg, mit dem EM zu beginnen, ist:
*Install the latest stable version from https://www.limesurvey.org/en/download.  
*Installieren Sie die neueste stabile Version von https://www.limesurvey.org/en/download.  
*Import and explore some [[ExpressionScript sample surveys|sample surveys]].
*Importieren und erkunden Sie einige [[ExpressionScript-Beispielumfragen|Beispielumfragen]].
*Explore the [[ExpressionScript How-tos|use cases and how-tos]], and the [[ExpressionScript examples|step-by-step examples]].
*Entdecken Sie die [[ExpressionScript-Anleitungen|Anwendungsfälle und Anleitungen]] und die [[ExpressionScript-Beispiele|Schritt- Schrittweise Beispiele]].
*Explore the EM documentation (this page)
*Erkunden Sie die EM-Dokumentation (diese Seite)
**Unit Tests of Isolated Expressions (advanced)
**Unit-Tests isolierter Ausdrücke (fortgeschritten)
***shows examples of using all EM functions and operators, and the PHP and JavaScript results;
***zeigt Beispiele für die Verwendung aller EM-Funktionen und -Operatoren sowie die PHP- und JavaScript-Ergebnisse;
***note there are few functions that generate different results in the PHP and JavaScript versions, so this page lets you plan your EM logic accordingly.
***Beachten Sie, dass es in den PHP- und JavaScript-Versionen nur wenige Funktionen gibt, die unterschiedliche Ergebnisse generieren. Daher können Sie auf dieser Seite Ihre EM-Logik entsprechend planen.


=Terminology=
=Terminologie=




These words are commonly used to describe the capabilities of the EM:
Diese Wörter werden häufig verwendet, um die Fähigkeiten des EM zu beschreiben:
*'''Relevance-based Branching''' - if a question is relevant, then ask it, otherwise don't (e.g., make it invisible and mark it as NULL in the database). You may find the [[QS:Relevance|Relevance fields]] in the question editor panel as well as in the question group editor panel. The later is used to apply a set of conditions to an entire group without having to copy the same condition to each question, and/or combine group and question-level conditional logic).
*'''Relevanzbasierte Verzweigung''' – wenn eine Frage relevant ist, dann stellen Sie sie, andernfalls nicht (z. B. machen Sie sie unsichtbar und markieren Sie sie in der Datenbank als NULL). Sie können die [[QS:Relevance|Relevanzfelder]] sowohl im Frageneditor-Panel als auch im Fragengruppen-Editor-Panel finden. Letzteres wird verwendet, um eine Reihe von Bedingungen auf eine ganze Gruppe anzuwenden, ohne die gleiche Bedingung auf jede Frage kopieren zu müssen, und/oder die bedingte Logik auf Gruppen- und Fragenebene zu kombinieren. Dadurch können Sie nicht nur einfache Substitutionen (wie {TOKEN:FIRSTNAME}) unterstützen, sondern auch die Konjugation von Verben und die Deklination von Substantiven basierend auf dem Geschlecht oder der Anzahl Ihrer Subjekte. Außerdem können Sie die Nachricht, die Sie einem Umfrageteilnehmer übermitteln, basierend darauf ändern, ob er andere Fragen beantwortet hat (oder wie er diese beantwortet hat).
*'''Tailoring''' - Once you know which questions should be asked, tailoring (sometimes called ''piping'') specifies how the question should be asked. This lets you support not only simple substitution (like {TOKEN:FIRSTNAME}), but also conjugation of verbs and declination of nouns based upon the gender or number of your subjects. It also lets you change the message you deliver to a survey respondent based upon whether they answered (or how they answered) other questions.
*'''Gleichungen''' EM fügt einen neuen Fragetyp namens [[Fragetyp – Gleichung|Gleichung]] hinzu, der das Ergebnis eines Ausdrucks speichert. Die Gleichungsergebnisse werden berechnet und in die Datenbank geschrieben, auch wenn Sie sie auf der Seite ausblenden. Daher werden sie für versteckte Scoring-Berechnungen, Navigation auf der Grundlage komplexer Gleichungen, Bewertungen und Berichte verwendet, die in der Datenbank generiert und gespeichert werden.
*'''Equations''' - EM adds a new question type called [[Question type - Equation|Equation]] which stores the result of an Expression. The equation results are computed and written to the database, even if you hide them on the page. Thus, they are used for hidden scoring calculations, navigation based upon complex equations, assessments, and reports that will be generated and stored within the database.




==Relevance and Cascading Relevance==
==Relevanz und kaskadierende Relevanz==




Every question type now has a [[QS:Relevance|Relevance option]] which controls whether the question is displayed or not. The EM processes each Relevance Equation in the order they appear in the survey. If the expression is true (or missing - to support legacy surveys), the question will be displayed. If it is not relevant, then the question will be hidden, and the value will be NULLed in the database. If there are no relevant questions in a group, the entire group will be skipped.
Jeder Fragetyp verfügt jetzt über eine Relevanzoption, die steuert, ob die Frage angezeigt wird. EM verarbeitet jede der Relevanzgleichungen in der Reihenfolge, in der sie in der Umfrage erscheinen sollen. Wenn der Ausdruck wahr ist (oder fehlt – zur Unterstützung älterer Umfragen), wird die Frage angezeigt. Wenn es nicht relevant ist, wird die Frage ausgeblendet und der Wert wird in der Datenbank auf NULL gesetzt. Wenn in einer Gruppe keine relevanten Fragen vorhanden sind, wird die gesamte Gruppe übersprungen.


Moreover, if any of the variables within an expression is irrelevant, then the expression always evaluates to false. This enables '''Cascading Relevance''' so that you do not have to write very long Relevance equations for each question.
Wenn außerdem eine der Variablen in einem Ausdruck irrelevant ist, wird der Ausdruck immer als falsch ausgewertet. Dies ermöglicht die Kaskadierung der Relevanz, sodass Sie nicht für jede Frage sehr lange Relevanzgleichungen schreiben müssen.


Say you have five questions Q1-Q5, and you only want to show Q2 if Q1 was answered, and Q3 if Q2 was answered, etc. The relevance equations might be:
Angenommen, Sie haben fünf Fragen Q1–Q5 und möchten nur Q2 anzeigen, wenn Q1 beantwortet wurde, und Q3, wenn Q2 beantwortet wurde usw. Die Relevanzgleichungen könnten wie folgt lauten:


{| class="wikitable"
{|
!Question Code!!Relevance!!Question
|Frage-Nummer||Relevanz||Frage
|-
|Q1||1||Wie heißen Sie?
|-
|-
|Q1||1||What is your name?
|Q2||Q1||{Q1}, wie alt sind Sie?
|-
|-
|Q2||Q1||{Q1}, how old are you?
|Q3||Q2||Also, Sie sind {Q2} Jahre alt. Sind Sie verheiratet?
|-
|-
|Q3||Q2||So, you are {Q2} years old.  Are you married?
|Q4||Q3 == "Y"||{Q1}, wie lange sind Sie schon verheiratet?
|-
|-
|Q4||Q3 == "Y"||{Q1}, how long have you been married?
|Q5||Q4||Wie viele Kinder haben Sie, {Q1}?
|-
|-
|Q5||Q4||How many children do you have, {Q1}?
|
|}
|}




==Group-level Relevance==
==Relevanz auf Gruppenebene==




ExpressionScript also supports group-level relevance. This makes it easier to implement looping. Say you want to collect information from up to 10 entities (such as products or people from a household), where you first determine how many entities need follow-up (such as by asking how many people live in a household or having people check which products they like from a long list). After knowing how many entities need follow-up, you can use Group-level relevance like {count >= 1}, {count >=2}, ... {count >= 10} for each of the 10 groups of follow-up questions. Within each group, you can have question-level conditional logic (e.g., gender or age-specific follow-up questions for each subject). The question and group-level relevance equations are ANDed together to determine which should be shown.
ExpressionScript unterstützt auch Relevanz auf Gruppenebene. Dies erleichtert die Implementierung von Schleifen. Angenommen, Sie möchten Informationen von bis zu 10 Entitäten sammeln (z. B. Produkte oder Personen aus einem Haushalt), wobei Sie zunächst bestimmen, wie viele Entitäten weiterverfolgt werden müssen (z. B. indem Sie fragen, wie viele Personen in einem Haushalt leben, oder indem Sie die Personen aus einer langen Liste überprüfen lassen, welche Produkte ihnen gefallen). Nachdem Sie wissen, wie viele Entitäten eine Nachverfolgung benötigen, können Sie die Relevanz auf Gruppenebene wie {count >= 1}, {count >=2}, ... {count >= 10} für jede der 10 Gruppen von Folgefragen verwenden. Innerhalb jeder Gruppe können Sie eine bedingte Logik auf Fragenebene verwenden (z. B. geschlechts- oder altersspezifische Folgefragen für jedes Thema). Die Fragen- und Gruppenrelevanzgleichungen werden mit UND verknüpft, um zu bestimmen, welche angezeigt werden sollen.


To check such an example, import the following survey: [[Media:EM survey - Cohabs.zip|Census survey example]].
Um ein solches Beispiel zu überprüfen, importieren Sie die folgende Umfrage: [[Media:EM-Umfrage - Cohabs.zip|Census-Umfragebeispiel]].


It can be observed in the below screenshot that ''Person 1'' group is displayed (or relevant) if the respondent lives with at least another cohabitant:
Im folgenden Screenshot ist zu erkennen, dass die Gruppe „Person 1“ angezeigt (oder relevant) wird, wenn der Befragte mit mindestens einem weiteren Mitbewohner zusammenlebt:




Line 131: Line 138:




Anything within curly braces is now treated as an Expression (with one exception described below). Expressions have access to all the LimeReplacementFields and variables (via several aliases), all typical equation operators (mathematical, logical, and comparison), and to dozens of functions (that even work dynamically on the client-side).
Alles in geschweiften Klammern wird jetzt als Ausdruck behandelt (mit einer Ausnahme, die unten beschrieben wird). Ausdrücke haben Zugriff auf alle LimeReplacementFields und Variablen (über mehrere Aliase), alle typischen Gleichungsoperatoren (mathematische, logische und Vergleichsoperatoren) und auf dutzende Funktionen (die sogar dynamisch auf der Client-Seite arbeiten).


By Using these equations, you can do things such as:
Durch die Benutzung dieser Gleichungen, können Sie z.B. solche Dinge machen:
#Conditionally show tailored messages to the respondents based on prior responses;
#Den Befragten maßgeschneiderte Nachrichten abhängig von früheren Antworten zeigen.
#Create assessments and show assessment results (or conditionally branch or show messages) based upon those results, all without using the [[Assessments|assessments module]] itself;
#Beurteilungen erstellen und die Beurteilungsergebnisse (oder bedingte Verzweigungen oder Nachrichten) basierend auf diesen Ergebnissen anzeigen lassen. Alles ohne das Beurteilungsmodul selber zu benutzen.
#Conjugate verbs and decline nouns within questions, answers, and reports;
#Verben konjugieren und Nomen deklinieren.
#Show summaries of responses before the "Show your answers" page at the end of the survey.
#Sich Zusammenfassungen der Antworten vor der "Antworten anzeigen" Seite am Ende der Umfrage anzeigen lassen.




==Equations==
==Gleichungen==




There is a new question type called [[Question type - Equation|Equation]]. Think of it as a [[Question type - Text display|Text display question type]], except that it stores the value of what is displayed in the database. So, if the Equation Question text contains an Assessment computation, that value would be stored in the database in a variable that can be displayed in public or private statistics.
Es gibt einen neuen Fragetyp namens [[Fragetyp – Gleichung|Gleichung]]. Betrachten Sie es als einen [[Fragetyp – Textanzeige|Fragentyp Textanzeige]], mit der Ausnahme, dass darin der Wert dessen gespeichert wird, was in der Datenbank angezeigt wird. Wenn der Text der Gleichungsfrage also eine Bewertungsberechnung enthält, wird dieser Wert in der Datenbank in einer Variablen gespeichert, die in öffentlichen oder privaten Statistiken angezeigt werden kann.




Line 149: Line 156:




Anything contained within curly braces is now considered an Expression (with one exception: '''there must be no leading or trailing whitespace''' - this is needed to ensure the ExpressionScript does not try to process embedded JavaScript).
Alles, was in geschweiften Klammern enthalten ist, wird jetzt als Ausdruck betrachtet (mit einer Ausnahme: „Es dürfen keine führenden oder nachgestellten Leerzeichen vorhanden sein“ – dies ist erforderlich, um sicherzustellen, dass ExpressionScript nicht versucht, eingebettetes JavaScript zu verarbeiten).


Note that it is OK for expressions to span multiple lines, as long as there is no whitespace after the opening curly brace or before the closing curly brace. This is especially helpful for nested "if()" statements like this:
Beachten Sie, dass Ausdrücke sich über mehrere Zeilen erstrecken können, solange nach der öffnenden geschweiften Klammer oder vor der schließenden geschweiften Klammer kein Leerzeichen steht. Dies ist besonders hilfreich für verschachtelte „if()“-Anweisungen wie diese:


<syntaxhighlight lang="java">{if(is_empty(PFTotals),
<syntaxhighlight lang="java">{if(is_empty(PFTotals),
 '',
'',
 if(PFTotals >= -5 && PFTotals <= -4,
if(PFTotals >= -5 && PFTotals <= -4,
   'Very Soft',
'Very Soft',
   if(PFTotals >= -3 && PFTotals <= -2,
if(PFTotals >= -3 && PFTotals <= -2,
     'Soft',
'Soft',
     if(PFTotals == -1,
if(PFTotals == -1,
       'Somewhat Soft',
'Etwas weich',
       if(PFTotals == 0,
if(PFTotals == 0,
         'Moderate',
'Moderate',! N! if(PFTotals == 1,
         if(PFTotals == 1,
'Etwas schwer',
           'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
           if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
             'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
             if(PFTotals >= 4 && PFTotals <= 5,
'Sehr schwer',
               'Very Hard',
''
               ''
)
             )
)
           )
)
         )
)
       )
)
     )
)
   )
)
 )
)}  
)}
</syntaxhighlight>
</syntaxhighlight>


The ExpressionScript supports the following syntax:
Das ExpressionScript unterstützt die folgende Syntax:
*All standard mathematical operators (e.g. +,-,*,/,!);
*Alle standardmäßigen mathematischen Operatoren (z. B. +,-,*,/,!);
*All standard comparison operators (e.g. <,<=,==,!=,>,>=, plus their equivalents: lt, le, eq, ne, gt, ge);
*Alle standardmäßigen Vergleichsoperatoren (z. B. <,<=,==,!=,> ,>=, plus ihre Äquivalente: lt, le, eq, ne, gt, ge);
*Parentheses (so you can group sub-expressions);
*Klammern (damit Sie Unterausdrücke gruppieren können);
*Conditional operators (e.g. &&,| | and their equivalents: and, or);
*Bedingungsoperatoren (z. B. &&,| | und ihre Äquivalente: und, oder);
*Single and double-quoted strings (which can each embed strings with the other quote type);
*Strings in einfachen und doppelten Anführungszeichen (die jeweils Strings mit dem anderen Anführungszeichentyp einbetten können);
*Comma operator (so can have a list of expressions and just return the final result);
*Kommaoperator (kann also eine Liste von Ausdrücken haben und einfach das Endergebnis zurückgeben );
*Assignment operator (=);
*Zuweisungsoperator (=);
*Pre-defined variables (to refer to questions, question attributes, and responses) - e.g., the [[SGQA identifier|SGQA codes]];
*Vordefinierte Variablen (zur Bezugnahme auf Fragen, Frageattribute und Antworten) – z. B. die [[SGQA-Kennung|SGQA-Codes]];
*Pre-defined functions (there are already 80+, and it is easy to add more).
* Vordefinierte Funktionen (es gibt bereits über 80, und es ist einfach, weitere hinzuzufügen).




==Operators==
==Operatoren==




EM syntax follows normal operator precedence:
Die EM-Syntax folgt der normalen Operatorpriorität:


{| class="wikitable"
{| class="wikitable"
!Level!!Operator(s)!!Description
!Level!!Operator(s)!!Description
|-
|-
|1||()||parentheses for grouping or calling functions
|1||()||Klammern zum Gruppieren oder Aufrufen von Funktionen
|-
|-
|2||! - +||unary operators: not, negation, unary-plus
| 2||! - +||unäre Operatoren: nicht, Negation, unär-plus
|-
|-
|3||* /||times, divide
|3||* /||mal, dividieren
|-
|-
|4||+ -||plus, minus
|4||+ -||plus, minus
|-
|-
|5||< <= > >= lt le gt ge||relative comparisons
|5||< <= > >= lt le gt ge||relative Vergleiche
|-
|-
|6||== != eq ne||equality comparisons
|6||== != eq ne||Gleichheitsvergleiche
|-
|-
|7||and||logical AND
|7||und||logisches UND
|-
|-
|8||or||logical OR
|8||oder||logisches ODER
|-
|-
|9||=||assignment operator
|9||=||Zuweisung Operator
|-
|-
|10||,||comma operator
|10||,||Kommaoperator
|}
|}


{{Note| For consistency between JavaScript and PHP, the plus operator (+) does addition if both operands are numeric, but does concatenation if both parts are non-numeric strings. However, we recommend using the "join()" function for concatenation, as that makes your intent more clear. It also avoids unexpected results if you were expecting strings but got numbers instead (or vice versa).}}
{{Hinweis| Aus Gründen der Konsistenz zwischen JavaScript und PHP führt der Plusoperator (+) eine Addition aus, wenn beide Operanden numerisch sind, führt jedoch eine Verkettung durch, wenn beide Teile nicht numerische Zeichenfolgen sind. Wir empfehlen jedoch, für die Verkettung die Funktion „join()“ zu verwenden, da dies Ihre Absicht klarer macht. Es vermeidet außerdem unerwartete Ergebnisse, wenn Sie Zeichenfolgen erwartet haben, stattdessen aber Zahlen erhalten (oder umgekehrt).}}


==== Warning with mismatch number and string and alphabetical/numerical comparison ====
==== Warnung mit nicht übereinstimmender Zahl und Zeichenfolge und alphabetischem/numerischem Vergleich ====


When you want to compare value with relative or equality comparisons, pay attention at mismatches. A value entered by user (or provided via answer code) can be used as number '''if it is clearly a number'''.
Wenn Sie Werte mit Relativ- oder Gleichheitsvergleichen vergleichen möchten, achten Sie auf Nichtübereinstimmungen. Ein vom Benutzer eingegebener (oder über den Antwortcode bereitgestellter) Wert kann als Zahl verwendet werden, '''wenn es sich eindeutig um eine Zahl handelt'''.
If you surround one of the values with <code>"</code>, a text/string comparison will take place. If you want to compare as number, never surround a number with <code>"</code>.
Wenn Sie einen der Werte mit <code>"</code> umgeben, wird ein Text-/String-Vergleich durchgeführt. Wenn Sie als Zahl vergleichen möchten, umgeben Sie eine Zahl niemals mit <code>"</code> .


For example <code>Q0.NAOK > "50"</code> is true if Q0.NAOK is a numeric question with 9 as value. This is because the operator <code>></code> will assume it is an <i>alphabetical</i> comparison and not a <i>numerical</i> one.
Beispielsweise ist <code>Q0.NAOK > "50"</code> wahr, wenn Q0.NAOK eine numerische Frage mit 9 als Wert ist. Dies liegt daran, dass der Operator <code>></code> davon ausgeht, dass es sich um einen <i>alphabetischen</i> und nicht um einen <i>numerischen</i> Vergleich handelt.


To make sure that you compare integer values, you can use <code>[[Expression_Manager#Implemented_Functions|intval]](Q0.NAOK) > 50</code>. Just remember if Q0.NAOK is not a number (empty or a string), then intval(Q0.NAOK) === 0. To compare string values ("A" < "B") use [[Expression_Manager#Implemented_Functions|strcmp]] directly : <code>strcmp(Q0.NAOK,"B")</code> or <code>strcmp(Q0.NAOK,"A5")</code>.
Um sicherzustellen, dass Sie ganzzahlige Werte vergleichen, können Sie <code>[[Expression_Manager#Implemented_Functions|intval]](Q0.NAOK) > 50</code> verwenden. Denken Sie daran, wenn Q0.NAOK keine Zahl ist (leer oder eine Zeichenfolge), dann ist intval(Q0.NAOK) === 0. Um Zeichenfolgenwerte („A“ < „B“) zu vergleichen, verwenden Sie [[Expression_Manager#Implemented_Functions|strcmp ]] direkt: <code>strcmp(Q0.NAOK,"B")</code> oder <code>strcmp(Q0.NAOK,"A5")</code> .


==Caution about using Assignment Operator (=)==
==Vorsicht bei der Verwendung des Zuweisungsoperators (=)==




You should avoid using the assignment operators unless absolutely necessary, since they may cause unexpected side-effects. For example, if you change the value of a previous response, the cascading relevance and validation logic between that question and the current question is not re-computed, so you could end up with internally inconsistent data (e.g., questions that stay answered but should have been NULLed, or questions that are skipped but should have been answered). In general, if you want to assign a value to a variable, you should create an Equation question type, and use an expression to set its value. However, there are some rare times that people really need this operator, so we made it available.
Sie sollten die Zuweisungsoperatoren nur dann verwenden, wenn dies unbedingt erforderlich ist, da sie zu unerwarteten Nebenwirkungen führen können. Wenn Sie beispielsweise den Wert einer vorherigen Antwort ändern, wird die kaskadierende Relevanz und Validierungslogik zwischen dieser Frage und der aktuellen Frage nicht neu berechnet, sodass möglicherweise intern inkonsistente Daten vorliegen (z. B. Fragen, die beantwortet bleiben, aber auf NULL gesetzt wurden, oder Fragen, die übersprungen wurden, aber beantwortet werden sollten). Wenn Sie einer Variablen einen Wert zuweisen möchten, sollten Sie im Allgemeinen einen Fragetyp „Gleichung“ erstellen und einen Ausdruck verwenden, um seinen Wert festzulegen. Da es jedoch seltene Fälle gibt, in denen Menschen diesen Operator wirklich benötigen, haben wir ihn zur Verfügung gestellt.


To help caution you about this operator, it is shown in red font within the syntax equations (so that you don't confuse it with "==").
Um Sie vor diesem Operator zu warnen, wird er in den Syntaxgleichungen in roter Schrift angezeigt (damit Sie ihn nicht mit „==" verwechseln).




Line 243: Line 249:




===Using assignment operator===  
===Zuweisungsoperator verwenden===  




The main reasons you may want to use the assignment operator are:
Die Hauptgründe, warum Sie den Zuweisungsoperator verwenden möchten, sind:
*You need to set the default value via equation for a question that does not accept default values (such as list radio, where the user interface lets you pick one of the answer options, but does not let you enter an equation). However, be careful, as LimeSurvey will not be able to validate that your equation generates one of the allowable answers for that question;
*Sie müssen den Standardwert über eine Gleichung für eine Frage festlegen, die keine Standardwerte akzeptiert (z. B. Listenradio, bei dem Sie über die Benutzeroberfläche einen auswählen können, die Antwortoptionen, erlaubt Ihnen aber nicht, eine Gleichung einzugeben). Seien Sie jedoch vorsichtig, da LimeSurvey nicht validieren kann, ob Ihre Gleichung eine der zulässigen Antworten für diese Frage generiert;
*You need to forcibly change the response to a previous question based upon a later response;
*Sie müssen die Antwort auf eine vorherige Frage basierend auf einer späteren Antwort zwangsweise ändern;
* etc...
* usw...




{{Alert|title=Attention|text= The assignment is done only in PHP. This means that the value is not getting updated on the same page, but only when the user moves to the next page. Therefore, please pay attention when the assignment operator is used on the same page with other expressions.}}
{{Alert|title=Achtung|text= Die Zuweisung erfolgt nur in PHP. Das bedeutet, dass der Wert nicht auf derselben Seite aktualisiert wird, sondern erst, wenn der Benutzer zur nächsten Seite wechselt. Seien Sie daher bitte vorsichtig, wenn der Zuweisungsoperator auf derselben Seite mit anderen Ausdrücken verwendet wird.}}




You can use all the expression manager system for this purpose. It's better to use an [[Question_type_-_Equation|Equation]] for this purpose.
Zu diesem Zweck können Sie das gesamte Expression-Manager-System verwenden. Zu diesem Zweck ist es besser, eine [[Question_type_-_Equation|Gleichung]] zu verwenden.


Some examples:
Einige Beispiele:
* Set answer to a short text question in lowercase : <code>{QCODE=strtolower(QCODE.NAOK)}</code>;
* Legen Sie die Antwort auf eine kurze Textfrage in Kleinbuchstaben fest: <code>{QCODE=strtolower(QCODE.NAOK)}</code> ;
* Set a default answer to an array question type at start of a survey : <code>{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}</code>;
* Legen Sie zu Beginn einer Umfrage eine Standardantwort auf einen Array-Fragetyp fest: <code>{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}</code> ;
* Set a default answer to an array texts question type at start of a survey : <code>{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}</code>;
* Legen Sie zu Beginn einer Umfrage eine Standardantwort auf einen Array-Text-Fragetyp fest: <code>{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}</code> ;
* Set an answer with condition : <code>{QCODE=if(YesNo="Y","A1","")}</code>.
* Legen Sie eine Antwort mit der Bedingung fest: <code>{QCODE=if(YesNo="Y","A1","")}</code> .


= XSS security =
= XSS-Sicherheit =




With [[Global_settings#Security|XSS enabled]], some parts of the expression manager system cannot be used:  
Wenn [[Global_settings#Security|XSS aktiviert]] ist, können einige Teile des Ausdrucksmanagersystems nicht verwendet werden:  
* starting a HTML tag in expression but ending in another expression;
* ein HTML-Tag in einem Ausdruck beginnen, aber in einem anderen Ausdruck enden;
* using a complex expression within a URL.  
* einen komplexen Ausdruck innerhalb einer URL verwenden.  




{{Note| Please note that XSS is enabled by default in any LimeSurvey installation.}}
{{Hinweis| Bitte beachten Sie, dass XSS in jeder LimeSurvey-Installation standardmäßig aktiviert ist.}}




Examples and workarounds:
Beispiele und Problemumgehungen:
* <code>{if( 1 ,"&lt;strong&gt;","")}information{if( 1 ,"&lt;/strong&gt;","")}</code> is broken with XSS security, here you can use <code>{if(1,"<strong&gt;information&lt;/strong&gt;","information")}</code>;
* wenn <code>{if( 1 ,"&lt;strong&gt;","")}information{if( 1 ,"&lt;/strong&gt;","")}</code> mit XSS-Sicherheit gebrochen ist, dann können Sie hier folgendes verwenden: <code>{if(1,"<strong&gt;information&lt;/strong&gt;","information")}</code>;
* <code>&lt;a href="/script.php?value={if(QCODE == "Y","yes","no")}"&gt;next&lt;/a&gt;</code>, here you can use an equation question because using a complete question code is OK : <code>&lt;a href="/script.php?value={EQUATION.NAOK}"&gt;next&lt;/a&gt;</code>.
* <code>&lt;a href="/script.php?value={if(QCODE == "Y","yes","no")}"&gt;next&lt;/a&gt;</code>, hier können Sie eine Gleichungsfrage verwenden, da die Verwendung eines vollständigen Fragecodes in Ordnung ist: <code>&lt;a href="/script.php?value={EQUATION.NAOK}"&gt;next&lt;/a&gt;</code>.




=Access to variables=
=Zugriff auf Variablen=




ExpressionScript provides read-only access to whichever variables you might need. For backwards compatibility, it provides access to the following:
ExpressionScript bietet schreibgeschützten Zugriff auf alle Variablen, die Sie benötigen. Aus Gründen der Abwärtskompatibilität bietet es Zugriff auf Folgendes:
*[[Survey_participants|TOKEN:xxx]] - the value of a TOKEN (e.g., TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (only for '''not''' [[Participant_settings|anonymous survey]]).
*[[Survey_participants|TOKEN:xxx]] – der Wert eines TOKEN (z. B. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (nur für '''nicht''') [[Participant_settings|anonyme Umfrage]].
*[[Questions_-_introduction#Information_from_previous_answers|INSERTANS:SGQA]] - the display value of an answer (e.g., "Yes") - similar to using {QCODE.shown}.
*[[Questions_-_introduction#Information_from_ previous_answers|INSERTANS:SGQA]] – der Anzeigewert einer Antwort (z. B. „Ja“) – ähnlich der Verwendung von {QCODE.shown}.
*All [[Theme_editor#Keywords|{XXX} values used by templates]].
*Alle [[Theme_editor#Keywords|{XXX}-Werte, die von Vorlagen verwendet werden]].
*In question text, you can use {QID} replaced by the question id and {SGQ} replaced by the SGQA of the question.
*Im Fragetext können Sie {QID} durch die Frage-ID und {SGQ} durch die SGQA der Frage ersetzen.


In addition, ExpressionScript lets you refer to variables by the Question Code (the 'title' column in the questions table within the database). This is also the variable label used when you export your data to SPSS, R, or SAS. For example, if you have questions about name, age, and gender, you could call those variables ''name'', ''age'', and ''gender'' instead of ''12345X13X22'', ''12345X13X23'', and ''12345X13X24''. This makes equations easier for everyone to read and validate the logic, plus making it possible to shuffle questions around without having to keep track of group or question numbers.
Darüber hinaus können Sie mit ExpressionScript über den Fragecode (die „Titel“-Spalte in der Fragentabelle innerhalb der Datenbank) auf Variablen verweisen. Dies ist auch die Variablenbezeichnung, die beim Exportieren Ihrer Daten nach SPSS, R oder SAS verwendet wird. Wenn Sie beispielsweise Fragen zu Name, Alter und Geschlecht haben, können Sie diese Variablen „Name“, „Alter“ und „Geschlecht“ anstelle von „12345X13X22“, „12345X13X23“ und ''12345X13X24'' nennen. Dadurch ist es für jeden einfacher, Gleichungen zu lesen und die Logik zu validieren. Darüber hinaus ist es möglich, Fragen zu verschieben, ohne die Gruppen- oder Fragennummern im Auge behalten zu müssen.


<div class='simplebox'>
<div class='simplebox'>
'''Important:''' It is safer to refer to variables that occur in the preceding pages or questions.
'''Wichtig:''' Es ist sicherer, auf Variablen zu verweisen, die in den vorherigen Seiten oder Fragen vorkommen.
</div>
</div>


Furthermore, ExpressionScript lets you access many properties of the question:
Darüber hinaus können Sie mit ExpressionScript auf viele Eigenschaften der Frage zugreifen:




{| class="wikitable"
{| class="wikitable"
!Syntax!!Meaning!!Example!!Example Result
!Syntax!!Bedeutung!!Beispiel!!Beispiel Ergebnis
|-
|-
|Qcode||an alias for Qcode.code||{implode(',',name,gender)}||'Tom','M'
|Qcode||ein Alias für Qcode.code||{implode(',',name,gender )}||'Tom','M'
|-
|-
|Qcode.code||the selected response code for the question if it is relevant (otherwise blank), or the text value if it is not a coded question||{implode(',',name.code,gender.code)}||'Tom','M'
|Qcode.code||der ausgewählte Antwortcode für die Frage, wenn er relevant ist (sonst leer), oder der Textwert, wenn es sich nicht um eine codierte Frage handelt||{implode(',',name.code,gender.code)}||'Tom','M'
|-
|-
|Qcode.NAOK||same as Qcode - see discussion of NAOK||{gender.NAOK}||'M'
|Qcode.NAOK||wie Qcode – siehe Diskussion von NAOK||{gender.NAOK}||'M'
|-
|-
|Qcode.value||the assessment value for the question if it is relevant (otherwise blank), or the text value if it is not a coded question||{gender.value}||'1'
|Qcode.value||der Bewertungswert für die Frage, wenn er relevant ist (sonst leer), oder der Textwert, wenn dies nicht der Fall ist eine codierte Frage||{gender.value}||'1'
|-
|-
|Qcode.valueNAOK||same as Qcode.value - see discussion about NAOK||{gender.valueNAOK}||'1'
|Qcode.valueNAOK||dasselbe wie Qcode.value – siehe Diskussion über NAOK||{gender.valueNAOK}||'1 '
|-
|-
|Qcode.shown||the display value for the question||{implode(',',name.shown,gender.shown)}||'Tom','Male'
|Qcode.shown||der Anzeigewert für die Frage||{implode(',',name.shown,gender.shown)}||'Tom','Male'
|-
|-
|Qcode.question||the text of the question||{gender.question}||'What is your gender?'
|Qcode.question||der Text der Frage||{gender.question}||'Was ist Ihr Geschlecht?'
|-
|-
|Qcode.mandatory||whether the question is mandatory (Y/N)||{gender.mandatory}||'N'
|Qcode.mandatory||ob die Frage ist obligatorisch (J/N)||{gender.mandatory}||'N'
|-
|-
|Qcode.qid||the internal question number (not the sequential number)||{gender.qid}||337
|Qcode.qid||die interne Fragenummer (nicht die fortlaufende Nummer)||{gender.qid}||337
|-
|-
|Qcode.type||the question type||{gender.type}||'G'
|Qcode.type||der Fragetyp||{gender.type}||'G'
|-
|-
|Qcode.jsName||the correct javascript name for the question, regardless whether declared on or off this page||{gender.jsName}||'java1827X3X337'
|Qcode.jsName||der richtige Javascript-Name für die Frage, unabhängig davon, ob auf oder außerhalb dieser Seite deklariert||{gender.jsName}||'java1827X3X337'
|-
|-
|Qcode.gid||the internal group number (not the sequential number)||{gender.gid}||3
|Qcode.gid||die interne Gruppennummer (nicht die fortlaufende Nummer)|| {gender.gid}||3
|-
|-
|Qcode.qseq||the sequential number of the question, starting from 0||{gender.qseq}||5
|Qcode.qseq||die fortlaufende Nummer der Frage, beginnend bei 0||{gender.qseq}||5
|-
|-
|Qcode.gseq||the sequential number of the group, starting from 0||{gender.gseq}||1
|Qcode.gseq||die fortlaufende Nummer der Gruppe, beginnend bei 0||{gender.gseq}||1
|-
|-
|Qcode.relevanceStatus||whether the question is currently relevant (0 or 1)||{gender.relevanceStatus}||1
|Qcode.relevanceStatus||ob die Frage aktuell relevant ist (0 oder 1)||{gender.relevanceStatus}||1
|-
|-
|Qcode.relevance||the question-level relevance equation||{gender.relevance}||'!is_empty(name)'
|Qcode.relevance||die Relevanzgleichung auf Fragenebene||{gender.relevance}||'!is_empty(name)'
|-
|-
|Qcode.grelevance||the  group-level relevance equation||{gender.grelevance}||'num_children >= 5'
|Qcode.grelevance||die Relevanzgleichung auf Gruppenebene||{gender.grelevance}||'num_children >= 5'
|-
|-
|Qcode.sgqa||the SGQA value for this question||{gender.sgqa}||'1827X3X337'
|Qcode.sgqa||der SGQA-Wert für diese Frage||{gender.sgqa}||'1827X3X337'
|}
|}




== HTML editor issue==
== HTML-Editor-Problem==




If you use the HTML editor, some characters are replaced by HTML entities.
Wenn Sie den HTML-Editor verwenden, werden einige Zeichen durch HTML-Entitäten ersetzt.
* & by &amp;amp;
* & durch &amp;amp;
* < by &amp;lt;
* < durch &amp;lt;
* > by &amp;gt;
* > durch &amp;gt;


If you use HTML editor you need to use :
Wenn Sie einen HTML-Editor verwenden, so nutzen Sie bitte:
* and for &
* und statt &
* lt for <
* lt statt <
* le for <=
* le statt <=
* gt for >
* gt statt >
* ge for >=
* ge statt >=




It is recommended to clear your expression of HTML that appears within your expression. If you use the LimeSurvey HTML editor, click on the "Source" button (located in the upper left part of the editor) and delete all the characters that are not related to your expression (e.g., <p>,</br>, and so on).
Es wird empfohlen, den darin enthaltenen HTML-Code aus Ihrem Ausdruck zu entfernen. Wenn Sie den LimeSurvey-HTML-Editor verwenden, klicken Sie auf die Schaltfläche „Quelle“ (oben links im Editor) und löschen Sie alle Zeichen, die nicht mit Ihrem Ausdruck zusammenhängen (z. B.<p>,</br>, und so weiter).




=Qcode variable naming=
=Qcode-Variablenbenennung=




Here are the details of how to construct a Qcode (and access some properties) by question type. In general, Qcodes are constructed as:
Hier finden Sie Einzelheiten zum Erstellen eines Qcodes (und zum Zugreifen auf einige Eigenschaften) nach Fragetyp. Im Allgemeinen sind Qcodes wie folgt aufgebaut:


   QuestionCode . '_' . SubQuestionID . '_' . ScaleId
   Fragecode . '_' . SubQuestionID . '_' . ScaleId


For '''comment''' and '''other''', the corresponding question codes are QuestionCode_comment and QuestionCode_other, respectively.
Für „Kommentar“ und „Sonstiges“ lauten die entsprechenden Fragecodes QuestionCode_comment bzw. QuestionCode_other.


{| class="wikitable"
{| class="wikitable"
!Type!!Description!!Code!!SubQs!!Answer Options!!Scales!!Answer Code!!Answer Shown!!Relevance
!Typ!!Beschreibung!!Code!!Unterfragen!!Antwortoptionen!!Skalen!!Antwortcode!!Antwort angezeigt!!Relevanz
|-
|-
|5||5 Point Choice Radio-Buttons||Q1|| ||1-5|| ||{Q1}||{Q1.shown}||{Q1==3}
|5||5 Punktauswahl-Optionsfelder||Q1|| ||1-5|| ||{Q1}||{Q1.shown}||{Q1==3}
|-
|-
|B||Array (10 Point Choice) Radio-Buttons||Q2||L1-L6||1-10|| ||{Q2_L2}||{Q2_L2.shown}||{Q2_L2==7}
|B||Array (10 Punkte Auswahl) Optionsfelder||Q2||L1-L6| |1-10|| ||{Q2_L2}||{Q2_L2.shown}||{Q2_L2==7}
|-
|-
|A||Array (5 Point Choice) Radio-Buttons||Q3||1-5||1-5|| ||{Q3_1}||{Q3_1.shown}||{Q3_1>=3}
|A||Array (5 Punktauswahl) Optionsfelder||Q3||1-5| |1-5|| ||{Q3_1}||{Q3_1.shown}||{Q3_1>=3}
|-
|-
|1||Array (Flexible Labels) Dual Scale||Q4||sq1-sq5||0:a1-a3||1:b1-b3||{Q4_sq1_0}||{Q4_sq1_1.shown}||{Q4_sq1_1=='b2'}
|1||Array (Flexible Labels) Dual Scale||Q4||sq1-sq5||0 :a1-a3||1:b1-b3||{Q4_sq1_0}||{Q4_sq1_1.shown}||{Q4_sq1_1=='b2'}
|-
|-
|H||Array (Flexible) - Column Format||Q5||1-5||s,m,t|| ||{Q5_1}||{Q5_1.shown}||{Q5_1=='s'}
|H||Array (flexibel) - Spaltenformat||Q5||1-5||s,m,t|| ||{Q5_1}||{Q5_1.shown}||{Q5_1=='s'}
|-
|-
|F||Array (Flexible) - Row Format||Q6||F1-F5||1-5|| ||{Q6_F3}||{Q6_F3.shown}||{Q6_F3==4}
|F||Array (flexibel) – Zeilenformat||Q6||F1-F5| |1-5|| ||{Q6_F3}||{Q6_F3.shown}||{Q6_F3==4}
|-
|-
|E||Array (Increase/Same/Decrease) Radio-Buttons||Q7||1-7||I,S,D|| ||{Q7_4}||{Q7_4.shown}||{Q7_4=='D'}
|E||Array (Erhöhen/Gleich/Verringern) Optionsfelder||Q7||1- 7||I,S,D|| ||{Q7_4}||{Q7_4.shown}||{Q7_4=='D'}
|-
|-
|:||Array (Multi Flexi) 1 To 10||Q8||ls1,todo,ls2||min,max,avg|| ||{Q8_ls1_max}||{Q8_ls2_avg.shown}||{Q8_ls2_min==7}
|:||Array (Multi Flexi) 1 bis 10||Q8||ls1,todo ,ls2||min,max,avg|| ||{Q8_ls1_max}||{Q8_ls2_avg.shown}||{Q8_ls2_min==7}
|-
|-
|;||Array (Multi Flexi) Text||Q9||hp,st,sw||1st,2nd,3rd|| ||{Q9_hp_3rd}||{Q9_hp_3rd.shown}||{Q9_hp_3rd=='Peter'}
|;||Array (Multi Flexi) Text||Q9||hp,st,sw|| 1., 2., 3.|| ||{Q9_hp_3rd}||{Q9_hp_3rd.shown}||{Q9_hp_3rd=='Peter'}
|-
|-
|C||Array (Yes/Uncertain/No) Radio-Buttons||Q10||1-5||Y,N,U|| ||{Q10_1}||{Q10_1.shown}||{Q10_3=='Y'}
|C||Array (Ja/Unsicher/Nein) Optionsfelder||Q10|| 1-5||Y,N,U|| ||{Q10_1}||{Q10_1.shown}||{Q10_3=='Y'}
|-
|-
|X||Boilerplate Question||Q11|| || || || ||{Q11.shown}||
|X||Boilerplate Question||Q11|| || || || ||{Q11.shown}||
|-
|-
|D||Date||Q12|| || || ||{Q12}||{Q12.shown}||
|D||Datum||Q12|| || || ||{Q12}||{Q12.shown}||
|-
|-
|*||Equation||Q13|| || || ||{Q13}||{Q13.shown}||{Q13>5}
|*||Gleichung||Q13|| || || ||{Q13}||{Q13.shown}||{Q13>5}
|-
|-
|~124~||File Upload (records number of files uploaded)||Q14|| || || ||{Q14}|| ||{Q14>0}
|~124~||Datei-Upload (zeichnet die Anzahl der hochgeladenen Dateien auf)||Q14|| || || ||{Q14}|| ||{Q14>0}
|-
|-
|G||Gender Drop-Down List||Q15|| ||M,F|| ||{Q15}||{Q15.shown}||{Q15=='M'}
|G||Dropdown-Liste „Geschlecht“||Q15|| ||M,F|| ||{Q15}||{Q15.shown}||{Q15=='M'}
|-
|-
|U||Huge Free Text||Q16|| || || ||{Q16}||{Q16.shown}||{strlen(Q16)>100}
|U||Riesiger Freitext||Q16|| || || ||{Q16}||{Q16.shown}||{strlen(Q16)>100}
|-
|-
|I||Language Question||Q17|| || || ||{Q17}||{Q17.shown}||{Q17=='en'}
|I||Sprachfrage||Q17|| || || ||{Q17}||{Q17.shown}||{Q17=='en'}
|-
|-
|!||List - Dropdown||Q18|| ||1-5|| ||{Q18}||{Q18.shown}||{Q18==3}
|!||Liste - Dropdown||Q18|| ||1-5|| ||{Q18}||{Q18.shown}||{Q18==3}
|-
|-
|L||List Drop-Down/Radio-Button List||Q19|| ||A-Z|| ||{Q19}||{Q19.shown}||{Q19=='X'}
|L||Listen-Dropdown-/Radio-Button-Liste||Q19|| ||AZ|| ||{Q19}||{Q19.shown}||{Q19=='X'}
|-
|-
|O||List With Comment Drop-Down/Radio-Button List + Textarea||Q20|| ||A-F|| ||{Q20},{Q20comment}||{Q20.shown}||{Q20=='B'}
|O||Liste mit Kommentar-Dropdown/Radio-Button-Liste + Textbereich||Q20 || ||AF|| ||{Q20},{Q20comment}||{Q20.shown}||{Q20=='B'}
|-
|-
|T||Long Free Text||Q21|| || || ||{Q21}||{Q21.shown}||{strstr(Q21,'hello')>0}
|T||Langer Freitext||Q21|| || || ||{Q21}||{Q21.shown}||{strstr(Q21,'hello')>0}
|-
|-
|M||Multiple Choice Checkbox||Q22||A-F, other|| || ||{Q22_E}, {Q22_other}||{Q22_E.shown}, {Q22_other.shown}||{Q22_E=='Y'}
|M||Multiple-Choice-Kontrollkästchen||Q22||AF, other| | || ||{Q22_E}, {Q22_other}||{Q22_E.shown}, {Q22_other.shown}||{Q22_E=='Y'}
|-
|-
|P||Multiple Choice With Comments Checkbox + Text||Q23||A-F|| || ||{Q23_D}, {Q23_Dcomment}||{Q23_D.shown}||{!is_empty(Q23)}
|P||Multiple Choice mit Kommentaren Kontrollkästchen + Text||Q23||AF|| || ||{Q23_D}, {Q23_Dcomment}||{Q23_D.shown}||{!is_empty(Q23)}
|-
|-
|K||Multiple Numerical Question||Q24||self,mom,dad|| || ||{Q24_self}||{Q24_self.shown}||{Q24_self>30}
|K||Mehrfache numerische Frage||Q24||self,mom,dad || || ||{Q24_self}||{Q24_self.shown}||{Q24_self>30}
|-
|-
|Q||Multiple Short Text||Q25||A-F|| || ||{Q25_B}||{Q25_B.shown}||{substr(Q25_B,1,1)=='Q'}
|Q||Mehrfacher Kurztext||Q25||AF|| || ||{Q25_B}||{Q25_B.shown}||{substr(Q25_B,1,1)=='Q'}
|-
|-
|N||Numerical Question Type||Q26|| || || ||{Q26}||{Q26.shown}||{Q26 > 30}
|N||Numerischer Fragetyp||Q26|| || || ||{Q26}||{Q26.shown}||{Q26 > 30}
|-
|-
|R||Ranking Style||Q27||1-4|| || ||{Q27_1}||{Q27_1.shown}||{Q27_1==3}
|R||Ranking-Stil||Q27||1-4|| || ||{Q27_1}||{Q27_1.shown}||{Q27_1==3}
|-
|-
|S||Short Free Text||Q28|| || || ||{Q28}||{Q28.shown}||{Q28=='mine'}
|S||Kurzer Freitext||Q28|| || || ||{Q28}||{Q28.shown}||{Q28=='mine'}
|-
|-
|Y||Yes/No Radio-Buttons||Q29|| || || ||{Q29}||{Q29.shown}||{Q29=='Y'}
|Y||Ja/Nein-Optionsfelder||Q29|| || || ||{Q29}||{Q29.shown}||{Q29=='Y'}
|}
|}




=Usage of NAOK=  
=Verwendung von NAOK=  




NAOK --> "Not Applicable" (NA) is alright (OK)
NAOK -> „Nicht zutreffend“ (NA) ist in Ordnung (OK)




Using NAOK, means that all or some of the variables are irrelevant (e.g. "Not Applicable" (NA) is alright (OK)).  
Die Verwendung von NAOK bedeutet, dass alle oder einige der Variablen irrelevant sind (z. B. „Nicht anwendbar“ (NA) ist in Ordnung (OK)).  


For example: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) give always an empty string if one subquestion of Q1 is filtered.
Zum Beispiel: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) gibt immer eine leere Zeichenfolge aus, wenn eine Unterfrage von Q1 gefiltert wird.
To count the number of checked subquestion in such question can be count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). If the subquestion is hidden, the EM returns an empty string.
Um die Anzahl der überprüften Unterfragen in einer solchen Frage zu zählen, kann count(Q1_SQ1.NAOK,Q1_SQ2.NAOK verwendet werden ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Wenn die Unterfrage ausgeblendet ist, gibt das EM eine leere Zeichenfolge zurück.


Without NAOK, if one question or one subquestion is hidden, the EM returns always an empty string (same to returning false).
Wenn ohne NAOK eine Frage oder eine Unterfrage ausgeblendet ist, gibt der EM immer eine leere Zeichenfolge zurück (das Gleiche gilt für die Rückgabe von „false“).


The .shown always use the NAOK system (empty string if hidden) but if you need the code of the answer: it's always a good idea to add .NAOK after the question code (except if you need it and know what you do).
Die angezeigten .NAOK-Codes verwenden immer das NAOK-System (leere Zeichenfolge, falls ausgeblendet). Wenn Sie jedoch den Code der Antwort benötigen, ist es immer eine gute Idee, .NAOK nach dem Fragecode hinzuzufügen (außer wenn Sie ihn benötigen und wissen, was Sie tun).


More information is provided in the [[#Overriding_Cascading_Conditions|Overriding Cascading Conditions subsection]].
Weitere Informationen finden Sie im Unterabschnitt [[#Overriding_Cascading_Conditions|Overriding Cascading Conditions]].




=The reserved "this", "self", and "that" variables=
=Die reservierten Variablen „this“, „self“ und „that“=




Quite often you want to evaluate all the parts of a question, such as counting how many subquestions have been answered or summing up the scores. Other times you want to process just certain rows or columns of a question (such as getting the row or column sums and storing them in the database). These reserved variables make that process relatively painless.
Sehr oft möchten Sie alle Teile einer Frage auswerten, z. B. zählen, wie viele Unterfragen beantwortet wurden, oder die Ergebnisse zusammenfassen. In anderen Fällen möchten Sie nur bestimmte Zeilen oder Spalten einer Frage verarbeiten (z. B. um die Zeilen- oder Spaltensummen abzurufen und sie in der Datenbank zu speichern). Diese reservierten Variablen machen diesen Prozess relativ schmerzlos.




=="This" variable==
=="This" Variable==




The '''"this"''' variable is used exclusively within the "[[QS:Relevance|Whole question validation equation]]" and "[[QS:Em_validation_sq|Subquestion validation equation]]" options (the later is not possible from GUI). It expands to the variable names of each of the cells within those questions. So, if you want to make sure that each entry is greater than three, you would set the "Subquestion validation equation" to (this > 3).
Die Variable „this“ wird ausschließlich innerhalb der Optionen „[[QS:Relevance|Gleichung zur Validierung ganzer Fragen]]“ und „[[QS:Em_validation_sq|Validierungsgleichung für Teilfragen]]“ verwendet (letztere ist nicht über GU möglich). Es wird auf die Variablennamen jeder Zelle innerhalb dieser Fragen erweitert. Wenn Sie also sicherstellen möchten, dass jeder Eintrag größer als drei ist, setzen Sie die „Unterfragevalidierungsgleichung“ auf (this > 3).




=="Self" variable==
=="Self" Variable==




The '''"self"''' and '''"that"''' variable are more powerful, and serve as macros which are expanded prior to processing equations. The syntax choices for the "self" variable are:
Die Variablen „self“ und „that“ sind leistungsfähiger und dienen als Makros, die vor der Verarbeitung von Gleichungen erweitert werden. Die Syntaxoptionen für die Variable „self“ sind:
*self
*self
*self.''suffix''
*self.''suffix''
*self.''sub-selector''
*self.''sub-selector''
*self.''sub-selector''.''suffix''
*self.''sub- Selektor''.''Suffix''


#''suffix'' is any of the normal qcode suffixes (e.g., NAOK, value, shown)
#''Suffix'' ist eines der normalen Qcode-Suffixe (z. B. NAOK, Wert, angezeigt).


#''sub-selector'' can be one of the following:
#''Unterselektor'' kann einer der folgenden sein:
*comments - only subquestions that are comments (e.g., [[Question type - Multiple choice with comments|multiple choice with comment]] and [[Question type - List with comment|list with comment]]);
*Kommentare – nur Unterfragen, die Kommentare sind (z. B. [[Fragetyp – Multiple Choice mit Kommentaren|Multiple Choice mit Kommentar]] und [[Fragetyp - Liste mit Kommentar|Liste mit Kommentar]]);
*nocomments - only subquestions that are not comments;
*nocomments – nur Unterfragen, die keine Kommentare sind;
*sq_X - where X is a row or column identifier.  Only subquestions matching pattern X are selected. Note that search is done on complete code identifier, then sq_X match and include subquestions nX, X, Xn (e.g. if you use sq_1, subquestions a1, 1a, 1, 11 or 001 was included). Put attention at dual scale question type where subquestions code are QCODE_SQCODE_1 and QCODE_SQCODE_1 and to ranking question type where subquestions code are QCODE_1,QCODE_2 ....
*sq_X – wobei X ein Zeilen- oder Spaltenbezeichner ist. Es werden nur Unterfragen ausgewählt, die mit Muster X übereinstimmen. Beachten Sie, dass die Suche nach der vollständigen Code-ID erfolgt, dann sq_X zutrifft und die Unterfragen nX. Achten Sie auf den Fragetyp mit zwei Skalen, bei dem die Unterfragencodes QCODE_SQCODE_1 und QCODE_SQCODE_1 sind, und auf den Fragetyp mit der Rangfolge, bei dem die Unterfragencodes QCODE_1, QCODE_2 ... sind.


'''Examples:'''
'''Beispiele:'''
*Has any part of a question been answered? -> {count(self.NAOK)>0}
*Wurde ein Teil einer Frage beantwortet? -> {count(self.NAOK)>0}
*What is the assessment score for this question? -> {sum(self.value)}
*Wie hoch ist die Bewertungspunktzahl für diese Frage? -> {sum(self.value)}


You can also use these to get row and column totals.  Say you have an array of numbers with rows A-E and columns 1-5.
Sie können diese auch verwenden, um Zeilen- und Spaltensummen zu erhalten. Angenommen, Sie haben ein Zahlenarray mit den Zeilen AE und den Spalten 1–5.
*What is the grand total? -> {sum(self.NAOK)}
*Wie hoch ist die Gesamtsumme? -> {sum(self.NAOK)}
*What is the total of row B? -> {sum(self.sq_B.NAOK)}
*Wie hoch ist die Summe von Zeile B? -> {sum(self.sq_B.NAOK)}
*What is the total of column 3? -> {sum(self.sq_3.NAOK)}
*Wie hoch ist die Summe von Spalte 3? -> {sum(self.sq_3.NAOK)}




=="That" variable==
=="That" Variable==




The '''"that"''' variable is like the "self" variable, but it allows you to refer to other questions. Its syntax is:
Die Variable „that“ ist wie die Variable „self“, ermöglicht Ihnen jedoch die Bezugnahme auf andere Fragen. Seine Syntax ist:
*that.''qname''
*that.''qname''
*that.''qname''.''suffix''
*that.''qname''.''suffix''
Line 494: Line 500:
*that.''qname''.''sub-selector''.''suffix''
*that.''qname''.''sub-selector''.''suffix''


''qname'' is the question name without any subquestion extensions. So, let's create a question 'q1', 'q' representing also its ''qname''.
„qname“ ist der Fragename ohne Unterfrageerweiterungen. Erstellen wir also eine Frage „q1“, wobei „q“ auch ihren „qnamen“ darstellt.


Examples:
Beispiele:
*Has any part of question q1 been answered? -> {count(that.q1.NAOK)>0}
*Wurde ein Teil der Frage q1 beantwortet? -> {count(that.q1.NAOK)>0}
*What is the assessment score for q2? -> {sum(that.q2.NAOK)}
*Wie hoch ist die Bewertungspunktzahl für q2? -> {sum(that.q2.NAOK)}
*What is the grand total of q3? -> {sum(that.q3.NAOK)}
*Was ist die Gesamtsumme von q3? -> {sum(that.q3.NAOK)}
*What is the total of row C in q4? -> {sum(that.q4.sq_C.NAOK)}
*Wie hoch ist die Summe der Zeile C in q4? -> {sum(that.q4.sq_C.NAOK)}
*What is the total of column 2 in q4? -> {sum(that.q4.sq_2.NAOK)}
*Wie hoch ist die Summe von Spalte 2 in q4? -> {sum(that.q4.sq_2.NAOK)}


The "self" and "that" variables can be used in any relevance, validation, or tailoring.
Die Variablen „self“ und „that“ können für jede Relevanz, Validierung oder Anpassung verwendet werden.


The one caveat is that when you use the [[Show logic file|Show logic file]] feature, it will show you the expanded value of "self" and "that". This lets you see the actual equation that will be generated so that you (and the EM) can validate whether the variables exist or not. This may seem confusing since you may see quite lengthy equations. However, if you edit the question, you will see the original equation using "self" and/or "that".
Die einzige Einschränkung besteht darin, dass bei Verwendung der Funktion [[Logikdatei anzeigen|Logikdatei anzeigen]] der erweiterte Wert von „self“ und „that“ angezeigt wird. Dadurch können Sie die tatsächliche Gleichung sehen, die generiert wird, sodass Sie (und der EM) überprüfen können, ob die Variablen vorhanden sind oder nicht. Dies kann verwirrend erscheinen, da Sie möglicherweise recht lange Gleichungen sehen. Wenn Sie jedoch die Frage bearbeiten, sehen Sie die ursprüngliche Gleichung mit „self“ und/oder „that“.


{{Note| You should not use these variables if
{{Hinweis| Sie sollten diese Variablen nicht verwenden, wenn
*you want to explicitly name each variable used in an equation, or
* Sie jede in einer Gleichung verwendete Variable explizit benennen möchten oder
* use variables that do not have subquestions (e.g., single response questions). In those cases, prefixing a variable with "that" is overkill, and you run the risk of getting unexpected results.}}
* Variablen verwenden, die keine Unterfragen haben (z. B. Einzelantwortfragen). In solchen Fällen ist es übertrieben, einer Variablen das Präfix „that“ voranzustellen, und Sie laufen Gefahr, unerwartete Ergebnisse zu erhalten.}}


=Access to functions=
=Zugriff auf Funktionen=




The ExpressionScript provides access to mathematical, string, and user-defined functions, as shown below. It has PHP and JavaScript equivalents for these functions so that they work identically on server-side (PHP) and client-side (JavaScript).  It is easy to add new functions.
Das ExpressionScript bietet Zugriff auf mathematische, Zeichenfolgen- und benutzerdefinierte Funktionen, wie unten gezeigt. Für diese Funktionen gibt es PHP- und JavaScript-Äquivalente, sodass sie auf der Serverseite (PHP) und auf der Clientseite (JavaScript) identisch funktionieren. Es ist einfach, neue Funktionen hinzuzufügen.




==Implemented functions==
==Implementierte Funktionen==




The following functions are currently available:
Folgende Funktionen stehen derzeit zur Verfügung:


{| class="wikitable"
{| class="wikitable"
Line 687: Line 693:
|}
|}


{{Note| Click [[Functions that are Planned or Being Considered|here]] if you wish to find out more about planned (or being constrained) functions.}}
{{Hinweis| Klicken Sie auf [[Geplante oder in Betracht gezogene Funktionen|hier]], wenn Sie mehr über geplante (oder eingeschränkte) Funktionen erfahren möchten.}}


==Create new expression functions with plugin {{NewIn|4.0.0}}==
==Erstellen Sie neue Ausdrucksfunktionen mit dem Plugin {{NewIn|4.0.0}}==


If you need a new function that doesn't exist in core, you can create one with a plugin. Such a new function is created using the  [[expressionManagerStart]] event.
Wenn Sie eine neue Funktion benötigen, die im Kern nicht vorhanden ist, können Sie eine mit einem Plugin erstellen. Eine solche neue Funktion wird mit dem Ereignis [[expressionManagerStart]] erstellt.


=ExpressionScript knows which variables are local=
=ExpressionScript weiß, welche Variablen lokal sind=




In order to properly build the JavaScript for a page, EM needs to know which variables are set on the page, and what their JavaScript ID is (e.g., for document.getElementById(x)). It must also know which variables are set on other pages (so that it can ensure that the needed <input type='hidden' value='x'> fields are present and populated).
Um das JavaScript für eine Seite korrekt zu erstellen, muss EM wissen, welche Variablen auf der Seite gesetzt sind und wie ihre JavaScript-ID lautet (z. B. für document.getElementById(x)). Außerdem muss EM wissen, welche Variablen auf anderen Seiten gesetzt sind (damit es sicherstellen kann, dass die benötigten <input type='hidden' value='x'> Felder vorhanden und ausgefüllt sind).




==Cascading Conditions==
==Kaskadierende Bedingungen==




If any of the variables are irrelevant, the whole equation will be irrelevant (false). For example, in the following table, N/A means that one of the variables was not relevant:
Wenn eine der Variablen irrelevant ist, ist die gesamte Gleichung irrelevant (falsch). In der folgenden Tabelle bedeutet beispielsweise N/A, dass eine der Variablen nicht relevant war:




{| class="wikitable"
{| class="wikitable"
!Operator!!Example!!a!!b!!Result
!Operator!!Beispiel!!a!!b!!Ergebnis
|-
|-
|<nowiki>+ (unary)</nowiki>||<nowiki>+a</nowiki>||N/A|| ||false
|<nowiki> + (unär)</nowiki> ||<nowiki> +a</nowiki> ||N/A|| ||false
|-
|-
|- (unary)||-a||N/A|| ||false
|- (unär)||-a||N/A|| ||false
|-
|-
|!||!a||N/A|| ||false
|!||!a||N/A|| ||false
|-
|-
|== (or eq)||a == b||N/A||5||false
|== (oder Gleichung)||a == b||N/A||5||false
|-
|== (or eq)||a == b||N/A||0||false
|-
|== (or eq)||a == b||N/A||N/A||false
|-
|-
|!= (or ne)||a != b||N/A||5|| false
|== (oder Gleichung) ||a == b||N/A||0||false
|-
|-
|!= (or ne)||a != b||N/A||N/A|| false
|== (oder Gleichung)||a == b||N/A||N/A|| false
|-
|-
|!= (or ne)||a != b||N/A||0||false
|!= (oder ne)||a != b||N/A||5|| false
|-
|-
|> (or gt)||a > b||N/A||5|| false
|!= (oder ne)||a != b||N/A||N/A|| false
|-
|-
|>= (or ge)||a >= b||N/A||5||false
|!= (oder ne)||a != b||N/A||0||false
|-
|-
|< (or lt)||a < b||N/A||5||false
|> (oder gt)||a > b||N/A||5|| false
|-
|-
|<= (or le)||a <= b||N/A||5||false
|>= (oder ge)||a >= b||N/A||5||false
|-
|-
|and||a and b||N/A||5||false
|< (oder lt)||a < b||N/A||5||false
|-
|-
|and||a and b||N/A||N/A||false
|<= (oder le)||a <= b||N/A||5||false
|-
|und||a und b||N/A||5||falsch
|-
|-
|or||a or b||N/A||N/A||false
|und||a und b||N/A||N/A||falsch! N!|-
|oder||a oder b||N/A||N/A||false
|-
|-
|or||a or b||N/A||5||false
|or||a oder b||N/A||5 ||false
|-
|-
|<nowiki>+</nowiki>||a + b||N/A||5||false
|<nowiki> +</nowiki> ||a + b||N/A||5||falsch
|-
|-
|-||a - b||N/A||5||false
|-||a - b||N/A||5||falsch
|-
|-
|*||a * b||N/A||5||false
|*||a * b||N/A||5||false
|-
|-
|/||a / b||5||N/A||false
|/||a / b||5||N/A||false
|-
|-! N!|()||(a)||N/A|| ||false
|()||(a)||N/A|| ||false
|-
|-
|(exp)||(a && b)||N/A||5||false
|(exp)||(a && b)||N/A||5||false
|-
|-
|(exp) op (exp)||(b + b) > (a && b)||N/A||5||false
|(exp) op (exp)| |(b + b) > (a && b)||N/A||5||false
|-
|-
|function||sum(a,b,b)||N/A||5||false
|function||sum(a,b,b)||N/A|| 5||false
|-
|-
|function||max(a,b)||N/A||5||false
|function||max(a,b)||N/A||5||false
|-
|-
|function||min(a,b)||N/A||5||false
|function||min(a,b )||N/A||5||false
|-
|function||implode(', ',a,b,a,b)||N/A||5||false
|-
|-
|function||implode(', ',a,b,a,b)||N/A||5||false! N!|-
|function||if(a,a,b)||N/A||5||false
|function||if(a,a,b)||N/A||5||false
|-
|-
|function||is_empty(a)||N/A|| ||false
|function||is_empty(a)||N/ A|| ||false
|-
|-
|function||is_empty(a)||0 (or blank)|| ||true
|function||is_empty(a)||0 (oder leer)|| ||true
|-
|-
|function||!is_empty(a)||N/A|| ||false
|function||!is_empty(a)||N/A|| ||false
Line 774: Line 777:




==Overriding Cascading Conditions==
==Überschreiben kaskadierender Bedingungen==




Say you want to show a running total of all relevant answers. You might try to use the equation {sum(q1,q2,q3,...,qN)}. However, this gets translated internally to LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). So, if any of the values q1-qN are irrelevant, the equation will always return false. In this case, the sum() will show "0" until all questions are answered.
Angenommen, Sie möchten eine laufende Summe aller relevanten Antworten anzeigen. Sie könnten versuchen, die Gleichung {sum(q1,q2,q3,...,qN)} zu verwenden. Dies wird jedoch intern übersetzt in LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2") ,LEMval("q3"),...,LEMval("qN"))). Wenn also einer der Werte q1-qN irrelevant ist, gibt die Gleichung immer „falsch“ zurück. In diesem Fall zeigt sum() „0“ an, bis alle Fragen beantwortet sind.


To get around this, each variable can have a ".NAOK" suffix (meaning that Not Applicable is OK) added to it. In such cases, the following behavior occurs. Say you have a variable q1.NAOK:
Um dies zu umgehen, kann jeder Variablen das Suffix „.NAOK“ hinzugefügt werden (was bedeutet, dass „Nicht anwendbar“ in Ordnung ist). In solchen Fällen tritt das folgende Verhalten auf. Angenommen, Sie haben eine Variable q1.NAOK:
#q1 is not added to the LEManyNA() clause
#q1 wurde nicht zur LEManyNA()-Klausel hinzugefügt
#LEMval('q1') will continue to check whether the response is relevant and will return <nowiki>""</nowiki> if it is not (so individual irrelevant responses will be ignored, but they will not void the entire expression).
#LEMval('q1') prüft weiterhin, ob die Antwort relevant ist, und gibt sie zurück<nowiki> „“</nowiki> Wenn dies nicht der Fall ist (so werden einzelne irrelevante Antworten ignoriert, aber nicht der gesamte Ausdruck ungültig).


So, the solution to the running total problem is to use the equation '''sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK)'''.
Die Lösung des laufenden Summenproblems besteht also darin, die Gleichung '''sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK)'' zu verwenden.


The use of the .NAOK suffix also lets authors design surveys that have several possible paths but then converge on common paths later. For example, say subjects answer a survey in a way that is outside the normal range of responses. The author could alert the subjects that they may not get valid results, and ask them whether they really want to continue with the survey. If they say "Yes", then the rest of the questions will be shown. The condition for the "rest of the questions" would check whether the initial responses were answered within the normal range OR whether the subject said "Yes" to the question that is only relevant if they answered outside the normal range.
Durch die Verwendung des Suffixes .NAOK können Autoren auch Umfragen entwerfen, die mehrere mögliche Pfade haben, sich aber später auf gemeinsame Pfade konzentrieren. Angenommen, Probanden beantworten eine Umfrage auf eine Art und Weise, die außerhalb des normalen Antwortbereichs liegt. Der Autor könnte die Probanden darauf aufmerksam machen, dass sie möglicherweise keine gültigen Ergebnisse erhalten, und sie fragen, ob sie die Umfrage wirklich fortsetzen möchten. Wenn sie „Ja“ sagen, werden die restlichen Fragen angezeigt. Die Bedingung für die „restlichen Fragen“ würde prüfen, ob die ersten Antworten innerhalb des normalen Bereichs beantwortet wurden ODER ob die Testperson die Frage mit „Ja“ beantwortet hat, die nur dann relevant ist, wenn sie außerhalb des normalen Bereichs geantwortet hat.


=How does ExpressionScript support conditional micro-tailoring?=
=Wie unterstützt ExpressionScript bedingtes Micro-Tailoring?=




Here is an example of micro-tailoring (where Question Type=='expr' means an Equation):
Hier ist ein Beispiel für Micro-Tailoring (wobei Question Type=='expr' eine Gleichung bedeutet):




{| class="wikitable"
{| class="wikitable"
!Question Code!!Relevance!!Question Type!!Question
!Fragecode!!Relevanz!!Fragetyp!!Frage
|-
|name||1||text||What is your name?
|-
|age||1||text||How old are you?
|-
|badage||!is_empty(age)||expr||{(age<16) or (age>80)}
|-
|-
|agestop||badage||message||Sorry, {name}, you are too {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for this test.
|Name||1||Text||Wie heißt du?
|-! N!|age||1||text||Wie alt bist du?
|-
|-
|kids||!badage||yesno||Do you have children?
|badage||!is_empty(age)||expr||{(age<16) or (age>80 )}
|-
|-
|parents||1||expr||{!badage && kids=='Y'}
|agestop||badage||message||Tut mir leid, {Name}, du bist zu {if( (Alter<16),'young',if( (Alter>80), 'alt', 'mittleren Alters') ) } für diesen Test.
|-
|-
|numKids||parents||text||How many children do you have?
|Kinder||!badage||janein||Haben Sie Kinder?
|-
|-
|kid1||parents && numKids >= 1||text||How old is your first child?
|Eltern ||1||expr||{!badage && kids=='Y'}
|-
|-
|kid2||parents && numKids >= 2||text||How old is your second child?
|numKids||parents||text||Wie viele Kinder haben Sie?
|-! N!|kid1||parents && numKids >= 1||text||Wie alt ist Ihr erstes Kind?
|-
|-
|kid3||parents && numKids >= 3||text||How old is your third child?
|kid2||parents && numKids >= 2||text||Wie alt ist Ihr zweites Kind?
|-
|-
|kid4||parents && numKids >= 4||text||How old is your fourth child?
|kid3||parents && numKids >= 3||text||Wie alt ist Ihr drittes Kind?
|-
|-
|kid5||parents && numKids >= 5||text||How old is your fifth child?
|kid4||parents && numKids > = 4||text||Wie alt ist Ihr viertes Kind?
|-
|-
|sumage||1||expr||{sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
|kid5||parents && numKids >= 5||text||Wie alt ist Ihr fünftes Kind?
|-! N!|sumage||1||expr||{sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
|-
|-
|report||parents||text||{name}, you said you are {age} and that you have {numKids}.  The sum of ages of your first {min(numKids,5)} kids is {sumage}
|report||parents| |text||{name}, Sie sagten, Sie seien {age} und hätten {numKids}. Das Gesamtalter Ihrer ersten {min(numKids,5)} Kinder beträgt {sumage}
|}
|}




To download the above survey example, click on the following link: [[Media:No_of_kids_-_Micro_Tailoring.zip|Number of kids survey example]].
Um das obige Umfragebeispiel herunterzuladen, klicken Sie auf den folgenden Link: [[Media:No_of_kids_-_Micro_Tailoring.zip|Beispiel für eine Umfrage zur Anzahl der Kinder]].


All of these questions can be on a single page (e.g., in the same group), and only the relevant questions will be displayed. Moreover, as you enter the ages of children, the sum() expression in the last question will dynamically get updated.
Alle diese Fragen können auf einer einzigen Seite (z. B. in derselben Gruppe) stehen und nur die relevanten Fragen werden angezeigt. Darüber hinaus wird der sum()-Ausdruck in der letzten Frage dynamisch aktualisiert, wenn Sie das Alter der Kinder eingeben.


ExpressionScript provides this functionality by surrounding each expression with a named <nowiki><span></nowiki> element. Every time a value changes, it recomputes the expression that should appear in that <nowiki><span></nowiki> element and regenerates the display. You can have dozens or even hundreds of such tailored expressions on the same page.
ExpressionScript stellt diese Funktionalität bereit, indem es jeden Ausdruck mit einem Namen umgibt<nowiki></nowiki><span>Element. Jedes Mal, wenn sich ein Wert ändert, wird der Ausdruck neu berechnet, der in dem <nowiki><span></nowiki>Element erscheinen sollte und generiert die Anzeige neu. Sie können Dutzende oder sogar Hunderte solcher maßgeschneiderter Ausdrücke auf derselben Seite haben.</span></span>




=Syntax highlighting=
=Syntaxhervorhebung=




To help with entering and validating expressions, the EM provides syntax highlighting with the following features:
Um die Eingabe und Validierung von Ausdrücken zu erleichtern, bietet das EM eine Syntaxhervorhebung mit den folgenden Funktionen:


==Types and Meanings of Syntax Highlighting==
==Typen und Bedeutungen der Syntaxhervorhebung==




{| class="wikitable"
{| class="wikitable"
!Color!!Sample!!Meaning!!Tooltip!!Comments
!Farbe!!Beispiel!!Bedeutung!!Tooltip!!Kommentare
|-
|-
|tan background||style='background-color: #eee8aa'|Sample||the whole equation||none||Anything within curly braces that is recognized as an equation (e.g., there is no leading or trailing whitepace) will be color-coded with a tan background to help distinguish it from surrounding text
|tan background||style='background-color: #eee8aa'|Sample||the ganze Gleichung||keine||Alles in geschweiften Klammern, das als Gleichung erkannt wird (z. B. gibt es keine führenden oder nachgestellten Leerzeichen), wird farblich mit einem hellbraunen Hintergrund versehen, um es besser vom umgebenden Text unterscheiden zu können.
|-
|-
|bold red text||style='color:#ff0000; background-color:#eee8aa'|'''Sample'''||An error||Some explanation on error||Can be an unknow variable or an error in function. Survey is broken and the questions that rely on the respective expression will not be shown to the respondents.
|fetter roter Text||style='color:#ff0000; background-color:#eee8aa'|'''Sample'''||Ein Fehler||Einige Erklärung zum Fehler||Kann eine unbekannte Variable oder ein Fehler in der Funktion sein. Die Umfrage ist unterbrochen und die Fragen, die auf dem entsprechenden Ausdruck basieren, werden den Befragten nicht angezeigt.
|-
|-
|blue text||style='color:#0000ff; background-color:#eee8aa'|Sample||function name||meaning and allowable syntax||It refers to function names or things that should be functions since they are followed by an open parenthesis. They are displayed in bold blue text. Tooltips show the meaning and allowable syntax for the function.
|blue text||style='color:#0000ff; Hintergrundfarbe:#eee8aa'|Beispiel||Funktionsname||Bedeutung und zulässige Syntax||Es bezieht sich auf Funktionsnamen oder Dinge, die Funktionen sein sollten, da ihnen eine offene Klammer folgt. Sie werden in fetter blauer Schrift angezeigt. Tooltips zeigen die Bedeutung und zulässige Syntax für die Funktion.
|-
|-
|grey text||style='color:#808080; background-color:#eee8aa'|Sample||string||none||Single and double-quoted strings are shown in grey text.
|grey text||style='color:#808080; background-color:#eee8aa'|Sample||string||none||Einfache und doppelte Anführungszeichen werden in grauem Text angezeigt.
|-
|-
|cyan text||style='color:#4169e1; background-color:#eee8aa'|Sample||variable set on the same page,||<nowiki>[</nowiki>name or SGQA code]: question; value; answerList showing codes for each value||Any variable that is set on the same page as the question you are currently editing is shown in cyan text (it can be updated in javascript). The tooltip shows its name (if you used INSERTANS:xxx) or its SGQA code (if you used the new naming system), the actual question, and its current value (or blank if not set). If the question type expects responses from an enumerated value set, the mapping of the codes to display values is shown.
|cyanfarbener Text||style='color:#4169e1; Hintergrundfarbe:#eee8aa'|Beispiel||Variablensatz auf derselben Seite,||<nowiki> [</nowiki> Name oder SGQA-Code]: Frage; Wert; Antwortliste mit Codes für jeden Wert||Jede Variable, die auf derselben Seite wie die Frage, die Sie gerade bearbeiten, festgelegt ist, wird in cyanfarbenem Text angezeigt (sie kann in Javascript aktualisiert werden). Der Tooltip zeigt seinen Namen (wenn Sie INSERTANS:xxx verwendet haben) oder seinen SGQA-Code (wenn Sie das neue Benennungssystem verwendet haben), die eigentliche Frage und ihren aktuellen Wert (oder leer, wenn nicht festgelegt). Wenn der Fragetyp Antworten von einem Aufzählungswertesatz erwartet, wird die Zuordnung der Codes zu Anzeigewerten angezeigt.
|-
|-
|green text||style='color:#008000; background-color:#eee8aa'|Sample||variable set on a prior page||<nowiki>[</nowiki>name or SGQA code]: question; value; answerList showing codes for each value||Any variable that is set on a prior page is shown in bold green text. The tooltip shows its name (if you used INSERTANS:xxx) or SGQA code (if you used the new naming system), the actual question, and its current value (or blank if not set). If the question type expects responses from an enumerated value set, the mapping of the codes to display values is shown.
|green text||style='color:#008000; Hintergrundfarbe:#eee8aa'|Beispiel||Variablensatz auf einer vorherigen Seite||<nowiki> [</nowiki> Name oder SGQA-Code]: Frage; Wert; Antwortliste mit Codes für jeden Wert||Jede Variable, die auf einer vorherigen Seite festgelegt wurde, wird in fettem grünem Text angezeigt. Der Tooltip zeigt seinen Namen (wenn Sie INSERTANS:xxx verwendet haben) oder den SGQA-Code (wenn Sie das neue Benennungssystem verwendet haben), die eigentliche Frage und ihren aktuellen Wert (oder leer, wenn nicht festgelegt). Wenn der Fragetyp Antworten von einem Aufzählungswertesatz erwartet, wird die Zuordnung der Codes zu Anzeigewerten angezeigt.
|-
|-
|bold pink text||style='color:#9370db; background-color:#eee8aa'|Sample||variable set on a later page <sup>in general : empty at survey start, but can be filled with index or move previous</sup>||<nowiki>[</nowiki>name or SGQA code]: question; value; answerList showing codes for each value||Any variable that is set on a prior page is shown in bold pink text. The tooltip shows its name (if you used INSERTANS:xxx) or SGQA code (if you used the new naming system), the actual question, and its current value (or blank if not set). If the question type expects responses from an enumerated value set, the mapping of the codes to display values is show.
|bold pink text||style='color:#9370db; background-color:#eee8aa'|Sample||Variable wird auf einer späteren Seite festgelegt <sup>, im Allgemeinen: zu Beginn der Umfrage leer, kann aber mit einem Index gefüllt oder nach vorne verschoben werden</sup> ||<nowiki> [</nowiki> Name oder SGQA-Code]: Frage; Wert; Antwortliste mit Codes für jeden Wert||Jede Variable, die auf einer vorherigen Seite festgelegt wurde, wird in fettem rosa Text angezeigt. Der Tooltip zeigt seinen Namen (wenn Sie INSERTANS:xxx verwendet haben) oder den SGQA-Code (wenn Sie das neue Benennungssystem verwendet haben), die eigentliche Frage und ihren aktuellen Wert (oder leer, wenn nicht festgelegt). Wenn der Fragetyp Antworten von einem Aufzählungswertesatz erwartet, wird die Zuordnung der Codes zu Anzeigewerten angezeigt.
|-
|-
|bold tan text||style='color:#a0522d; background-color:#eee8aa'|Sample||a lime replacement value||the value||Lime Replacement Strings (like {TOKEN:xxx}, {PRIVACY_MESSAGE}) are shown in bold tan text.
|bold tan text||style='color:#a0522d; background-color:#eee8aa'|Beispiel||ein Lime-Ersatzwert||der Wert||Lime-Ersatzzeichenfolgen (wie {TOKEN:xxx}, {PRIVACY_MESSAGE}) werden in fettem hellbraunem Text angezeigt.  
|-
|-
|red text||style='color:#ff4500; background-color:#eee8aa'|Sample||assignment operator (=) ||warning message||If you use one of the assignment operator (=), that operator will be displayed in red text. This is meant to help prevent accidental re-assignment of values when you really meant to check whether a == b instead of  setting the value of a = b.
|roter Text||style='color:#ff4500; Hintergrundfarbe:#eee8aa'|Beispiel||Zuweisungsoperator (=) ||Warnmeldung||Wenn Sie einen der Zuweisungsoperatoren (=) verwenden, wird dieser Operator in rotem Text angezeigt. Dies soll dazu beitragen, eine versehentliche Neuzuweisung von Werten zu verhindern, wenn Sie eigentlich prüfen wollten, ob a == b, anstatt den Wert von a = b festzulegen.
|-
|-
|normal black text||style='color:black; background-color:#eee8aa'|Sample||punctuation||none||All other punctuation signs within the expression are shown as normal black text.
|normaler schwarzer Text||style=' Farbe: Schwarz; background-color:#eee8aa'|Sample||Interpunktion||none||Alle anderen Interpunktionszeichen innerhalb des Ausdrucks werden als normaler schwarzer Text angezeigt.
|-
|-
|red-boxed text||a bold red line surrounds the error||syntax error||description of the error||Any detected syntax errors are shown within red boxes. The tooltip shows the error. Examples include unmatched parentheses, use of undefined functions, passing the wrong number of arguments to functions, poorly structured expressions (e.g., missing operators between variables), trying to assign a new value to a read-only variable, trying to assign values to non-variables, or using unsupported syntax. Note that the syntax error dectection system may only report one error in an expression even if there are multiple errors; however, if any errors are detected, at least one error will be shown.
|Eine fette rote Linie umgibt den Fehler. Syntaxfehler und die Beschreibung des Fehlers werden in roten Kästen angezeigt. Der Tooltip zeigt den Fehler an. Beispiele hierfür sind nicht übereinstimmende Klammern, die Verwendung von undefinierten Funktionen, die Übergabe der falschen Anzahl von Argumenten an Funktionen, schlecht strukturierte Ausdrücke (z. B. fehlende Operatoren zwischen Variablen), der Versuch, einer schreibgeschützten Variablen einen neuen Wert zuzuweisen, der Versuch, Nicht-Variablen Werte zuzuweisen oder die Verwendung einer nicht unterstützten Syntax. Beachten Sie, dass das System zur Erkennung von Syntaxfehlern möglicherweise nur einen Fehler in einem Ausdruck meldet, auch wenn mehrere Fehler vorhanden sind; wenn jedoch mehrere Fehler erkannt werden, wird mindestens ein Fehler angezeigt.
|}
|}




{{Note| By tooltips, we refer to the popup message that is displayed when you hover over certain functions and variables.}}
{{Hinweis| Unter Tooltips verstehen wir die Popup-Meldung, die angezeigt wird, wenn Sie mit der Maus über bestimmte Funktionen und Variablen fahren.}}




=Additional reading=
=Zusätzliche Lektüre=




==[[ExpressionScript sample surveys|ExpressionScript sample surveys]]==
==[[ExpressionScript-Beispielumfragen|ExpressionScript-Beispielumfragen]]==




==[[ExpressionScript How-tos|Use cases and how-tos]]==
==[[ExpressionScript-Anleitungen|Anwendungsfälle und Anleitungen]]==




==[[ExpressionScript examples|Step-by-step examples]]==
==[[ExpressionScript-Beispiele|Schritt-für-Schritt-Beispiele]]==




==[[ExpressionScript for developers|Reference for Developers]]==
==[[ExpressionScript für Entwickler|Referenz für Entwickler]]==




==[[ExpressionScript Engine roadmap|RoadMap, status, ToDo List]]==
==[[ExpressionScript Engine-Roadmap|RoadMap, Status, ToDo-Liste]]==

Latest revision as of 17:04, 2 April 2024


Einleitung

LimeSurvey verwendet das neue Expression Manager (EM)-Modul, mit dem LimeSurvey komplexere Verzweigungen, Bewertungen, Validierungen und Anpassungen unterstützen kann. Es ersetzt die Art und Weise, wie LimeSurvey Ersetzungen, Bedingungen und Bewertungen im Backend verwaltet. Außerdem wird die Verarbeitung erheblich beschleunigt, da die meisten Datenbanklesevorgänge zur Laufzeit entfallen. EM wurde von Dr. Thomas White (TMSWhite) entwickelt.


Schlüsseldefinitionen

  1. Ausdruck: Alles, was von geschweiften Klammern umgeben ist:
    • Solange sich unmittelbar nach der öffnenden Klammer oder vor der schließenden geschweiften Klammer kein Leerzeichen befindet.
    • Der Inhalt des Ausdrucks wird von EM ausgewertet, sodass er mathematische Formeln, Funktionen und komplexe Zeichenfolgen- und Datumsverarbeitung enthalten kann.
  2. Tailoring: Wird manchmal als „Piping“ bezeichnet. Dabei handelt es sich um den Prozess der bedingten Änderung von Text:
    • Sie haben Zugriff auf alle „Ersatzfelder“, Teilnehmerdaten und Antwortdaten.
    • Sie haben außerdem einfacheren Zugriff auf Fragen, Antworten und deren Eigenschaften.
  3. Relevanz Gleichung: Ein neues Frageattribut, das die Sichtbarkeit der Frage steuert:
    • Wenn eine Relevanzgleichung vorhanden ist, wird die Frage nur angezeigt, wenn die Relevanz als wahr ausgewertet wird.
    • Intern werden alle array_filter und array_filter_exclude Befehle auf Unterfragenebene relevant.
  4. SGQA (wie Variablen früher benannt wurden):
    • Steht für Survey-Group-Question-Answer
    • SGQA-Variablennamen sehen wie 123X5X382X971 aus und können Unterfragesuffixe haben.
    • Diese Variablennamen sind spezifisch für die zugrunde liegenden S/Q/G/A-Datenbankcodes und müssen daher häufig geändert werden
  5. Gleichung Fragetyp: Ein neuer Fragetyp, der Berechnungen oder Berichte in der Datenbank speichert:
    • Es ähnelt einer Standardfrage, aber der Inhalt wird in der Datenbank gespeichert, auch wenn Sie „Diese Frage immer ausblenden“ festlegen.
  6. Fragecode: Dies ist der bevorzugte Variablenname für EM:
    • Dies kann ein beschreibender Name sein, der den Zweck der Frage angibt und das Lesen komplexer Logik erleichtert.
    • Gültige Fragecodes sollten NICHT mit einer Zahl beginnen. Wenn Sie also den Fragecode zum Nummerieren Ihrer Fragen verwenden, verwenden Sie einfach „q1“, „q1a“ oder „g1q2“.
    • Dies wird zum Variablennamen, wenn Sie Daten nach SPSS oder R exportieren. Wenn Sie also statistische Analysen durchführen, müssen Sie nur eindeutige Fragecodes erstellen.


Muss ich EM verwenden?


Die kurze Antwort lautet „Nein“. Dies hängt jedoch stark von der Komplexität der Umfrage ab, die Sie erstellen möchten.

Der Bedingungseditor deckt beispielsweise einige grundlegende Ausdrücke ab, die auf die Fragen Ihrer Umfrage angewendet werden können. Allerdings ist der Bedingungen-Editor eingeschränkt. Aus diesem Grund wird das EM verwendet – es erweitert den Bereich der Anpassungsmöglichkeiten.


Kann ich Bedingungen und Relevanzgleichungen mischen?

Ja. Für einige Fragen können Sie den Bedingungseditor und für andere Relevanzgleichungen verwenden.

Sie können nicht sowohl Bedingungen als auch Ausdrücke in derselben Frage einrichten! Sobald eine Bedingung eingerichtet ist, ersetzt sie jeden Ausdruck, der in das Relevanzgleichungsfeld geschrieben wird. Darüber hinaus kann das Feld Relevanzgleichung nicht mehr manuell bearbeitet werden.

Dennoch gibt es eine Möglichkeit, sowohl Ausdrücke als auch Bedingungen innerhalb einer Frage zu verwenden. Wie oben erwähnt, ersetzt eine Bedingung das Relevanzgleichungsfeld. Wenn Sie fertig sind, überprüfen Sie die neu erstellte Gleichung und kopieren Sie sie in einen Texteditor. Löschen Sie die neu erstellte Bedingung aus dem Bedingungseditor und bearbeiten Sie dann die Frage, indem Sie die bedingungsbasierten Ausdrücke aus Ihrer Texteditordatei zusammen mit den übrigen Ausdrücken hinzufügen, die Sie verwenden möchten.


Wie soll ich zwischen Bedingungen und Relevanz wählen?

Hier ist eine Liste der Vor- und Nachteile jedes Stils:

Stil Vorteile Nachteile
Bedingungen 1. Schöne GUI zum Erstellen einfacher Bedingungen.
2. GUI gut dokumentiert und vom Support-Team verständlich
1. Unterstützt nur einfache Vergleiche und funktioniert nicht gut mit „AND“- und „OR“-Bedingungen.
2. Kaskadierende Bedingungen funktionieren unregelmäßig.
3. Langsam – datenbankintensiv – kann lange Umfragen verlangsamen.
4. Einige haben Probleme mit den Nachladebedingungen gemeldet.
5. Die GUI lässt sich nicht gut skalieren, wenn es Dutzende, Hunderte oder Tausende von Fragen gibt.
6. Die Konvertierung papierbasierter Umfragen könnte langsam sein, da dabei SGQA-Namen verwendet werden müssen.
7. Oft ist ein Programmierer erforderlich, um die für komplexe Verzweigungen benötigte Logik individuell zu codieren.
Relevanz 1. Unterstützt sehr komplexe Logik, einschließlich über 80 Funktionen und Mathematik-/String-Operatoren.
2. Perfekte Unterstützung für kaskadierende Logik.
3. Schnell – keine zusätzlichen Datenbankaufrufe, Unterstützung von Umfragen mit über 1000 Fragen.
4. Keine Probleme beim Neuladen der Logik, da keine SGQA-Codes erforderlich sind.
5. Syntax-Hervorhebungsskalen für Umfragen mit mehr als 1000 Fragen.
6. Einfach und schnell für Gruppen zu verwenden, die bestehende papierbasierte Umfragen computerisieren möchten.
7. Es unterstützt problemlos halbstrukturierte Interviews und epidemiologische Umfragen, ohne dass ein Programmierer erforderlich ist.
1. Keine GUI für einfache Bedingungen – stattdessen wird syntax-highlighting verwendet.


Template:Hinweis

Erste Schritte

Der beste Weg, mit dem EM zu beginnen, ist:

  • Installieren Sie die neueste stabile Version von https://www.limesurvey.org/en/download.
  • Importieren und erkunden Sie einige Beispielumfragen.
  • Entdecken Sie die Anwendungsfälle und Anleitungen und die Schritt- Schrittweise Beispiele.
  • Erkunden Sie die EM-Dokumentation (diese Seite)
    • Unit-Tests isolierter Ausdrücke (fortgeschritten)
      • zeigt Beispiele für die Verwendung aller EM-Funktionen und -Operatoren sowie die PHP- und JavaScript-Ergebnisse;
      • Beachten Sie, dass es in den PHP- und JavaScript-Versionen nur wenige Funktionen gibt, die unterschiedliche Ergebnisse generieren. Daher können Sie auf dieser Seite Ihre EM-Logik entsprechend planen.

Terminologie

Diese Wörter werden häufig verwendet, um die Fähigkeiten des EM zu beschreiben:

  • Relevanzbasierte Verzweigung – wenn eine Frage relevant ist, dann stellen Sie sie, andernfalls nicht (z. B. machen Sie sie unsichtbar und markieren Sie sie in der Datenbank als NULL). Sie können die Relevanzfelder sowohl im Frageneditor-Panel als auch im Fragengruppen-Editor-Panel finden. Letzteres wird verwendet, um eine Reihe von Bedingungen auf eine ganze Gruppe anzuwenden, ohne die gleiche Bedingung auf jede Frage kopieren zu müssen, und/oder die bedingte Logik auf Gruppen- und Fragenebene zu kombinieren. Dadurch können Sie nicht nur einfache Substitutionen (wie {TOKEN:FIRSTNAME}) unterstützen, sondern auch die Konjugation von Verben und die Deklination von Substantiven basierend auf dem Geschlecht oder der Anzahl Ihrer Subjekte. Außerdem können Sie die Nachricht, die Sie einem Umfrageteilnehmer übermitteln, basierend darauf ändern, ob er andere Fragen beantwortet hat (oder wie er diese beantwortet hat).
  • Gleichungen – EM fügt einen neuen Fragetyp namens Gleichung hinzu, der das Ergebnis eines Ausdrucks speichert. Die Gleichungsergebnisse werden berechnet und in die Datenbank geschrieben, auch wenn Sie sie auf der Seite ausblenden. Daher werden sie für versteckte Scoring-Berechnungen, Navigation auf der Grundlage komplexer Gleichungen, Bewertungen und Berichte verwendet, die in der Datenbank generiert und gespeichert werden.


Relevanz und kaskadierende Relevanz

Jeder Fragetyp verfügt jetzt über eine Relevanzoption, die steuert, ob die Frage angezeigt wird. EM verarbeitet jede der Relevanzgleichungen in der Reihenfolge, in der sie in der Umfrage erscheinen sollen. Wenn der Ausdruck wahr ist (oder fehlt – zur Unterstützung älterer Umfragen), wird die Frage angezeigt. Wenn es nicht relevant ist, wird die Frage ausgeblendet und der Wert wird in der Datenbank auf NULL gesetzt. Wenn in einer Gruppe keine relevanten Fragen vorhanden sind, wird die gesamte Gruppe übersprungen.

Wenn außerdem eine der Variablen in einem Ausdruck irrelevant ist, wird der Ausdruck immer als falsch ausgewertet. Dies ermöglicht die Kaskadierung der Relevanz, sodass Sie nicht für jede Frage sehr lange Relevanzgleichungen schreiben müssen.

Angenommen, Sie haben fünf Fragen Q1–Q5 und möchten nur Q2 anzeigen, wenn Q1 beantwortet wurde, und Q3, wenn Q2 beantwortet wurde usw. Die Relevanzgleichungen könnten wie folgt lauten:

Frage-Nummer Relevanz Frage
Q1 1 Wie heißen Sie?
Q2 Q1 {Q1}, wie alt sind Sie?
Q3 Q2 Also, Sie sind {Q2} Jahre alt. Sind Sie verheiratet?
Q4 Q3 == "Y" {Q1}, wie lange sind Sie schon verheiratet?
Q5 Q4 Wie viele Kinder haben Sie, {Q1}?


Relevanz auf Gruppenebene

ExpressionScript unterstützt auch Relevanz auf Gruppenebene. Dies erleichtert die Implementierung von Schleifen. Angenommen, Sie möchten Informationen von bis zu 10 Entitäten sammeln (z. B. Produkte oder Personen aus einem Haushalt), wobei Sie zunächst bestimmen, wie viele Entitäten weiterverfolgt werden müssen (z. B. indem Sie fragen, wie viele Personen in einem Haushalt leben, oder indem Sie die Personen aus einer langen Liste überprüfen lassen, welche Produkte ihnen gefallen). Nachdem Sie wissen, wie viele Entitäten eine Nachverfolgung benötigen, können Sie die Relevanz auf Gruppenebene wie {count >= 1}, {count >=2}, ... {count >= 10} für jede der 10 Gruppen von Folgefragen verwenden. Innerhalb jeder Gruppe können Sie eine bedingte Logik auf Fragenebene verwenden (z. B. geschlechts- oder altersspezifische Folgefragen für jedes Thema). Die Fragen- und Gruppenrelevanzgleichungen werden mit UND verknüpft, um zu bestimmen, welche angezeigt werden sollen.

Um ein solches Beispiel zu überprüfen, importieren Sie die folgende Umfrage: Census-Umfragebeispiel.

Im folgenden Screenshot ist zu erkennen, dass die Gruppe „Person 1“ angezeigt (oder relevant) wird, wenn der Befragte mit mindestens einem weiteren Mitbewohner zusammenlebt:



Tailoring/Piping

Alles in geschweiften Klammern wird jetzt als Ausdruck behandelt (mit einer Ausnahme, die unten beschrieben wird). Ausdrücke haben Zugriff auf alle LimeReplacementFields und Variablen (über mehrere Aliase), alle typischen Gleichungsoperatoren (mathematische, logische und Vergleichsoperatoren) und auf dutzende Funktionen (die sogar dynamisch auf der Client-Seite arbeiten).

Durch die Benutzung dieser Gleichungen, können Sie z.B. solche Dinge machen:

  1. Den Befragten maßgeschneiderte Nachrichten abhängig von früheren Antworten zeigen.
  2. Beurteilungen erstellen und die Beurteilungsergebnisse (oder bedingte Verzweigungen oder Nachrichten) basierend auf diesen Ergebnissen anzeigen lassen. Alles ohne das Beurteilungsmodul selber zu benutzen.
  3. Verben konjugieren und Nomen deklinieren.
  4. Sich Zusammenfassungen der Antworten vor der "Antworten anzeigen" Seite am Ende der Umfrage anzeigen lassen.


Gleichungen

Es gibt einen neuen Fragetyp namens Gleichung. Betrachten Sie es als einen Fragentyp Textanzeige, mit der Ausnahme, dass darin der Wert dessen gespeichert wird, was in der Datenbank angezeigt wird. Wenn der Text der Gleichungsfrage also eine Bewertungsberechnung enthält, wird dieser Wert in der Datenbank in einer Variablen gespeichert, die in öffentlichen oder privaten Statistiken angezeigt werden kann.


Syntax

Alles, was in geschweiften Klammern enthalten ist, wird jetzt als Ausdruck betrachtet (mit einer Ausnahme: „Es dürfen keine führenden oder nachgestellten Leerzeichen vorhanden sein“ – dies ist erforderlich, um sicherzustellen, dass ExpressionScript nicht versucht, eingebettetes JavaScript zu verarbeiten).

Beachten Sie, dass Ausdrücke sich über mehrere Zeilen erstrecken können, solange nach der öffnenden geschweiften Klammer oder vor der schließenden geschweiften Klammer kein Leerzeichen steht. Dies ist besonders hilfreich für verschachtelte „if()“-Anweisungen wie diese:

{if(is_empty(PFTotals),
 '',
 if(PFTotals >= -5 && PFTotals <= -4,
 'Very Soft',
 if(PFTotals >= -3 && PFTotals <= -2,
 'Soft',
 if(PFTotals == -1,
 'Etwas weich',
 if(PFTotals == 0,
 'Moderate',! N! if(PFTotals == 1,
 'Etwas schwer',
 if(PFTotals >= 2 && PFTotals <= 3,
 'Hard',
 if(PFTotals >= 4 && PFTotals <= 5,
 'Sehr schwer',
 ''
 )
 )
 )
 )
 )
 )
 )
)}

Das ExpressionScript unterstützt die folgende Syntax:

  • Alle standardmäßigen mathematischen Operatoren (z. B. +,-,*,/,!);
  • Alle standardmäßigen Vergleichsoperatoren (z. B. <,<=,==,!=,> ,>=, plus ihre Äquivalente: lt, le, eq, ne, gt, ge);
  • Klammern (damit Sie Unterausdrücke gruppieren können);
  • Bedingungsoperatoren (z. B. &&,| | und ihre Äquivalente: und, oder);
  • Strings in einfachen und doppelten Anführungszeichen (die jeweils Strings mit dem anderen Anführungszeichentyp einbetten können);
  • Kommaoperator (kann also eine Liste von Ausdrücken haben und einfach das Endergebnis zurückgeben );
  • Zuweisungsoperator (=);
  • Vordefinierte Variablen (zur Bezugnahme auf Fragen, Frageattribute und Antworten) – z. B. die SGQA-Codes;
  • Vordefinierte Funktionen (es gibt bereits über 80, und es ist einfach, weitere hinzuzufügen).


Operatoren

Die EM-Syntax folgt der normalen Operatorpriorität:

Level Operator(s) Description
1 () Klammern zum Gruppieren oder Aufrufen von Funktionen
2 ! - + unäre Operatoren: nicht, Negation, unär-plus
3 * / mal, dividieren
4 + - plus, minus
5 < <= > >= lt le gt ge relative Vergleiche
6 == != eq ne Gleichheitsvergleiche
7 und logisches UND
8 oder logisches ODER
9 = Zuweisung Operator
10 , Kommaoperator

Template:Hinweis

Warnung mit nicht übereinstimmender Zahl und Zeichenfolge und alphabetischem/numerischem Vergleich

Wenn Sie Werte mit Relativ- oder Gleichheitsvergleichen vergleichen möchten, achten Sie auf Nichtübereinstimmungen. Ein vom Benutzer eingegebener (oder über den Antwortcode bereitgestellter) Wert kann als Zahl verwendet werden, wenn es sich eindeutig um eine Zahl handelt. Wenn Sie einen der Werte mit " umgeben, wird ein Text-/String-Vergleich durchgeführt. Wenn Sie als Zahl vergleichen möchten, umgeben Sie eine Zahl niemals mit " .

Beispielsweise ist Q0.NAOK > "50" wahr, wenn Q0.NAOK eine numerische Frage mit 9 als Wert ist. Dies liegt daran, dass der Operator > davon ausgeht, dass es sich um einen alphabetischen und nicht um einen numerischen Vergleich handelt.

Um sicherzustellen, dass Sie ganzzahlige Werte vergleichen, können Sie intval(Q0.NAOK) > 50 verwenden. Denken Sie daran, wenn Q0.NAOK keine Zahl ist (leer oder eine Zeichenfolge), dann ist intval(Q0.NAOK) === 0. Um Zeichenfolgenwerte („A“ < „B“) zu vergleichen, verwenden Sie strcmp direkt: strcmp(Q0.NAOK,"B") oder strcmp(Q0.NAOK,"A5") .

Vorsicht bei der Verwendung des Zuweisungsoperators (=)

Sie sollten die Zuweisungsoperatoren nur dann verwenden, wenn dies unbedingt erforderlich ist, da sie zu unerwarteten Nebenwirkungen führen können. Wenn Sie beispielsweise den Wert einer vorherigen Antwort ändern, wird die kaskadierende Relevanz und Validierungslogik zwischen dieser Frage und der aktuellen Frage nicht neu berechnet, sodass möglicherweise intern inkonsistente Daten vorliegen (z. B. Fragen, die beantwortet bleiben, aber auf NULL gesetzt wurden, oder Fragen, die übersprungen wurden, aber beantwortet werden sollten). Wenn Sie einer Variablen einen Wert zuweisen möchten, sollten Sie im Allgemeinen einen Fragetyp „Gleichung“ erstellen und einen Ausdruck verwenden, um seinen Wert festzulegen. Da es jedoch seltene Fälle gibt, in denen Menschen diesen Operator wirklich benötigen, haben wir ihn zur Verfügung gestellt.

Um Sie vor diesem Operator zu warnen, wird er in den Syntaxgleichungen in roter Schrift angezeigt (damit Sie ihn nicht mit „==" verwechseln).



Zuweisungsoperator verwenden

Die Hauptgründe, warum Sie den Zuweisungsoperator verwenden möchten, sind:

  • Sie müssen den Standardwert über eine Gleichung für eine Frage festlegen, die keine Standardwerte akzeptiert (z. B. Listenradio, bei dem Sie über die Benutzeroberfläche einen auswählen können, die Antwortoptionen, erlaubt Ihnen aber nicht, eine Gleichung einzugeben). Seien Sie jedoch vorsichtig, da LimeSurvey nicht validieren kann, ob Ihre Gleichung eine der zulässigen Antworten für diese Frage generiert;
  • Sie müssen die Antwort auf eine vorherige Frage basierend auf einer späteren Antwort zwangsweise ändern;
* usw...


  Achtung : Die Zuweisung erfolgt nur in PHP. Das bedeutet, dass der Wert nicht auf derselben Seite aktualisiert wird, sondern erst, wenn der Benutzer zur nächsten Seite wechselt. Seien Sie daher bitte vorsichtig, wenn der Zuweisungsoperator auf derselben Seite mit anderen Ausdrücken verwendet wird.



Zu diesem Zweck können Sie das gesamte Expression-Manager-System verwenden. Zu diesem Zweck ist es besser, eine Gleichung zu verwenden.

Einige Beispiele:

  • Legen Sie die Antwort auf eine kurze Textfrage in Kleinbuchstaben fest: {QCODE=strtolower(QCODE.NAOK)} ;
  • Legen Sie zu Beginn einer Umfrage eine Standardantwort auf einen Array-Fragetyp fest: {Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} ;
  • Legen Sie zu Beginn einer Umfrage eine Standardantwort auf einen Array-Text-Fragetyp fest: {Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} ;
  • Legen Sie eine Antwort mit der Bedingung fest: {QCODE=if(YesNo="Y","A1","")} .

XSS-Sicherheit

Wenn XSS aktiviert ist, können einige Teile des Ausdrucksmanagersystems nicht verwendet werden:

  • ein HTML-Tag in einem Ausdruck beginnen, aber in einem anderen Ausdruck enden;
  • einen komplexen Ausdruck innerhalb einer URL verwenden.


Template:Hinweis


Beispiele und Problemumgehungen:

  • wenn {if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")} mit XSS-Sicherheit gebrochen ist, dann können Sie hier folgendes verwenden: {if(1,"<strong>information</strong>","information")};
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, hier können Sie eine Gleichungsfrage verwenden, da die Verwendung eines vollständigen Fragecodes in Ordnung ist: <a href="/script.php?value={EQUATION.NAOK}">next</a>.


Zugriff auf Variablen

ExpressionScript bietet schreibgeschützten Zugriff auf alle Variablen, die Sie benötigen. Aus Gründen der Abwärtskompatibilität bietet es Zugriff auf Folgendes:

Darüber hinaus können Sie mit ExpressionScript über den Fragecode (die „Titel“-Spalte in der Fragentabelle innerhalb der Datenbank) auf Variablen verweisen. Dies ist auch die Variablenbezeichnung, die beim Exportieren Ihrer Daten nach SPSS, R oder SAS verwendet wird. Wenn Sie beispielsweise Fragen zu Name, Alter und Geschlecht haben, können Sie diese Variablen „Name“, „Alter“ und „Geschlecht“ anstelle von „12345X13X22“, „12345X13X23“ und 12345X13X24 nennen. Dadurch ist es für jeden einfacher, Gleichungen zu lesen und die Logik zu validieren. Darüber hinaus ist es möglich, Fragen zu verschieben, ohne die Gruppen- oder Fragennummern im Auge behalten zu müssen.

Wichtig: Es ist sicherer, auf Variablen zu verweisen, die in den vorherigen Seiten oder Fragen vorkommen.

Darüber hinaus können Sie mit ExpressionScript auf viele Eigenschaften der Frage zugreifen:


Syntax Bedeutung Beispiel Beispiel Ergebnis
Qcode ein Alias für Qcode.code {implode(',',name,gender )} 'Tom','M'
Qcode.code der ausgewählte Antwortcode für die Frage, wenn er relevant ist (sonst leer), oder der Textwert, wenn es sich nicht um eine codierte Frage handelt {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK wie Qcode – siehe Diskussion von NAOK {gender.NAOK} 'M'
Qcode.value der Bewertungswert für die Frage, wenn er relevant ist (sonst leer), oder der Textwert, wenn dies nicht der Fall ist eine codierte Frage {gender.value} '1'
Qcode.valueNAOK dasselbe wie Qcode.value – siehe Diskussion über NAOK {gender.valueNAOK} '1 '
Qcode.shown der Anzeigewert für die Frage {implode(',',name.shown,gender.shown)} 'Tom','Male'
Qcode.question der Text der Frage {gender.question} 'Was ist Ihr Geschlecht?'
Qcode.mandatory ob die Frage ist obligatorisch (J/N) {gender.mandatory} 'N'
Qcode.qid die interne Fragenummer (nicht die fortlaufende Nummer) {gender.qid} 337
Qcode.type der Fragetyp {gender.type} 'G'
Qcode.jsName der richtige Javascript-Name für die Frage, unabhängig davon, ob auf oder außerhalb dieser Seite deklariert {gender.jsName} 'java1827X3X337'
Qcode.gid die interne Gruppennummer (nicht die fortlaufende Nummer) {gender.gid} 3
Qcode.qseq die fortlaufende Nummer der Frage, beginnend bei 0 {gender.qseq} 5
Qcode.gseq die fortlaufende Nummer der Gruppe, beginnend bei 0 {gender.gseq} 1
Qcode.relevanceStatus ob die Frage aktuell relevant ist (0 oder 1) {gender.relevanceStatus} 1
Qcode.relevance die Relevanzgleichung auf Fragenebene {gender.relevance} '!is_empty(name)'
Qcode.grelevance die Relevanzgleichung auf Gruppenebene {gender.grelevance} 'num_children >= 5'
Qcode.sgqa der SGQA-Wert für diese Frage {gender.sgqa} '1827X3X337'


HTML-Editor-Problem

Wenn Sie den HTML-Editor verwenden, werden einige Zeichen durch HTML-Entitäten ersetzt.

  • & durch &amp;
  • < durch &lt;
  • > durch &gt;

Wenn Sie einen HTML-Editor verwenden, so nutzen Sie bitte:

  • und statt &
  • lt statt <
  • le statt <=
  • gt statt >
  • ge statt >=


Es wird empfohlen, den darin enthaltenen HTML-Code aus Ihrem Ausdruck zu entfernen. Wenn Sie den LimeSurvey-HTML-Editor verwenden, klicken Sie auf die Schaltfläche „Quelle“ (oben links im Editor) und löschen Sie alle Zeichen, die nicht mit Ihrem Ausdruck zusammenhängen (z. B.

,
, und so weiter).

Qcode-Variablenbenennung

Hier finden Sie Einzelheiten zum Erstellen eines Qcodes (und zum Zugreifen auf einige Eigenschaften) nach Fragetyp. Im Allgemeinen sind Qcodes wie folgt aufgebaut:

 Fragecode . '_' . SubQuestionID . '_' . ScaleId

Für „Kommentar“ und „Sonstiges“ lauten die entsprechenden Fragecodes QuestionCode_comment bzw. QuestionCode_other.

Typ Beschreibung Code Unterfragen Antwortoptionen Skalen Antwortcode Antwort angezeigt Relevanz
5 5 Punktauswahl-Optionsfelder Q1 1-5 {Q1} {Q1.shown} {Q1==3}
B Array (10 Punkte Auswahl) Optionsfelder Q2 |1-10 {Q2_L2} {Q2_L2.shown} {Q2_L2==7}
A Array (5 Punktauswahl) Optionsfelder Q3 |1-5 {Q3_1} {Q3_1.shown} {Q3_1>=3}
1 Array (Flexible Labels) Dual Scale Q4 sq1-sq5 0 :a1-a3 1:b1-b3 {Q4_sq1_0} {Q4_sq1_1.shown} {Q4_sq1_1=='b2'}
H Array (flexibel) - Spaltenformat Q5 1-5 s,m,t {Q5_1} {Q5_1.shown} {Q5_1=='s'}
F Array (flexibel) – Zeilenformat Q6 |1-5 {Q6_F3} {Q6_F3.shown} {Q6_F3==4}
E Array (Erhöhen/Gleich/Verringern) Optionsfelder Q7 1- 7 I,S,D {Q7_4} {Q7_4.shown} {Q7_4=='D'}
: Array (Multi Flexi) 1 bis 10 Q8 ls1,todo ,ls2 min,max,avg {Q8_ls1_max} {Q8_ls2_avg.shown} {Q8_ls2_min==7}
; Array (Multi Flexi) Text Q9 hp,st,sw 1., 2., 3. {Q9_hp_3rd} {Q9_hp_3rd.shown} {Q9_hp_3rd=='Peter'}
C Array (Ja/Unsicher/Nein) Optionsfelder Q10 1-5 Y,N,U {Q10_1} {Q10_1.shown} {Q10_3=='Y'}
X Boilerplate Question Q11 {Q11.shown}
D Datum Q12 {Q12} {Q12.shown}
* Gleichung Q13 {Q13} {Q13.shown} {Q13>5}
~124~ Datei-Upload (zeichnet die Anzahl der hochgeladenen Dateien auf) Q14 {Q14} {Q14>0}
G Dropdown-Liste „Geschlecht“ Q15 M,F {Q15} {Q15.shown} {Q15=='M'}
U Riesiger Freitext Q16 {Q16} {Q16.shown} {strlen(Q16)>100}
I Sprachfrage Q17 {Q17} {Q17.shown} {Q17=='en'}
! Liste - Dropdown Q18 1-5 {Q18} {Q18.shown} {Q18==3}
L Listen-Dropdown-/Radio-Button-Liste Q19 AZ {Q19} {Q19.shown} {Q19=='X'}
O Liste mit Kommentar-Dropdown/Radio-Button-Liste + Textbereich Q20 AF {Q20},{Q20comment} {Q20.shown} {Q20=='B'}
T Langer Freitext Q21 {Q21} {Q21.shown} {strstr(Q21,'hello')>0}
M Multiple-Choice-Kontrollkästchen Q22 | {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P Multiple Choice mit Kommentaren Kontrollkästchen + Text Q23 AF {Q23_D}, {Q23_Dcomment} {Q23_D.shown} {!is_empty(Q23)}
K Mehrfache numerische Frage Q24 self,mom,dad {Q24_self} {Q24_self.shown} {Q24_self>30}
Q Mehrfacher Kurztext Q25 AF {Q25_B} {Q25_B.shown} {substr(Q25_B,1,1)=='Q'}
N Numerischer Fragetyp Q26 {Q26} {Q26.shown} {Q26 > 30}
R Ranking-Stil Q27 1-4 {Q27_1} {Q27_1.shown} {Q27_1==3}
S Kurzer Freitext Q28 {Q28} {Q28.shown} {Q28=='mine'}
Y Ja/Nein-Optionsfelder Q29 {Q29} {Q29.shown} {Q29=='Y'}


Verwendung von NAOK

NAOK -> „Nicht zutreffend“ (NA) ist in Ordnung (OK)


Die Verwendung von NAOK bedeutet, dass alle oder einige der Variablen irrelevant sind (z. B. „Nicht anwendbar“ (NA) ist in Ordnung (OK)).

Zum Beispiel: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) gibt immer eine leere Zeichenfolge aus, wenn eine Unterfrage von Q1 gefiltert wird. Um die Anzahl der überprüften Unterfragen in einer solchen Frage zu zählen, kann count(Q1_SQ1.NAOK,Q1_SQ2.NAOK verwendet werden ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Wenn die Unterfrage ausgeblendet ist, gibt das EM eine leere Zeichenfolge zurück.

Wenn ohne NAOK eine Frage oder eine Unterfrage ausgeblendet ist, gibt der EM immer eine leere Zeichenfolge zurück (das Gleiche gilt für die Rückgabe von „false“).

Die angezeigten .NAOK-Codes verwenden immer das NAOK-System (leere Zeichenfolge, falls ausgeblendet). Wenn Sie jedoch den Code der Antwort benötigen, ist es immer eine gute Idee, .NAOK nach dem Fragecode hinzuzufügen (außer wenn Sie ihn benötigen und wissen, was Sie tun).

Weitere Informationen finden Sie im Unterabschnitt Overriding Cascading Conditions.


Die reservierten Variablen „this“, „self“ und „that“

Sehr oft möchten Sie alle Teile einer Frage auswerten, z. B. zählen, wie viele Unterfragen beantwortet wurden, oder die Ergebnisse zusammenfassen. In anderen Fällen möchten Sie nur bestimmte Zeilen oder Spalten einer Frage verarbeiten (z. B. um die Zeilen- oder Spaltensummen abzurufen und sie in der Datenbank zu speichern). Diese reservierten Variablen machen diesen Prozess relativ schmerzlos.


"This" Variable

Die Variable „this“ wird ausschließlich innerhalb der Optionen „Gleichung zur Validierung ganzer Fragen“ und „Validierungsgleichung für Teilfragen“ verwendet (letztere ist nicht über GU möglich). Es wird auf die Variablennamen jeder Zelle innerhalb dieser Fragen erweitert. Wenn Sie also sicherstellen möchten, dass jeder Eintrag größer als drei ist, setzen Sie die „Unterfragevalidierungsgleichung“ auf (this > 3).


"Self" Variable

Die Variablen „self“ und „that“ sind leistungsfähiger und dienen als Makros, die vor der Verarbeitung von Gleichungen erweitert werden. Die Syntaxoptionen für die Variable „self“ sind:

  • self
  • self.suffix
  • self.sub-selector
  • self.sub- Selektor.Suffix
  1. Suffix ist eines der normalen Qcode-Suffixe (z. B. NAOK, Wert, angezeigt).
  1. Unterselektor kann einer der folgenden sein:
  • Kommentare – nur Unterfragen, die Kommentare sind (z. B. Multiple Choice mit Kommentar und Liste mit Kommentar);
  • nocomments – nur Unterfragen, die keine Kommentare sind;
  • sq_X – wobei X ein Zeilen- oder Spaltenbezeichner ist. Es werden nur Unterfragen ausgewählt, die mit Muster X übereinstimmen. Beachten Sie, dass die Suche nach der vollständigen Code-ID erfolgt, dann sq_X zutrifft und die Unterfragen nX. Achten Sie auf den Fragetyp mit zwei Skalen, bei dem die Unterfragencodes QCODE_SQCODE_1 und QCODE_SQCODE_1 sind, und auf den Fragetyp mit der Rangfolge, bei dem die Unterfragencodes QCODE_1, QCODE_2 ... sind.

Beispiele:

  • Wurde ein Teil einer Frage beantwortet? -> {count(self.NAOK)>0}
  • Wie hoch ist die Bewertungspunktzahl für diese Frage? -> {sum(self.value)}

Sie können diese auch verwenden, um Zeilen- und Spaltensummen zu erhalten. Angenommen, Sie haben ein Zahlenarray mit den Zeilen AE und den Spalten 1–5.

  • Wie hoch ist die Gesamtsumme? -> {sum(self.NAOK)}
  • Wie hoch ist die Summe von Zeile B? -> {sum(self.sq_B.NAOK)}
  • Wie hoch ist die Summe von Spalte 3? -> {sum(self.sq_3.NAOK)}


"That" Variable

Die Variable „that“ ist wie die Variable „self“, ermöglicht Ihnen jedoch die Bezugnahme auf andere Fragen. Seine Syntax ist:

  • that.qname
  • that.qname.suffix
  • that.qname.sub-selector
  • that.qname.sub-selector.suffix

„qname“ ist der Fragename ohne Unterfrageerweiterungen. Erstellen wir also eine Frage „q1“, wobei „q“ auch ihren „qnamen“ darstellt.

Beispiele:

  • Wurde ein Teil der Frage q1 beantwortet? -> {count(that.q1.NAOK)>0}
  • Wie hoch ist die Bewertungspunktzahl für q2? -> {sum(that.q2.NAOK)}
  • Was ist die Gesamtsumme von q3? -> {sum(that.q3.NAOK)}
  • Wie hoch ist die Summe der Zeile C in q4? -> {sum(that.q4.sq_C.NAOK)}
  • Wie hoch ist die Summe von Spalte 2 in q4? -> {sum(that.q4.sq_2.NAOK)}

Die Variablen „self“ und „that“ können für jede Relevanz, Validierung oder Anpassung verwendet werden.

Die einzige Einschränkung besteht darin, dass bei Verwendung der Funktion Logikdatei anzeigen der erweiterte Wert von „self“ und „that“ angezeigt wird. Dadurch können Sie die tatsächliche Gleichung sehen, die generiert wird, sodass Sie (und der EM) überprüfen können, ob die Variablen vorhanden sind oder nicht. Dies kann verwirrend erscheinen, da Sie möglicherweise recht lange Gleichungen sehen. Wenn Sie jedoch die Frage bearbeiten, sehen Sie die ursprüngliche Gleichung mit „self“ und/oder „that“.

Template:Hinweis

Zugriff auf Funktionen

Das ExpressionScript bietet Zugriff auf mathematische, Zeichenfolgen- und benutzerdefinierte Funktionen, wie unten gezeigt. Für diese Funktionen gibt es PHP- und JavaScript-Äquivalente, sodass sie auf der Serverseite (PHP) und auf der Clientseite (JavaScript) identisch funktionieren. Es ist einfach, neue Funktionen hinzuzufügen.


Implementierte Funktionen

Folgende Funktionen stehen derzeit zur Verfügung:

Function Meaning Syntax
abs Absolute value number abs(number)
acos Arc cosine number acos(number)
addslashes Quote string with slashes string addslashes(string)
asin Arc sine number asin(number)
atan Arc tangent number atan(number)
atan2 Arc tangent of two variables number atan2(number, number)
ceil Round fractions up number ceil(number)
checkdate Returns true(1) if it is a valid date in gregorian calendar bool checkdate(month,day,year)
convert_value Convert a numerical value using a inputTable and outputTable of numerical values number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList)
cos Cosine number cos(number)
count count the number of answered (non-blank) questions in the list number count(arg1, arg12, ..., argN)
countif Count the number of answered questions in the list equal to the first argument number countif(matches, arg1, arg2, ... argN)
countifop Count the number of answered questions in the list which pass the criteria (arg op value) number countifop(op, value, arg1, arg2, ... argN)
date Format a local date/time string date(format [, timestamp=time()])
exp Calculates the exponent of e number exp(number)
fixnum Display numbers with comma as radix separator, if needed string fixnum(number)
floor Round fractions down number floor(number)
gmdate Format a GMT date/time string gmdate(format [, timestamp=time()])
html_entity_decode Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8) string html_entity_decode(string)
htmlentities Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8) string htmlentities(string)
expr_mgr_htmlspecialchars Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8) string htmlspecialchars(string)
expr_mgr_htmlspecialchars_decode Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8) string htmlspecialchars_decode(string)
idate Format a local time/date as integer string idate(string [, timestamp=time()])
if Excel-style if(test,result_if_true,result_if_false) if(test,result_if_true,result_if_false)
implode Join array elements with a string string implode(glue,arg1,arg2,...,argN)
intval Get the integer value of a variable int intval(number [, base=10])
is_empty Determine whether a variable is considered to be empty bool is_empty(var)
is_float Finds whether the type of a variable is float bool is_float(var)
is_int Find whether the type of a variable is integer bool is_int(var)
is_nan Finds whether a value is not a number bool is_nan(var)
is_null Finds whether a variable is NULL bool is_null(var)
is_numeric Finds whether a variable is a number or a numeric string bool is_numeric(var)
is_string Find whether the type of a variable is string bool is_string(var)
join (New in 2.0 build 130129) Join elements as a new string join(arg1, arg2, ... argN)
list Return comma-separated list of non-blank values string list(arg1, arg2, ... argN)
listifop (New in 3.16.1 ) Return a 'glue'-separated list of the specified question property (retProp) from questions in the list which pass the criteria (cmpProp op value) string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN)
ltrim Strip whitespace (or other characters) from the beginning of a string string ltrim(string [, charlist])
max Find highest value number max(arg1, arg2, ... argN)
min Find lowest value number min(arg1, arg2, ... argN)
mktime Get UNIX timestamp for a date (each of the 6 arguments are optional) number mktime([hour [, minute [, second [, month [, day [, year ]]]]]])
modulo-function The modulo function is not supported yet. You can use the floor() function instead floor(x/y)==(x/y)
nl2br Inserts HTML line breaks before all newlines in a string string nl2br(string)
number_format Format a number with grouped thousands string number_format(number)
pi Get value of pi number pi()
pow Exponential expression number pow(base, exp)
quoted_printable_decode Convert a quoted-printable string to an 8 bit string string quoted_printable_decode(string)
quoted_printable_encode Convert a 8 bit string to a quoted-printable string string quoted_printable_encode(string)
quotemeta Quote meta characters string quotemeta(string)
rand Generate a random integer, see this example int rand() OR int rand(min, max)
regexMatch compare a string to a regular expression bool regexMatch(pattern,input)
round Rounds a number to an optional precision number round(val [, precision])
rtrim Strip whitespace (or other characters) from the end of a string string rtrim(string [, charlist])
sin Sine number sin(arg)
sprintf Return a formatted string string sprintf(format, arg1, arg2, ... argN)
sqrt Square root number sqrt(arg)
stddev Calculate the Sample Standard Deviation for the list of numbers number stddev(arg1, arg2, ... argN)
str_pad Pad a string to a certain length with another string string str_pad(input, pad_length [, pad_string])
str_repeat Repeat a string string str_repeat(input, multiplier)
str_replace Replace all occurrences of the search string with the replacement string string str_replace(search, replace, subject)
strcasecmp Binary safe case-insensitive string comparison int strcasecmp(str1, str2)
strcmp Binary safe string comparison int strcmp(str1, str2)
strip_tags Strip HTML and PHP tags from a string string strip_tags(str, allowable_tags)
stripos Find position of first occurrence of a case-insensitive unicode string (starting by 0, return false if not found) int stripos(haystack, needle [, offset=0])
stripslashes Un-quotes a quoted string string stripslashes(string)
stristr Case-insensitive strstr string stristr(haystack, needle [, before_needle=false])
strlen Get string length int strlen(string)
strpos Find position of first occurrence of an unicode string (starting by 0, return false if not found) int strpos(haystack, needle [ offset=0])
strrev Reverse a string string strrev(string)
strstr Find first occurrence of a string string strstr(haystack, needle[, before_needle=false])
strtolower Make a string lowercase string strtolower(string)
strtotime Parse about any English textual datetime description into a Unix timestamp int strtotime(string)
strtoupper Make a string uppercase string strtoupper(string)
substr Return part of an unicode string string substr(string, start [, length])
sum Calculate the sum of values in an array number sum(arg1, arg2, ... argN)
sumifop Sum the values of answered questions in the list which pass the criteria (arg op value) number sumifop(op, value, arg1, arg2, ... argN)
tan Tangent number tan(arg)
time Return current UNIX timestamp number time()
trim Strip whitespace (or other characters) from the beginning and end of a string string trim(string [, charlist])
ucwords Uppercase the first character of each word in a string string ucwords(string)
unique Returns true if all non-empty responses are unique boolean unique(arg1, ..., argN)

Template:Hinweis

Erstellen Sie neue Ausdrucksfunktionen mit dem Plugin (New in 4.0.0 )

Wenn Sie eine neue Funktion benötigen, die im Kern nicht vorhanden ist, können Sie eine mit einem Plugin erstellen. Eine solche neue Funktion wird mit dem Ereignis expressionManagerStart erstellt.

ExpressionScript weiß, welche Variablen lokal sind

Um das JavaScript für eine Seite korrekt zu erstellen, muss EM wissen, welche Variablen auf der Seite gesetzt sind und wie ihre JavaScript-ID lautet (z. B. für document.getElementById(x)). Außerdem muss EM wissen, welche Variablen auf anderen Seiten gesetzt sind (damit es sicherstellen kann, dass die benötigten <input type='hidden' value='x'> Felder vorhanden und ausgefüllt sind).


Kaskadierende Bedingungen

Wenn eine der Variablen irrelevant ist, ist die gesamte Gleichung irrelevant (falsch). In der folgenden Tabelle bedeutet beispielsweise N/A, dass eine der Variablen nicht relevant war:


Operator Beispiel a b Ergebnis
+ (unär) +a N/A false
! !a N/A false
== (oder Gleichung) a == b N/A 5 false
== (oder Gleichung) a == b N/A 0 false
== (oder Gleichung) a == b N/A N/A false
!= (oder ne) a != b N/A 5 false
!= (oder ne) a != b N/A N/A false
!= (oder ne) a != b N/A 0 false
> (oder gt) a > b N/A 5 false
>= (oder ge) a >= b N/A 5 false
< (oder lt) a < b N/A 5 false
<= (oder le) a <= b N/A 5 false
und a und b N/A 5 falsch
und a und b N/A N/A - oder a oder b N/A N/A false
or a oder b N/A 5 false
+ a + b N/A 5 falsch
* a * b N/A 5 false
/ a / b 5 N/A false
(exp) (a && b) N/A 5 false
|(b + b) > (a && b) N/A 5 false
function sum(a,b,b) N/A 5 false
function max(a,b) N/A 5 false
function min(a,b ) N/A 5 false
function implode(', ',a,b,a,b) N/A 5 - function if(a,a,b) N/A 5 false
function is_empty(a) N/ A false
function is_empty(a) 0 (oder leer) true
function !is_empty(a) N/A false


Überschreiben kaskadierender Bedingungen

Angenommen, Sie möchten eine laufende Summe aller relevanten Antworten anzeigen. Sie könnten versuchen, die Gleichung {sum(q1,q2,q3,...,qN)} zu verwenden. Dies wird jedoch intern übersetzt in LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2") ,LEMval("q3"),...,LEMval("qN"))). Wenn also einer der Werte q1-qN irrelevant ist, gibt die Gleichung immer „falsch“ zurück. In diesem Fall zeigt sum() „0“ an, bis alle Fragen beantwortet sind.

Um dies zu umgehen, kann jeder Variablen das Suffix „.NAOK“ hinzugefügt werden (was bedeutet, dass „Nicht anwendbar“ in Ordnung ist). In solchen Fällen tritt das folgende Verhalten auf. Angenommen, Sie haben eine Variable q1.NAOK:

  1. q1 wurde nicht zur LEManyNA()-Klausel hinzugefügt
  2. LEMval('q1') prüft weiterhin, ob die Antwort relevant ist, und gibt sie zurück „“ Wenn dies nicht der Fall ist (so werden einzelne irrelevante Antworten ignoriert, aber nicht der gesamte Ausdruck ungültig).

Die Lösung des laufenden Summenproblems besteht also darin, die Gleichung 'sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK) zu verwenden.

Durch die Verwendung des Suffixes .NAOK können Autoren auch Umfragen entwerfen, die mehrere mögliche Pfade haben, sich aber später auf gemeinsame Pfade konzentrieren. Angenommen, Probanden beantworten eine Umfrage auf eine Art und Weise, die außerhalb des normalen Antwortbereichs liegt. Der Autor könnte die Probanden darauf aufmerksam machen, dass sie möglicherweise keine gültigen Ergebnisse erhalten, und sie fragen, ob sie die Umfrage wirklich fortsetzen möchten. Wenn sie „Ja“ sagen, werden die restlichen Fragen angezeigt. Die Bedingung für die „restlichen Fragen“ würde prüfen, ob die ersten Antworten innerhalb des normalen Bereichs beantwortet wurden ODER ob die Testperson die Frage mit „Ja“ beantwortet hat, die nur dann relevant ist, wenn sie außerhalb des normalen Bereichs geantwortet hat.

Wie unterstützt ExpressionScript bedingtes Micro-Tailoring?

Hier ist ein Beispiel für Micro-Tailoring (wobei Question Type=='expr' eine Gleichung bedeutet):


Fragecode Relevanz Fragetyp Frage
Name 1 Text Wie heißt du?
badage !is_empty(age) expr {(age<16) or (age>80 )}
agestop badage message Tut mir leid, {Name}, du bist zu {if( (Alter<16),'young',if( (Alter>80), 'alt', 'mittleren Alters') ) } für diesen Test.
Kinder !badage janein Haben Sie Kinder?
Eltern 1 expr {!badage && kids=='Y'}
numKids parents text Wie viele Kinder haben Sie?
kid2 parents && numKids >= 2 text Wie alt ist Ihr zweites Kind?
kid3 parents && numKids >= 3 text Wie alt ist Ihr drittes Kind?
kid4 parents && numKids > = 4 text Wie alt ist Ihr viertes Kind?
kid5 parents && numKids >= 5 text Wie alt ist Ihr fünftes Kind?
report |text {name}, Sie sagten, Sie seien {age} und hätten {numKids}. Das Gesamtalter Ihrer ersten {min(numKids,5)} Kinder beträgt {sumage}


Um das obige Umfragebeispiel herunterzuladen, klicken Sie auf den folgenden Link: Beispiel für eine Umfrage zur Anzahl der Kinder.

Alle diese Fragen können auf einer einzigen Seite (z. B. in derselben Gruppe) stehen und nur die relevanten Fragen werden angezeigt. Darüber hinaus wird der sum()-Ausdruck in der letzten Frage dynamisch aktualisiert, wenn Sie das Alter der Kinder eingeben.

ExpressionScript stellt diese Funktionalität bereit, indem es jeden Ausdruck mit einem Namen umgibtElement. Jedes Mal, wenn sich ein Wert ändert, wird der Ausdruck neu berechnet, der in dem <span>Element erscheinen sollte und generiert die Anzeige neu. Sie können Dutzende oder sogar Hunderte solcher maßgeschneiderter Ausdrücke auf derselben Seite haben.


Syntaxhervorhebung

Um die Eingabe und Validierung von Ausdrücken zu erleichtern, bietet das EM eine Syntaxhervorhebung mit den folgenden Funktionen:

Typen und Bedeutungen der Syntaxhervorhebung

Farbe Beispiel Bedeutung Tooltip Kommentare
tan background Sample the ganze Gleichung keine Alles in geschweiften Klammern, das als Gleichung erkannt wird (z. B. gibt es keine führenden oder nachgestellten Leerzeichen), wird farblich mit einem hellbraunen Hintergrund versehen, um es besser vom umgebenden Text unterscheiden zu können.
fetter roter Text Sample Ein Fehler Einige Erklärung zum Fehler Kann eine unbekannte Variable oder ein Fehler in der Funktion sein. Die Umfrage ist unterbrochen und die Fragen, die auf dem entsprechenden Ausdruck basieren, werden den Befragten nicht angezeigt.
blue text Beispiel Funktionsname Bedeutung und zulässige Syntax Es bezieht sich auf Funktionsnamen oder Dinge, die Funktionen sein sollten, da ihnen eine offene Klammer folgt. Sie werden in fetter blauer Schrift angezeigt. Tooltips zeigen die Bedeutung und zulässige Syntax für die Funktion.
grey text Sample string none Einfache und doppelte Anführungszeichen werden in grauem Text angezeigt.
cyanfarbener Text Beispiel Variablensatz auf derselben Seite, [ Name oder SGQA-Code]: Frage; Wert; Antwortliste mit Codes für jeden Wert Jede Variable, die auf derselben Seite wie die Frage, die Sie gerade bearbeiten, festgelegt ist, wird in cyanfarbenem Text angezeigt (sie kann in Javascript aktualisiert werden). Der Tooltip zeigt seinen Namen (wenn Sie INSERTANS:xxx verwendet haben) oder seinen SGQA-Code (wenn Sie das neue Benennungssystem verwendet haben), die eigentliche Frage und ihren aktuellen Wert (oder leer, wenn nicht festgelegt). Wenn der Fragetyp Antworten von einem Aufzählungswertesatz erwartet, wird die Zuordnung der Codes zu Anzeigewerten angezeigt.
green text Beispiel Variablensatz auf einer vorherigen Seite [ Name oder SGQA-Code]: Frage; Wert; Antwortliste mit Codes für jeden Wert Jede Variable, die auf einer vorherigen Seite festgelegt wurde, wird in fettem grünem Text angezeigt. Der Tooltip zeigt seinen Namen (wenn Sie INSERTANS:xxx verwendet haben) oder den SGQA-Code (wenn Sie das neue Benennungssystem verwendet haben), die eigentliche Frage und ihren aktuellen Wert (oder leer, wenn nicht festgelegt). Wenn der Fragetyp Antworten von einem Aufzählungswertesatz erwartet, wird die Zuordnung der Codes zu Anzeigewerten angezeigt.
bold pink text Sample Variable wird auf einer späteren Seite festgelegt , im Allgemeinen: zu Beginn der Umfrage leer, kann aber mit einem Index gefüllt oder nach vorne verschoben werden [ Name oder SGQA-Code]: Frage; Wert; Antwortliste mit Codes für jeden Wert Jede Variable, die auf einer vorherigen Seite festgelegt wurde, wird in fettem rosa Text angezeigt. Der Tooltip zeigt seinen Namen (wenn Sie INSERTANS:xxx verwendet haben) oder den SGQA-Code (wenn Sie das neue Benennungssystem verwendet haben), die eigentliche Frage und ihren aktuellen Wert (oder leer, wenn nicht festgelegt). Wenn der Fragetyp Antworten von einem Aufzählungswertesatz erwartet, wird die Zuordnung der Codes zu Anzeigewerten angezeigt.
bold tan text Beispiel ein Lime-Ersatzwert der Wert Lime-Ersatzzeichenfolgen (wie {TOKEN:xxx}, {PRIVACY_MESSAGE}) werden in fettem hellbraunem Text angezeigt.
roter Text Beispiel Zuweisungsoperator (=) Warnmeldung Wenn Sie einen der Zuweisungsoperatoren (=) verwenden, wird dieser Operator in rotem Text angezeigt. Dies soll dazu beitragen, eine versehentliche Neuzuweisung von Werten zu verhindern, wenn Sie eigentlich prüfen wollten, ob a == b, anstatt den Wert von a = b festzulegen.
normaler schwarzer Text Sample Interpunktion none Alle anderen Interpunktionszeichen innerhalb des Ausdrucks werden als normaler schwarzer Text angezeigt.
Eine fette rote Linie umgibt den Fehler. Syntaxfehler und die Beschreibung des Fehlers werden in roten Kästen angezeigt. Der Tooltip zeigt den Fehler an. Beispiele hierfür sind nicht übereinstimmende Klammern, die Verwendung von undefinierten Funktionen, die Übergabe der falschen Anzahl von Argumenten an Funktionen, schlecht strukturierte Ausdrücke (z. B. fehlende Operatoren zwischen Variablen), der Versuch, einer schreibgeschützten Variablen einen neuen Wert zuzuweisen, der Versuch, Nicht-Variablen Werte zuzuweisen oder die Verwendung einer nicht unterstützten Syntax. Beachten Sie, dass das System zur Erkennung von Syntaxfehlern möglicherweise nur einen Fehler in einem Ausdruck meldet, auch wenn mehrere Fehler vorhanden sind; wenn jedoch mehrere Fehler erkannt werden, wird mindestens ein Fehler angezeigt.


Template:Hinweis


Zusätzliche Lektüre

ExpressionScript-Beispielumfragen

Anwendungsfälle und Anleitungen

Schritt-für-Schritt-Beispiele

Referenz für Entwickler

RoadMap, Status, ToDo-Liste