Kapitel 3. Fragedefinitionen

Inhaltsverzeichnis

Fragetypen
Allgemeine Eigenschaften
SingleQ
Alternative Auswahlmöglichkeiten
MultiQ
OpenQ
PasswdQ
TextQ
NumQ
GNumQ
SingleGridQ
Standard-Grid-Frage
Transponierte Grid-Frage
Grid-Frage mit mehreren Frageblöcken (LabelGroups)
Datenablage und -zugriff
Directionals / bipolare Skalen
Weitere GridQ-Parameter
MultiGridQ
Antwortlabel

Fragetypen

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

Allgemeine Eigenschaften

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 Parameter writePreText 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 Parameter showHelptext 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 Parameter showHelptext 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 Parameter showInterviewerHelptext 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 Parameter showInterviewerHelptext 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;
          

SingleQ

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 links

  • table - Labels nebeneinander, Buttons unten

  • select - 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“.

Alternative Auswahlmöglichkeiten

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.

Abbildung 3.1. SingleQ-Alternativen: Liste, Liste mit Suche, scrollbare Liste

SingleQ-Alternativen: Liste, Liste mit Suche, scrollbare Liste


MultiQ

Neben der SingleQ stellt die MultiQ ein syntaktisch identisches Gegenstück dar, welches eine N-aus-M Auswahl ermöglicht. Der HTML-Skript-Parameter singleQFormatschaltet, 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);
    

OpenQ

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"

PasswdQ

Die Syntax entspricht der einer OpenQ, allerdings wird zur Darstellung ein Passwort-Feld (mit Punkten als Platzhalter für die Buchstaben) benutzt.

TextQ

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!";
    

NumQ

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"
    

GNumQ

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" ); };
      

SingleGridQ

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.

Standard-Grid-Frage

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"
;
      

Transponierte Grid-Frage

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;
      

Grid-Frage mit mehreren Frageblöcken (LabelGroups)

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!";
      

Datenablage und -zugriff

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 “).

Directionals / bipolare Skalen

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;
      

Weitere GridQ-Parameter

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 mit repeatGridAnchor möglich, auch den AnchorText zu wiederholen. Dieser Befehl funktioniert nur im Zusammenhang mit labelRepeat und setzt einen definierten AnchorText voraus.

            repeatGridAnchor;
          
gridLabelFooter

analog zum GridLabelHeader kann auch ein gridLabelFooter 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;
          

MultiGridQ

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.

Abbildung 3.2. Datenablage einer MultiGridQ

Datenablage einer MultiGridQ


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.

Antwortlabel

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]+
;
    
splitcolumn

Bei der grafischen Darstellung beginnt mit diesem Schlüsselwort eine neue Spalte. Lange Labellisten können so auf mehrere Spalten verteilt werden.

LABELGROUP

ist ein strukturierendes Element. Die LABELGROUP kann selbst wieder LABEL und weitere LABELGROUPS enthalten. Technisch gesehen ist die Labelliste an sich ebenfalls eine Labelgroup.

group(
  [LABEL | LABELGROUP | splitcolumn]+
)
          
LABEL

kann entweder ein reines TEXTLABEL oder ein ANTWORTLABEL 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, dessen CODES 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] 
    
always

Ein Label mit diesem Attribut wird immer angezeigt, selbst wenn die restriction-Bedingung nicht erfüllt ist.

flt

versieht ein Label oder eine gesamte Labelgruppe mit einer Bedingung. Das Label bzw. die Gruppe wird nur dann dargestellt, wenn die Bedingung erfüllt ist.

open

kombiniert das Label mit einem einzeiligen Feld für freie Texteingabe, das z.B. für "Sonstige Angaben" verwendet werden kann. Das Eingabefeld lässt sich im Skript referenzieren und in den Daten mit dem Variablennamen FRAGENAME.LABELCODE.open wiederfinden.

random

Alle Labels und Labelgruppen, die innerhalb einer Gruppe dieses Attribut haben, werden in zufälliger Reihenfolge dargestellt. Die Reihenfolge wird einmalig beim Interviewstart festgelegt.

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 eine single-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ährend griditems/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 Labelcode LCODE 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"
);                     //   ;
          
shareLabels

Im Gegensatz zu labels copy arbeitet shareLabels nicht mit einer Kopie der Liste. Änderungen an der Labelliste, etwa mit insertLabels wirken sich auf beide Fragen aus.

SingleQ s1;
labels=    
1 "1"      
3 "3"      
;          

SingleQ s2;
shareLabels = s1;
          
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));