Fragen im Q. Skript werden einfach aneinandergereiht. Die Reihenfolge der Fragen ist hierbei nebensächlich, da die Abfolge im Fragebogen durch Screens und Blöcke festgelegt wird. Folgende Standardfragetypen sind in Q. verfügbar:
-
TextQ
Anzeige eines Textes
-
SingleQ
Geschlossene Frage mit einer Antwortmöglichkeit
-
MultiQ
Geschlossene Frage mit mehreren Antwortmöglichkeiten
-
OpenQ
Offene Frage mit Eingabe für Freitext
-
PasswdQ
Offene Frage mit Eingabe für Freitext (verdeckt durch Punkte)
-
NumQ
Nummerische Eingabe mit einer oder mehr Eingabemöglichkeiten
-
SingleGridQ
Mehrere SingleQs in Tabellendarstellung kombiniert
-
MultiGridQ
Mehrere MultiQs in Tabellendarstellung kombiniert
Die Eigenschaften oder Attribute einer Frage unterscheiden sich von Fragetyp zu Fragetyp. Allerdings gibt es einige, die allen Fragen gemein sind. Das folgende Listing greift inhaltlich etwas voraus, fasst aber kurz zusammen, welche Attribute sich grundsätzlich für jede Fragedefinition anwenden lassen.
Fragetyp NAME; Text = "TEXT"; Title = "TITLE"; LABELLIST Javascript = "JAVASCRIPT"; Css = "CSS"; SortId = "SORTID"; HtmlPreText = "HTMLPRETEXT"; HtmlPostText = "HTMLPOSTTEXT"; PreHelptext = "PREHELPTEXT"; PostHelptext = "POSTHELPTEXT"; PreInterviewerHelptext = "PREINTERVIEWERHELPTEXT"; PostInterviewerHelptext = "POSTINTERVIEWERHELPTEXT"; InitActionBlock = { ... }; ContinueActionBlock = { ... }; ShowMaxLabels = NUMBER; Nomissing = YES/NO; Flt = BEDINGUNG; Assert BEDINGUNG "Fehlertext bei Verstoß";
NAME
Der Name einer Frage muss mit einem Buchstaben (a-z oder A-Z) beginnen. Außerdem darf der Name der Frage, des Blocks („ Blöcke “) oder des Screens (Kapitel 7, Screens ) in einer Umfrage nur einmal vergeben werden. Doppelte Namensgebung führt zu Fehlermeldungen in der Syntaxüberprüfung. Punkte in Namen sind grundsätzlich nicht erlaubt. Zusätzlich gibt es eine Blacklist mit reservierten Namen, die nicht verwendet werden sollten. Die Syntaxüberprüfung meldet einen Fehler, falls ein Name der Blacklist verwendet wurde.
SingleQ f1;
Text
Wird üblicherweise für den Fragetext verwendet. Jede Frage kann mit einem Text versehen werden, wobei auf einem Screen (zusammengesetzt aus mehreren Fragen) immer nur ein Text sichtbar ist.
Screen
verfügt selbst über das Text-Attribut, wenn es aber nicht verwendet wird, nutzt der Screen den Text seiner ersten enthaltenen Frage. An welcher Stelle der Fragetext erscheint, hängt von der Positionierung von@qtext
im Template der Umfrage („Platzhalter“) ab.text = "Wie alt sind Sie?";
Title
Wird üblicherweise für ergänzende Hinweise verwendet und erscheint immer direkt über den Antwortmöglichkeiten.
title = "Mehrfachauswahl";
LABELLIST
Siehe „ Antwortlabel “.
Javascript
Platziert direkt hinter den Antwortmöglichkeiten der Fragen Javascript Code, der beim Generieren einer Sprachquelle nicht berücksichtigt wird.
javascript = "alert('Ich lebe!');";
Css
Platziert direkt hinter den Antwortmöglichkeiten der Fragen CSS Angaben, die beim Generieren einer Sprachquelle nicht berücksichtigt werden (s. a. „CSS der Frage mitgeben“).
css = ".qtable{ border: 2px solid red; }";
SortId
Fügt der Frage eine Sort-Id hinzu, über die sie innerhalb eines Blocks sortiert werden kann.
SortId = "F1";
HtmlPreText
Fügt noch vor
title
einen zusätzlichen Text ein. Voraussetzung hierfür ist, dass der HTML ParameterwritePreText
gesetzt ist, siehe „HTML-Parameter“.HtmlPreText = "Noch ein Text vor dem text-Attribut.";
HtmlPostText
Fügt hinter den Antwortmöglichkeiten der Frage einen zusätzlichen Text ein. Voraussetzung hierfür ist, dass der HTML Parameter
writePostText
gesetzt ist, siehe „HTML-Parameter“.HtmlPreText = "Ein Text hinter dem text-Attribut.";
PreHelptext
Fügt vor
text
einen Hilfetext ein. Voraussetzung hierfür ist, dass der Skript ParametershowHelptext
gesetzt ist, siehe „Skriptparameter“.PreHelptext = "Hilfestellung zum Ausfüllen der Frage.";
PostHelptext
Fügt hinter
text
einen Hilfetext ein. Voraussetzung hierfür ist, dass der Skript ParametershowHelptext
gesetzt ist, siehe „Skriptparameter“.PostHelptext = "Mehr Hilfestellung zum Ausfüllen der Frage.";
PreInterviewerHelptext
Fügt vor
text
einen Text ein, der für Intervieweranweisungen vorgesehen ist ein. Voraussetzung hierfür ist, dass der Skript ParametershowInterviewerHelptext
gesetzt ist, siehe „Skriptparameter“.PreInterviewerHelptext = "Anweisungen zum Vorlesen der Frage.";
PostInterviewerHelptext
Fügt hinter
text
einen Text ein, der für Intervieweranweisungen vorgesehen ist ein. Voraussetzung hierfür ist, dass der Skript ParametershowInterviewerHelptext
gesetzt ist, siehe „Skriptparameter“.PostInterviewerHelptext = "Mehr Anweisungen zum Vorlesen der Frage.";
InitActionBlock
Zum Ausführen von Anwendungslogik vor Darstellung der Frage. Siehe Kapitel 14, Action-Befehle und -Blöcke.
ContinueActionBlock
Zum Ausführen von Anwendungslogik nach Beantwortung der Frage. Siehe Kapitel 14, Action-Befehle und -Blöcke.
Flt
Filterbedingung, die besagt, ob die Frage dargestellt oder übersprungen werden soll, wenn der Teilnehmer bei ihr angekommen ist. Ausführliche Beschreibungen von Filtern gibt es in Kapitel 10, Filter- und Plausibilitätsbedingungen.
flt = (f1 eq 1); // darstellen, wenn Frage f1 Antwort 1 enthält
ShowMaxLabels
Möglichkeit, die maximale Anzahl der angezeigten Labels einer Frage einzuschränken. Dies kann z.B. sinnvoll sein, wenn eine Liste von N Labels randomisiert angezeigt werden soll, aber davon jeweils immer nur zufällig ausgewählt die ersten K Stück.
ShowMaxLabels
funktioniert bei Single(Grid)Qs, Multi(Grid)Qs sowie NumQs.ShowMaxLabels = K;
SingleQ f1; Text="TEXT"; labels= 1 "Label 1" random 2 "Label 2" random 3 "Label 3" random 4 "Label 4" random 5 "Label 5" random 6 "Label 6" random ; ShowMaxLabels = 3;
Durch die Rotation verknüpft mit dem
ShowMaxLabels
-Befehl werden drei zufälligen Labels abgebildet.NoMissing
Der Eingabezwang für eine einzelne Frage kann mit diesem Befehl an- oder ausgestellt werden und ist höher priorisiert als
DefaultNoMissing
(siehe „Allgemeines“).NoMissing = Yes/No;
Assert
Überprüfung einer (Plausibilitäts-) Bedingung nach Beantwortung der Frage, die dazu führen kann, dass entweder die Frage unter Angabe einer Fehlermeldung erneut vorgelegt wird oder das gesamte Interview abgebrochen wird (ScreenOut). Ausführliche Beschreibungen zu Plausibilitätsbedingungen gibt es in Kapitel 10, Filter- und Plausibilitätsbedingungen.
assert (f1 eq 1) "Frage f1 wurde nicht mit 1 beantwortet" exit 2;
Eine SingleQ ermöglicht eine 1-aus-N Auswahl. Wie bei allen anderen Fragen auch, sind Fragetext und -titel optional. Antwortlabels sind hingegen zwingend erforderlich. Die Labeldefinition kann sehr komplex werden. Vollständige Ausführungen zu den Labels gibt es in „ Antwortlabel “.
Die SingleQ (und auch die MultiQ) gibt es mit unterschiedlichen Anordnungen,
die mit dem HTML-Skript-Parameter singleQFormat
umgeschaltet werden können:
standard
- Labels untereinander, Buttons linkstable
- Labels nebeneinander, Buttons untenselect
- Labels als aufklappbare Auswahlliste (nur SingleQ)
// HTML{ singleQFormat = standard; }; // HTML{ singleQFormat = table; }; HTML{ singleQFormat = select; }; SingleQ lieblingsmarke; Text = "Welche dieser Marken ist Ihre Lieblingsmarke?"; labels= 1 "Marke A" 2 "Marke B" 3 "Marke C" 4 "Keine davon" ;
Um den Antwort-Code zu speichern, verwendet Q. den
Namen der Frage als Variablennamen. In diesem
Beispiel wäre bei der Auswahl »Marke C« der Wert 3
in der Variablen lieblingsmarke
gespeichert.
"lieblingsmarke" "3"
Weiterhin lassen sich SingleQs mit @insert(select FRAGENAME)
auch als Auswahlliste an beliebigen Stellen in Textbereichen einbetten.
Sie müssen hierzu, ohne selbst als Frage dargestellt zu werden, mit im
jeweiligen Screen positioniert sein. Beispiel:
HTML { input=no; }; singleq sonstige; labels= 1 "Sonstige Variante A" 2 "Sonstige Variante B" ; HTML { input=yes; }; multiq hauptfrage; text="Welche Variante bevorzugen Sie?"; labels= 1 "Variante a" 2 "Variante b" 3 "Variante c" 9 "sonstige, bitte auswählen: @insert(select sonstige)" ; Screen scr = column(hauptfrage sonstige);
Details zum HTML Parameter input
finden sich in „HTML-Parameter“.
Die SingleQ kann auch eine Kombination aus Eingabefeld und Liste bieten und verkürzt die Liste durch eine inkrementelle Suche nach den bereits eingegebenen Zeichen.
HTML{ singleQFormat = select; }; SingleQ strassen; text="Bitte wählen Sie eine Straße..."; labels= 9999 "" 1 "Amselweg" 2 "Drosselgasse" 3 "Finkensteg" 4 "Meisenstraße" 5 "Fasanenweg" ; assert (strassen ne 9999) "Bitte wählen Sie aus."; javascript="$('.strassen .qselect').combobox();";
Zusätzlich muss HTML{
singleQClass="GSingleQ"; };
gesetzt sein,
was normalerweise in der Datei
gbuttons.q
im
text
-Verzeichnis erfolgt.
Eine weitere Möglichkeit besteht darin, durch die möglichen Werte zu scrollen. Der Name der Javascript-Funktion, die diesen Mechanismus bereit stellt, bezieht sich zwar auf das Mausrad, aber es funktioniert genauso gut mit dem Finger auf dem Tablet.
HTML{ singleQFormat = select; }; singleq stunde; labels = 99 "Std" 1 "1" // ... 23 "23" 24 "24" ; javascript=" createWheelSelector($('.stunde .qselect'), 60, './media/@insert(_surveyname)/scrollerimages/'); "; assert (stunde ne 99) "Bitte die Stunde wählen."; // createWheelSelector(SELECTBOX, WIDTH-IN-PX, PATH-TO-LAYOUT-IMAGES);
Der Funktionsaufruf createWheelSelector bekommt
mehrere Parameter mitgeliefert. Zum einen muss der
Fragen- bzw. Variablenname als CSS-Klassenname
mitgegeben werden (hier: ».stunde«). An zweiter
Stelle steht im Funktionsaufruf die Breite in Pixeln
(hier: 60) und zuletzt erhält die Funktion den Pfad
zu den grafischen Elementen. Die Vorlagen für die
grafischen Elemente finden sich im Verzeichnis
root/media/demo_singleq_select/scrollerimages
.
Die grafischen Elemente sind notwendig, weil sie
hervorheben, welcher Wert gewählt wurde.
Neben der SingleQ stellt die MultiQ ein syntaktisch
identisches Gegenstück dar, welches eine N-aus-M
Auswahl ermöglicht. Der HTML-Skript-Parameter
singleQFormat
schaltet, abgesehen
von der Option select
auch die
Anordnung einer MultiQ um, siehe auch „
SingleQ
“.
MultiQ lieblingsmarken; Text = "Welche dieser Marken kennen Sie?" labels= 1 "Marke A" 2 "Marke B" 3 "Marke C" 4 "Keine davon" single ;
Q. speichert die Eingabe in einem Array mit den Codes der Auswahl (in der Reihenhfolge, in der die Auswahl getroffen wurde) und trägt für die nicht ausgewählten Label den Missing-Wert ein. Wenn der Klick auf "Marke C" vor dem Klick auf "Marke B" erfolgte, speichert Q (bei einem Missing-Wert von 99):
"lieblingsmarken" "3 2 99 99"
Dabei spielt es keine Rolle wie häufig die Auswahl getroffen und zurück genommen wurde, Q. speichert die zuletzt getroffene Auswahl.
Bei der Abfrage der Variablen ergibt sich ein
wesentlicher Unterschied zur SingleQ. Da die Variable
einer SingleQ nur einen Wert speichert, können
Bedingungen für Filter oder Plausibilitätsprüfungen
mittels assert mit dem Gleichheitsoperator
eq
arbeiten. MultiQ-Fragen
speichern dagegen mehrere Werte, und so ist eine mit
eq
formulierte Prüfung nur bedingt
sinnvoll. Mit dem obigen Beispiel der Werte »3 2 99
99« für die Variable »lieblingsmarke«, liefe
flt=( lieblingsmarke eq 2 ) changepbar(1);
ins Leere, auch wenn »2« zur Ergebnismenge gehört (der
Filter funktionierte nur, wenn die Menge nur aus »2«
und missing-Werten bestünde). Daher sollte bei einer
MultiQ zur Prüfung in
verwendet werden:
flt=( 2 in lieblingsmarke ) changepbar(1);
Bei einer offenen Frage erscheint an Stelle von
Antwortlabels ein Eingabebereich für Freitext. Breite
und Höhe des Bereichs werden durch die
HTML-Skript-Parameter textAreaRows
(Anzahl der Zeilen) und
textAreaCols
(Spalten) festgelegt.
Wünscht man nur eine Zeile, wird technisch aus der
Fläche automatisch eine Zeile. Zusätzlich und
vorrangig lässt sich der Eingabebereich auch über CSS
formatieren. Mehr dazu in „Grafische Formatierung und Layout“.
HTML{ textAreaRows = 4; }; HTML{ textAreaCols = 80; }; OpenQ likes; text = "Was gefällt Ihnen an dieser Marke besonders gut?";
Den eingegebenen Text der OpenQ speichert Q. in einer Zeichenkette:
"likes" "Design Verarbeitung"
Die Syntax entspricht der einer OpenQ, allerdings wird zur Darstellung ein Passwort-Feld (mit Punkten als Platzhalter für die Buchstaben) benutzt.
Eine TextQ ist genau genommen keine Frage, sondern
nur ein Textbildschirm. Die Syntax entspricht der
OpenQ, aber es wird kein Texteingabefeld
angezeigt. Eine TextQ kann einen Fragetext haben, einen Titel,
und den eigentlichen Text (dieser wird also
nicht zwingend im Fragetext
angegeben), das Schlüsselwort hierzu lautet screentext
.
Beispiel:
TextQ intervieweranweisung; Text = "Intervieweranweisung"; screenText="Lieber Interviewer, bitte tun Sie nun dieses und jenes!";
Eine NumQ bietet die Möglichkeit, einen oder mehrere
numerische Werte offen abzufragen (z.B. Alter,
Postleitzahl usw.). Jedes Label korrespondiert mit
einem Eingabefeld. Die erwartete Eingabe des Befragten
kann exakt gesteuert werden. Die Definition erfolgt
über das OpenNumFormat
.
Das Format schränkt die Eingabemöglichkeiten der Befragten bei einer NumQ ein.
OpenNumFormat NAME = VMIN VMAX NMIN NMAX WMIN WMAX [EXCL] "ERR";
Über NAME
wird das OpenNumformat
mit format
an einzelne Labels
gebunden. Es legt die Anzahl der Vorkommastellen
VMIN
bis VMAX
,
die Anzahl der Nachkommastellen
NMIN
bis NMAX
und den Wertebereich insgesamt WMIN
bis WMAX
fest. Optional kann ein
Wert für eine Enthaltungsoption
EXCL
außerhalb des eigentlichen
Wertebereichs bestimmt werden (s.u.). Verstößt die Eingabe
eines Befragten gegen diese Vorgaben, wird die
Fehlermeldung ERR
ausgegeben. Es
können auch negative Werte verwendet werden.
Vorzeichen (-/+) werden für die *MIN/*MAX-Werte nicht
mitgezählt. Gleiches gilt für Dezimaltrennzeichen.
Hier sind sowohl der Punkt als auch das Komma gültig
und gleichwertig. 1000er Trennzeichen werden nicht
unterstützt.
OpenNumFormat rating = 1 2 0 0 -10 10 "Bitte nur ganze Zahlen zwischen -10 und 10."; NumQ nq; Text="Bitte bewerten Sie alle Marken zwischen -10 und 10."; labels= 1 "Marke A" format rating 2 "Marke B" format rating 3 "Marke C" format rating ;
Das eigentliche Eingabefeld der NumQ kann innerhalb
des Labeltextes mit @input
beliebig
platziert werden, etwa mitten im Textfluss. Im
weiteren Skriptverlauf lässt sich ein eingegebener
Wert mit FRAGENAME.LABELCODE
verwenden. Die direkte Referenz auf
FRAGENAME
liefert die Summe aller
Eingaben zurück.
NumQ nq; Text="Bitte bewerten Sie alle Marken zwischen -10 und 10."; labels= 1 "Für Marke A vergebe ich @input Punkte" format rating 2 "Für Marke B vergebe ich @input Punkte" format rating 3 "Für Marke C vergebe ich @input Punkte" format rating ; assert(nq gt 0) "Bitte mehr Plus- als Minuspunkte vergeben"; assert(nq.1 lt 0 or nq.2 lt 0 or nq.3 lt 0) "Mindestens einmal negativen Wert vergeben.";
Wie bei anderen Fragen auch, kann mit dem
Schlüsselwort open
in einer NumQ
auch ein offenes Eingabefeld als Label angeboten
werden. Mit @open
lässt sich auch
festlegen wo das Eingabefeld erscheinen soll.
NumQ nq; Text="Bitte bewerten Sie alle Marken zwischen -10 und 10."; labels= 1 "Für Marke A vergebe ich @input Punkte" format rating 2 "Für Marke B vergebe ich @input Punkte" format rating 3 "Für @open vergebe ich @input Punkte" open format rating ;
Die Eingabe einer NumQ speichert Q. immer in einem Array. Auch wenn mit einer NumQ nur ein Wert abgefragt wird, erscheint daher im Skriptcheck eine Mahnung, wenn die Variable nur summarisch über den Namen der Frage in einer Prüfung oder Bedingung verwendet wird, anstelle des genauen Variablennamens.
Opennumformat onf_sterne = 1 6 0 0 0 999999 "Verzählt!"; NumQ sterne; Text="Weißt du wieviel Sternlein stehen?"; labels= 1 "@input Sterne" format onf_sterne ;
Die Eingabe »367485« speichert Q. als
"sterne.1" "367485"
Ein Vergleich wie sterne gt 1000
funktioniert zwar, veranlasst aber die angesprochene
Mahnung im Skriptcheck. Besser wäre die Prüfung mit
sterne.1 gt 1000
. Bei den Eingaben
»3, -4, 7« im vorangegangenen Beispiel »Bitte bewerten
sie alle Marken« legte Q. die Werte in dieser Form ab:
"nq.1" "3" "nq.2" "-4" "nq.3" "7"
Mit der GNumQ existiert eine Variante der NumQ,
welche die oben angesprochene Option zur Enthaltung
ermöglicht. Dafür wird allerdings ein grafisches
Element benötigt, das sich nur einsetzen lässt, wenn
die Javascript-Bibliothek
gesstmpl.js
eingebunden ist.
Eine GNumQ
bietet alle
Eigenschaften der NumQ
und
erweitert diese um eine zusätzliche Funktion. Wird
die GNumQ
Klasse genutzt, kann
durch die Verwendung eines
OpenNumFormat
mit definierten
EXCL Feld
, eine
Enthaltungs-Eingabe zur GNumQ
hinzugefügt werden. Die Enthaltungs-Eingabe wird
durch einen grafischen Button hinter den Labels
angezeigt die mit dem entsprechenden
OpenNumFormat
deklariert wurden.
Zum Erstellen einer GNumQ
wird
über den HTML-Script-Parameter
numQClass
die Klasse der
NumQ
auf GNumQ
gesetzt. Das OpenNumFormat rating_EXCEL enthält
einen Wert für das optionale EXCL
Feld
. Wird nun das rating_EXCL Format für
ein Label verwendet enthält die grafische
Repräsentation der Frage einen Enthaltungs-Button
für das Label. Der Enthaltungstext wird über den
Script-Parameter noAnswerLabel
gesetzt. So kann mit verschiedenen
OpenNumFormats
gezielt für
einzelne Labels eine Enthaltungsoption hinzugefügt
werden.
HTML{ numQClass = "GNumQ"; }; noAnswerLabel= "Keine Angabe"; OpenNumFormat rating_EXCL = 1 2 0 0 -10 10 99 "Bitte nur ganze Zahlen zwischen -10 und 10."; OpenNumFormat rating = 1 2 0 0 -10 10 "Bitte nur ganze Zahlen zwischen -10 und 10."; NumQ nq; Text="Bitte bewerten Sie alle Marken zwischen -10 und 10."; labels= 1 "Marke A" format rating_EXCL 2 "Marke B" format rating_EXCL 3 "Marke C" format rating ;
Das grafische Element für die Enthaltung wird über
die HTML-Eigenschaften
unspecified_button_checked
und
unspecified_button_unchecked
mittels der Anweisung setProperty
festgelegt:
HTML{ setProperty( "unspecified_button_checked" "round_cl.png" ); }; HTML{ setProperty( "unspecified_button_unchecked" "round_ac.png" ); };
Mit einer SingleGridQ kann ein Gitter aus Skalen dargestellt werden, beispielsweise eine Liste von Items untereinander. Sowohl die gridItems als auch die Antwortkategorien gridLabels werden in Form von Label-Listen angegeben. Für jedes Item kann nur eine Antwortmöglichkeit ausgewählt werden. Es können auch mehrere Gruppen von Antwortlabels nebeneinander stehen. Die Zeile mit den Antwortlabels kann alle n Items wiederholt werden (sinnvoll bei langen Itemlisten).
Die allgemeine Syntax ist:
SingleGridQ name; Text="Fragetext"; gridItems= Wert Text ...; gridLabels= Wert Text ... ;
Es gibt verschiedene Varianten der SingleGridQ.
Es werden mehrere Items untereinander an der Seite
des Grids angezeigt. Rechts neben den Items
erscheinen die Antwortmöglichkeiten, die
Antwortlabels im Kopf des Grids. Oberhalb der
Antwortlabels können
gridLabelHeader
(Überschriften)
in die Tabelle eingefügt werden, sowie ein
anchorText
oben links in der
ansonsten leeren Zelle. Im Normalfall meldet Q. bei
einer unvollständig ausgefüllten Gridfrage nur einen
Fehler. Mit showAllErros;
lässt
sich jedoch auch einstellen, dass für jede
fehlerhafte Zeile im Grid ein Hinweis ausgegeben
wird.
Beispiel:
SingleGridQ standardgrid; text="Wie sehr stimmen Sie den folgenden Aussagen zu?"; gridItems= 1 "item 1" 2 "item 2" 3 "item 3" 4 "item 4" 5 "item 5" ; gridLabels= 1 "stimme voll und ganz zu" 2 "stimme eher zu" 3 "teils/teils" 4 "stimme eher nicht zu" 5 "stimme überhaupt nicht zu" ;
Bei der transponierten Grid-Frage befinden sich die Items im Kopf und die Labels an der Seite des Grids. Für jedes Item ist weiterhin nur eine Antwort möglich. Sie unterscheidet sich von einem bloßen Vertauschen von Item- und Kopf-Labels dadurch, dass die Fragen/Skalen sich nicht horizontal nebeneinander, sondern vertikal untereinander befinden.
Der einzige Unterschied zur normalen Gridfrage
besteht im Abschluss der tranponierten Version mit
dem Schlüsselwort transpose
.
Beispiel:
SingleGridQ transponiert; text="Wie wahrscheinlich werden Sie diese Städte besuchen?"; gridItems= 1 "Rom" 2 "Berlin" 3 "London" ; gridLabels= 1 "bestimmt nicht besuchen" 2 "wahrscheinlich nicht besuchen" 3 "weiß nicht" 4 "wahrscheinlich besuchen" 5 "ganz sicher besuchen" ; transpose; showAllErrors;
Wenn mehrere Fragen, die sich auf die gleichen Items
beziehen, nebeneinander dargestellt werden sollen,
wird eine zweite gridLabels-Definition eingefügt. In
Q. sprechen wir von einer weiteren Labelgruppe. Die Items
(also die Zeilen) werden mit dem Statement
gridItems
definiert, die Labels
für die erste Frage mit dem Label-Statement
gridLabels
, die Labels für die
zweite Frage (rechts neben der ersten) ebenfalls mit
gridLabels
usw..
Getrennte Überschriften zu den beiden Frageblöcken
werden mit dem Befehl
gridLabelHeader
erstellt. Sie
erscheinen in der obersten Zeile des Grids und
erstrecken sich über die Breite der
Antwortmöglichkeiten der Frage. Desweiteren kann in
der oberen linken Ecke des Grids durch den Befehl
anchorText
ein weiterer Text
eingefügt werden.
Beispiel:
SingleGridQ zweifragen; text="Bitte beurteilen Sie die genannten Städte."; gridItems= 1 "Rom" 2 "Berlin" 3 "London" ; gridLabels= 1 "gut" 2 "mittel" 3 "schlecht" ; gridLabels= 1 "ja" 2 "nein" ; gridLabelHeader=("Wie gefällt Ihnen die Stadt insgesamt?" "Haben Sie die Stadt schon einmal besucht?"); anchorText="Bitte beurteilen!";
Sowohl die SingleGridQ als auch die MultiGridQ setzen sich aus mehreren einzelnen SingleQs bzw. MultiQs zusammen, die separat mit systematisch generierten Namen in den Datensätzen abgelegt werden. Über diese Namen lassen sich die Werte der Variablen im Skript abfragen. Die Namen der Variablen setzen sich dabei wie folgt zusammen:
GRIDNAME.ITEMCODE.LABELGRUPPE
LABELGRUPPE
wird hierbei
beginnend mit 1 mit jeder zusätzlich definierten
Labelgruppe erhöht. Im letzten Beispiel,
SingleGridQ zweifragen
,
entspricht die Labelgruppe mit den
Antwortmöglichkeiten gut,
mittel und
schlecht der 1 und die Gruppe
mit ja und
nein der 2. Gibt es bei der
Fragedefinition nur eine Labelgruppe erhält diese
automatisch die 1.
Beispiele: Hat der Befragte bereits London besucht? (zweifragen.3.2 eq 1) Hat der Befragte London nicht besucht? (zweifragen.3.2 eq 2) Fand der Befragte Rom schlecht? (zweifragen.1.1 eq 3) Fand der Befragte Rom gut oder mittel? ([1 2] in zweifragen.1.1)
Ein etwas ausführlicheres Beispiel folgt im Abschnitt zur MultiGridQ (s. „ MultiGridQ “).
Eine SingleGridQ kann auch so dargestellt werden,
dass die gridItems auf beiden Seiten der Label
erscheinen. Die Texte in den gridItems werden dazu
durch ein |
getrennt. und die
Fragedefinition mit bipolar
abgeschlossen.
Beispiel:
SingleGridQ bipolar; text="Directionals"; gridItems= 1 "zu süss|zu sauer" 2 "zu weich|zu hart" 3 "zu billig|zu teuer" 4 "zu gross|zu klein" ; gridLabels= 1 "(1)" 2 "(2)" 3 "(3)" 4 "(4)" 5 "(5)" ; bipolar;
labelRepeat
Bei längeren Itemlisten kann die Zeile mit den Antwortmöglichkeiten beim Scrollen aus dem sichtbaren Bildschirmbereich rutschen. Mit dem Frageattribut
labelRepeat=K;
ist es möglich, sie alle K Zeilen in der Matrix zu wiederholen.labelRepeat = NUMBER;
repeatGridAnchor
passend zu dem Frageattribut
labelRepeat
ist es mitrepeatGridAnchor
möglich, auch denAnchorText
zu wiederholen. Dieser Befehl funktioniert nur im Zusammenhang mitlabelRepeat
und setzt einen definiertenAnchorText
voraus.repeatGridAnchor;
gridLabelFooter
analog zum
GridLabelHeader
kann auch eingridLabelFooter
eingefügt werden, der dann unter der Labelliste erscheint. Da GridQs auch mehrere Labellisten haben können, kann ein Footer pro Labelliste vergeben werden.gridLabelFooter = ("FOOTER1" "FOOTER2" "...");
gridLabelRestrict
filtert eine Labelliste, sodass nur noch die Labels (mit den Codes) dargestellt werden, die in der Wertemenge einer vorgegebenen Variablen (z.B. einer zuvor beantworteten Frage) enthalten sind. Dabei sind die Klammern zwingend notwendig. Bei mehreren Labelgruppen können mehrere, durch Leerzeichen getrennte Variablen angegeben werden.
gridLabelRestrict = (VARIABLE);
MultiQ m1; Text="TEXT"; Labels= 1 "Label 1" 2 "Label 2" 3 "Label 3" 4 "Label 4" ; SingleGridQ sq1; Text="TEXT"; gridlabels= 1 "Label 1" 2 "Label 2" 3 "Label 3" 4 "Label 4" ; griditems= 1 "Item 1" 2 "Item 2" 3 "Item 3" 4 "Item 4" 5 "Item 5" ; gridLabelRestrict = (mq1);
gridItemRestrict
funktioniert analog zum einfachen
Restrict
(siehe „ Antwortlabel “.)gridItemRestrict = VARIABLE;
Die MultiGridQ funktioniert entsprechend der SingleGridQ, nur dass es hier möglich ist, für jedes Item mehrere Antwortmöglichkeiten zu geben.
Alle zuvor erläuterten Funktionalitäten und Frageattribute der SingleGridQ lassen sich analog auch auf die MultiGridQ anwenden.
Die bei der MultiQ möglichen Eigenschaften der Antwortlabels,
single
und always
, greifen auch bei der MultiGridQ.
Da die Datenablage parallel zur SingleGridQ etwas komplizierter wird, folgt hier ein etwas ausführlicheres Beispiel. Eine MultiGrid-Frage mit folgendem Code
multigridq s1; text="Gadgets"; gridlabels= 2 "Fernsehen" 4 "Zeitung" 6 "Kino" 8 "weiß nicht" single ; griditems= 1 "Telefon" 2 "Kamera" 3 "Tablet" 4 "Phablet" 95 "Anderes" open ;
stellt Q. wie folgt dar und verwendet, wie oben angesprochen, systematische Variablennamen für die Griditems und ordnet ihnen die durch die Labels vorgegebenen Werte zu.
Und wie es die Grafik schon andeutet, speichert die MutliGrid-Frage die Eingabe in dieser Form (_missing = -1):
"s1.1.1" "2 4 6 -1" "s1.2.1" "4 6 -1 -1" "s1.3.1" "8 -1 -1 -1" "s1.4.1" "6 -1 -1 -1" "s1.95.1" "4 -1 -1 -1" "s1.95.open" "Brille"
Um sicher zu stellen, dass nur Leute interviewt werden, die nicht »weiß nicht« zu Phablets sagen, sähe die assert-Formulierung so aus:
assert( not( 8 in s1.4.1 )) "Sorry" exit 2;
Außerdem soll, solange nicht »weiß nicht« zur offenen Nennung angekreuzt wird, sicher gestellt werden, dass das Eingabefeld auch ausgefüllt ist:
if( [2 4 6] in s1.95.1 ) assert( num(s1.95.open) gt 0 ) "Bitte Gadget eintragen";
Wie im Rahmen der MultiQ (s. „
MultiQ
“) bereits erläutert, sind Prüfungen
von MultiQ-Variablen mit dem Gleichheitsoperator
eq
nur bedingt sinnvoll, weil
MultiQ-Fragen Ergebnismengen speichern. Da
MultiGridQ-Fragen aus einzelnen MultiQ-Fragen zusammen
gesetzt sind, gilt hier das Gleiche.
Viele Fragen bieten eine Liste von vorgegebenen Antwortmöglichkeiten (Label), aus denen der Befragte eine oder mehrere auswählt. GESS Q. eröffnet verschiedene Möglichkeiten, diese Liste zu gestalten. In diesem Kapitel sollen zunächst die Möglichkeiten von Labellisten beschrieben und anschließend an konkreten Beispielen verdeutlicht werden.
Eine Labelliste wird im Rahmen der Fragedefinition
innerhalb des Statements labels= ...
;
definiert. Hiermit lässt sich eine
beliebige Abfolge von einzelnen Labels oder
Labelgruppen definieren. Allgemein ausgedrückt:
labels= [LABEL | LABELGROUP | splitcolumn]+ ;
LABEL
kann entweder ein reines
TEXTLABEL
oder einANTWORTLABEL
sein. Label können mit Parametern versehen werden (s.u,).LABEL = [ TEXTLABEL | ANTWORTLABEL ]
-
TEXTLABEL
dienen der Strukturierung der Antwortmöglichkeiten. Textlabel können als Überschriften für Labelgruppen dienen oder fügen (ohne Inhalt) ggf. einfach Leerzeilen ein. Sie können optional mit einem
restrict
Attribut versehen werden, dessenCODES
wie ein Filter wirken. Das Textlabel wird nur dargestellt, wenn einer der genannten Codes nach Ausführung aller Labelfilter noch in der letztlich dargestellten Labelliste existiert. Diese Art der Filterung für Textlabel wird auch von den allgemeinen Restricts übernommen.text "LABELTEXT" [restrict(CODES)]
MultiQ bekannt; text="Welche Marken kennen Sie?"; labels= text "Audi" restrict([1:3]) 1 "A3" 2 "A6" 3 "A8" text "BMW" restrict([4:6]) 4 "3er" 5 "5er" 6 "7er" ; MultiQ gekauft; text="Welche haben Sie schon gekauft?"; labels copy bekannt; restrict=bekannt;
-
ANTWORTLABEL
sind auswählbare Antwortmöglichkeiten, die der jeweiligen Nennung gleichzeitig einen Code zuordnen, der in den Daten gespeichert wird und je Fragevariable nicht mehrfach vergeben sein darf.
LABELCODE "LABELTEXT"
Das folgende Beispiel zeigt, wie die bis hierhin vorgestellten Möglichkeiten eingesetzt werden können:
multiq gerichte; text="Bitte wählen Sie alle Gerichte aus, die Sie gerne essen."; labels= text "Fleischgerichte" 11 "Rumpsteak" 12 "Schweineschnitzel" 13 "Gulasch" 14 "Gyros" splitcolumn text "Fischgerichte" 21 "Fischstäbchen" 22 "Fischsuppe" 23 "Pannfisch" splitcolumn text "Vegetarische Gerichte" 31 "Gemüserisotto" 32 "Bruschetta" 33 "Griech. Bauernsalat" ; // Grafisches Ausgabeschema: // // Fleischgerichte Fischgerichte Vegetarische Gerichte // ----------------------------------------------------------------------- // [] Rumpsteak [] Fischstäbchen [] Gemüserisotto // [] Schweineschnitzel [] Fischsuppe [] Bruschetta // [] Gulasch [] Pannfisch [] Griech. Bauernsalat // [] Gyros
-
LABEL
können optional mit einem oder mehreren Parametern versehen werden:
LABELCODE "LABELTEXT" [always] [flt] [open] [random] [single]
-
single
Das Schlüsselwort ist relevant, wenn mehrere Antworten gegeben werden können. Labels mit dem Attribut
single
sind ausschließliche Antworten, wie etwa "Keine davon" oder "Keine Angabe". Mittels des javascriptSingleMode (s. „HTML-Parameter“) können zwei Möglichkeiten festgelegt werden, wie die Frage auf eine Single-Auswahl reagiert: Entweder ein Klick auf einesingle
-Antwort deaktiviert alle anderen, so dass sie nicht mehr wählbar sind oder er deselektiert automatisch alle Antworten, die zuvor markiert waren.
Um all das konkret darzustellen, ein paar Beispiele:
Angenommen, es soll eine Liste von Automarken abgefragt werden. Die Defintion der Frage wäre:
MultiQ marken; labels= 1 "Audi" 2 "BMW" 3 "Mercedes-Benz" ;
Diese sollen nun in zufälliger Reihenfolge erscheinen (d.h., von Interview zu Interview verschieden). Daher setzen wir ein random hinter jedes Label:
MultiQ marken; labels= 1 "Audi" random 2 "BMW" random 3 "Mercedes-Benz" random ;
In einer weiteren Frage sollen nun zu jeder Marke je drei Modelle auf Bekanntheit abgefragt werden. Hier die simple Version der Labeldefinition:
MultiQ modelle; labels= 1 "Audi A4" 2 "Audi A6" 3 "Audi A8" 4 "BMW 3er" 5 "BMW 5er" 6 "BMW 7er" 7 "Mercedes-Benz C-Klasse" 8 "Mercedes-Benz E-Klasse" 9 "Mercedes-Benz S-Klasse" ;
Um das etwas schöner aussehen zu lassen, sollen die Marken als reine Textzeile über den Labels stehen:
MultiQ modelle; labels= text " " text "Audi" 1 "A4" 2 "A6" 3 "A8" text "" text "BMW" 4 "3er" 5 "5er" 6 "7er" text "" text "Mercedes-Benz" 7 "C-Klasse" 8 "E-Klasse" 9 "S-Klasse" ;
Die einzelnen Marken sollen nun, wie bei der
Markenbekanntheitsfrage, in zufälliger Reihenfolge
erscheinen, inklusiv ihrer mittels text
eingefügten Überschriften.
Dazu fassen wir sie zu Gruppen zusammen, und geben den
Gruppen das random
-Attribut:
MultiQ modelle; labels= group ( text "" text "Audi" 1 "A4" 2 "A6" 3 "A8" ) random group ( text "" text "BMW" 4 "3er" 5 "5er" 6 "7er" ) random group ( text "" text "Mercedes-Benz" 7 "C-Klasse" 8 "E-Klasse" 9 "S-Klasse" ) random ;
Die einzelnen Modelle sollen nun innerhalb der Marken ebenfalls zufällig verteilt werden:
MultiQ modelle; labels= group ( text " " text "Audi" 1 "A4" random 2 "A6" random 3 "A8" random ) random group ( text " " text "BMW" 4 "3er" random 5 "5er" random 6 "7er" random ) random group ( text " " text "Mercedes-Benz" 7 "C-Klasse" random 8 "E-Klasse" random 9 "S-Klasse" random ) random ;
Außerdem sollen die Modelle einer Marke nur dann
abgefragt werden, wenn die Marke insgesamt vorher als
bekannt angegeben wurde. Hierzu wird jede Labelgruppe
mit einem Filter versehen. Dazu soll noch eine exklusive
Antwortmöglichkeit keine davon
erscheinen, wofür das Attribut single
genutzt wird. Das sieht dann so aus:
MultiQ modelle; labels= group ( text " " text "Audi" 1 "A4" random 2 "A6" random 3 "A8" random ) random flt (marken eq 1) group ( text " " text "BMW" 4 "3er" random 5 "5er" random 6 "7er" random ) random flt (marken eq 2) group ( text " " text "Mercedes-Benz" 7 "C-Klasse" random 8 "E-Klasse" random 9 "S-Klasse" random ) random flt (marken eq 3) text " " 10 "keine davon" single ;
Die mögliche Komplexität der Labeldefinitionen wird hier erkennbar. Wie genau man die Zeilenumbrüche setzt ist egal, theroetisch könnte man auch alles in eine Zeile hintereinander schreiben.
Bei der NumQ kann außerdem noch der Platzhalter @input
an die Stelle des Labeltextest eingefügt werden, an der das
Eingabefeld erscheinen soll. Siehe „
NumQ
“.
NumQ punkte; Text="Bitte verteilen Sie 10 Punkte auf diese Marken"; labels=1 "Marke A: @input Punkte" format f1 2 "Marke B: @input Punkte" format f1 3 "Marke C: @input Punkte" format f1 4 "Marke D: @input Punkte" format f1 5 "sonstige Marke (bitte angeben) @open : @input Punkte" format f1;
-
labels copy, griditems copy, gridlabels copy
Mit den jeweiligen Anweisungen lassen sich Labels bzw. Griditems einer voran gegangenen Frage wieder verwenden, Dabei gehört die Anweisung
labels copy
zu den nicht-Gridfragen, währendgriditems/gridlabels copy
für Gridfragen zur Verfügung stehen.SingleQ s1; text="Text Text"; labels= 1 "1" 3 "3" ; MultiQ s2; text="Text Text"; labels copy s1 ;
Von Gridfrage zu Gridfrage:
SingleGridQ s1; text="Text Text"; gridlabels= 1 "gl 1" 2 "gl 2" ; griditems= 3 "3" 4 "4" ; MultiGridQ s2; text="Text Text"; gridlabels copy s1 ; griditems copy s1; ;
Und von nicht-Gridfrage zu Gridfrage bzw. anders herum:
// nicht-Grid zu Grid SingleQ s1; text="Text Text"; labels= 1 "1" 2 "2" ; MultiGridQ s2; text="Text Text"; gridlabels 1 "gl 1" 2 "gl 2" ; griditems copy s1; ; // Grid zu nicht-Grid SingleGridQ s1; text="Text Text"; gridlabels= 1 "gl 1" 2 "gl 2" ; griditems= 3 "3" 4 "4" ; SingleQ s2; text="Text Text"; labels copy s1 ;
-
insertLabels
Fügt der aktuellen Labelliste nachträglich weitere Labels
APPENDLABELS
zu. Die neuen Labels werden hinter dem Label mit LabelcodeLCODE
einsortiert.insertLabels = LCODE( APPENDLABELS );
SingleQ s1; labels= 1 "1" 3 "3" ; SingleQ s2; // s2 erhält somit folgende Labelliste labels copy s1; // labels= insertLabels= // 1 "1" 1( // 2 "neu eingefügt" 2 "neu eingefügt" // 3 "3" ); // ;
-
restrict
filtert eine Labelliste, sodass nur noch die Labels (mit den Codes) dargestellt werden, die in der Wertemenge einer zuvor beantworteten Frage enthalten sind. So lässt sich sehr einfach mit zuvor gegebenen Antworten weiter arbeiten. Anstelle der Wertemenge kann auch eine
RestrictVar
angegeben werden. Mehr hierzu siehe „RestrictVar“.MultiQ bekannt; text="Welche dieser Produkte kennen Sie?"; labels= 1 "Produkt 1" 2 "Produkt 2" 3 "Produkt 3" 4 "Produkt 4" 5 "Produkt 5" 6 "Produkt 6" ; MultiQ gekauft; text="Welche der Produkte haben Sie schon gekauft?"; labels copy bekannt; restrict=bekannt; flt=(num(bekannt) gt 0);
Soll mit einer negativ-Liste gearbeitet werden, muss das resrict mit einer not-Verbindung in Klammern gesetzt werden:
restrict=(not(bekannt));