Labels, Fragen, Screens oder Blöcke in eine Reihenfolge zu bringen oder eine Reihenfolge zufällig durcheinander zu würfeln, ist die eine Seite des Sortierens. Die andere besteht in der Regel darin, die einmal festgelegte Reihenfolge innerhalb eines Interviews beizubehalten.
Ein Beispiel kann das verdeutlichen: Es sollen für drei Automarken je drei Fragen gestellt werden. Die Marken sind Audi, BMW und Mercedes (stehen in dieser alphabetischen Reihenfolge auch im Skript), und die Fragen sind Beurteilungen des Aussehens, der Ausstattung und des Preises. Die drei Fragen sollen in fester Reihenfolge für alle drei Marken erfolgen. Die Reihenfolge der Marken soll pro Interview zufällig sein.
Wenn die zufällige Reihenfolge der Marken Mercedes, Audi und BMW wäre, ergäbe sich daraus diese Abfolge der Fragen:
Aussehen Mercedes
Aussehen Audi
Aussehen BMW
Ausstattung Mercedes
Ausstattung Audi
Ausstattung BMW
Preis Mercedes
Preis Audi
Preis BMW
Um die am Anfang des Interviews festgelegte zufällige
Reihenfolge (Mercedes, Audi, BMW) in den verschiedenen
Blöcken (Aussehen, Ausstattung, Preis) beizubehalten,
setzt Q. eine spezialisierte Variable ein, die
sortID
, die die Position eines
Elements speichert. <id>
sollte
eine Zeichenkette sein:
sortID=<id>
In unserem Beispiel erhalten alle Fragen Sortier-IDs:
SingleQ aussehen_audi; ...; sortID="audi"; SingleQ aussehen_bmw; ...; sortID="bmw"; SingleQ aussehen_mercedes; ...; sortID="mercedes"; SingleQ preis_audi; ...; sortID="audi"; SingleQ preis_bmw; ...; sortID="bmw"; SingleQ preis_mercedes; ...; sortID="mercedes"; SingleQ ausstattung_audi; ...; sortID="audi"; SingleQ aausstattung_bmw; ...; sortID="bmw"; SingleQ ausstattung_mercedes; ...; sortID="mercedes";
Die Fragen zu einer Marke bekommen alle die gleiche
Sortier-ID, damit die Marke immer an der gleichen
Position erscheint. Um die Positionen über verschiedene
Blöcke zu wahren, wird den Blöcken ein spezialisiertes
Array, die sortOrder
zugewiesen. Das
Array hält die Positionen der Elemente vor: Ein
sortOrder-Array mit »3 1 2« würde dafür sorgen, dass die
Elemente mit der Sortier-ID 1 an zweiter Position
erscheinen.
In unserem Beispiel soll die Reihenfolge der Marken
zufällig sein und mit random
erreichen wir eine zufällige Reihenfolge im Block
aussehen
:
block aussehen=(aussehen_audi aussehen_bmw aussehen_mercedes); random;
Q. ermöglicht hier eine implizite Zuweisung: Die
Reihenfolge des Blocks aussehen
kann
auch den anderen Blöcken über die
sortOrder
zugewiesen werden. Die
beiden anderen Blöcke erhalten die gleiche Reihenfolge,
indem man den aussehen-Block als Sortierquelle angibt.
block preis=(preis_audi preis_bmw preis_mercedes); sortOrder=aussehen; block ausstattung=(ausstattung_audi ausstattung_bmw ausstattung_mercedes); sortOrder=aussehen;
Damit bleibt die Reihenfolge der Marken in den drei Blöcken erhalten.
Nicht nur Fragen können mit einer Sortier-ID versehen werden, das gilt auch für Antwortlabels sowie für Blöcke, die Inhalt eines Blocks sind. Da es sich bei Sortier-ID und sortOrder um Zahlen bzw. Zahlenfolgen handelt, kann eine Sortierreihenfolge auch beliebig übertragen werden etwa von Labels auf Blöcke.
In unserem Beispiel ließe sich den Frageblöcken eine SingleQ voranstellen, in der z.B. gefragt wird, welches der drei Merkmale (Preis/Aussehen/Ausstattung) den Befragten am wichtigsten ist. Die Antwort-Labels der SingleQ werden randomisiert, und die drei Frageblöcke sollen dann in der gleichen Reihenfolge wie die Antwortlabels abgefragt werden:
SingleQ wichtig; text="Welches dieser Merkmale ist Ihnen am wichtigsten?"; labels= 1 "Preis" random sortID="preis" 2 "Aussehen" random sortID="aussehen" 3 "Umfang der Ausstattung" random sortID="ausstattung" ;
Den Frageblöcken werden die Sortier-IDs aus der SingleQ ebenfalls mitgegeben:
block aussehen=(aussehen_audi aussehen_bmw aussehen_mercedes); random; sortID="aussehen"; block preis=(preis_audi preis_bmw preis_mercedes); sortOrder=aussehen; sortID="preis"; block ausstattung=(ausstattung_audi ausstattung_bmw ausstattung_mercedes); sortOrder=aussehen; sortID="ausstattung";
Die Sortierung der SingleQ wichtig
muss auf den Fragen-Block übertragen werden:
block fragen=(aussehen preis ausstattung); sortOrder=wichtig;
Durch sortOrder=wichtig
erhält der
Fragen-Block die Single-Frage wichtig
mit ihrer Folge der Labels als Sortier-Vorlage.
Der Ansatz lässt sich noch weiter treiben. Da es sich bei Labels letztlich um eine hierarchisch geschachtelte Baumstruktur handelt, kann sich die Angabe der sortOrder auch auf eine bestimmte Untergruppe von Labels beziehen. Im folgenden Beispiel einer MultiQ sind die abgefragten Modelle nach Marken gruppiert und sowohl die Labels als auch die Gruppen erhalten eine Sortier-ID:
MultiQ automodelle; text="Welche dieser Automodelle kennen Sie?"; labels= group ( text "Audi" 1 "A4" random sortID="a4" 2 "A6" random sortID="a6" 3 "A8" random sortID="a8" ) sortID="audi" group ( text "BMW" 4 "3er" sortID="3er" 5 "5er" sortID="5er" 6 "7er" sortID="7er" ) sortID="bmw" group ( text "Mercedes-Benz" 7 "C-Klasse" sortID="c" 8 "E-Klasse" sortID="e" 9 "S-Klasse" sortID="s" ) sortID="mb" ;
Danach soll das Lieblingsmodell jeder Marke erfragt
werden, wobei die Reihenfolge der Modelle aus der
vorangegangenen MultiQ erhalten bleiben soll. Mit
sortOrder=automodelle.audi
wird die
Reihenfolge aus der MultiQ
automodelle
und der Gruppe
audi
auf die SingleQ übertragen.
SingleQ pref_audi; text="Audi Lieblingsmodell"; labels= 1 "A4" sortID="a4" 2 "A6" sortID="a6" 3 "A8" sortID="a8" ; sortOrder=automodelle.audi;
Durch sortOrder=automodelle.audi
wird
die Untergruppe audi
(identifiziert
anhand ihrer Sortier-ID) referenziert. Das kann beliebig
tief geschachtelt werden (wenn die Labelgruppen
entsprechend komplex sind), wobei die Gruppen jeweils
mit einem Punkt getrennt werden.
Analog dazu gehts weiter mit BMW und Mercedes;
SingleQ pref_bmw; text="BMW Lieblingsmodell"; labels= 1 "3er" sortID="3er" 2 "5er" sortID="5er" 3 "7er" sortID="7er" ; sortOrder=automodelle.bmw; SingleQ pref_mercedes; text="Mercedes Lieblingsmodell"; labels= 1 "C-Klasse" sortID="c" 2 "E-Klasse" sortID="e" 3 "S-Klasse" sortID="s" ; sortOrder=automodelle.mb;
Unter Umständen muss eine Reihenfolge explizit berechnet werden (um z.B. Quotenstände zu berücksichtigen). Zahlen in beliebiger Reihenfolge können wir in einem Array speichern und das Array dann als Sortiervorlage verwenden.
Der Befehl arraySortOrder
ermöglicht das:
arraySortOrder NAME = ARRAY;
Die im Array gespeicherten Elemente werden auf diese Weise zu Sortier-IDs. Ein Array mit dem Inhalt: (2 3 1 4) ergibt die Sortier-IDs »2« »3« »1« »4«.
Array sortvorlage[4]; arraySortOrder aso = sortvorlage; StartActionBlock = { set( sortvorlage[1] = 2 ); set( sortvorlage[2] = 3 ); set( sortvorlage[3] = 1 ); set( sortvorlage[4] = 4 ); }; MultiGridQ s1; text="Gadgets"; gridlabels= group( 1 "Ja" sortid="1" 2 "Nein" sortid="2" 3 "Vielleicht" sortid="3" 4 "Jein" sortid="4" ) sortorder = aso ; griditems= 1 "Telefon" 2 "Kamera" 3 "Tablet" 4 "Phablet" ;
GridLabels einer Grid-Frage können über den Umweg einer
group
mit einer sortOrder versehen
werden (die Reihenfolge der Label wäre hier also »nein«,
»vielleicht«, »ja«, »jein«). Der Frage selbst die
Sortorder mitzugeben, sortierte die GridItems (bei
entsprechender sortID).
Das manuelle Erstellen der Sortier-IDs ist häufig aufwändig und redundant. In den meisten Fällen reicht es aus, einen einfachen, kurzen Identifier zu haben. Daher lässt sich die ID für Labels automatisch erzeugen. Die Option kann mittels eines Schalters lokal aktiviert bzw. deaktiviert werden:
createDefaultSortId=[ yes | no ];
Bei Wertelabels wird der Labelwert, in einen String konvertiert, als Sortier-ID verwendet.
Ein Beispiel:
createDefaultSortId=yes; MultiQ q4; text="Welche der folgenden Anbieter kennen Sie?"; labels= 1 "abc" random 2 "def" random 3 "ghi" random 4 "jkl" random 99 "Keinen davon" single ; MultiQ q5; text="Von welchem der Anbieter haben Sie die Internetseiten besucht? "; labels= 1 "abc" 2 "def" 3 "ghi" 4 "jkl" 99 "Von keinem" single ; sortorder=q4; createDefaultSortId=no;