Kapitel 11. Sortieren

Inhaltsverzeichnis

Allgemeines
Array-Inhalte als Sortier-Reihenfolge
Automatisches Erzeugen der Sortier-ID

Allgemeines

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:

  1. Aussehen Mercedes

  2. Aussehen Audi

  3. Aussehen BMW

  4. Ausstattung Mercedes

  5. Ausstattung Audi

  6. Ausstattung BMW

  7. Preis Mercedes

  8. Preis Audi

  9. 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;
  

Array-Inhalte als Sortier-Reihenfolge

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

Automatisches Erzeugen der Sortier-ID

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;