Hallo,
richtig; dies wird am Anfang in einer Frage vom Typ "kurzer Text" oder "langer Text", egal, gespeichert.
Und zwar als Vorgabeantwort.
Frage "pool"
Dann hast Du ja schon gesehen, dass am Anfang ein Identifier steht, wie "#13:".
Dabei dienen die Textzeichen nur dazu, zu verhindern, dass die "13" auch bei der Suche nach "3" gefunden wird.
Ich habe die Umfrage jetzt so angelegt, dass zyklisch die "SAVEDID mod 100" benutzt wird.
Soll heißen: Ich habe im "pool" nur 100 Zeilen, dafür bekommt die Nr. 101 wieder die Zeichenkette 1.
SAVEDID? Ist einfach die laufende Nummer des Antwortdatensatzes (in der Antworttabelle die Spalte "id")
So, jetzt kommt etwas ExpressionScript:
Um diese zyklische Nr zu berechnen - und sie gleich mit den zusätzlichen Zeichen zu umrahmen, dient in der Gleichungsfrage "cid"
{join('#',SAVEDID-floor((SAVEDID-1)/100)*100,':')}
SAVEDID-floor((SAVEDID-1)/100)*100 ist die Modulo-Berechnung, die Funktion "join" macht die Raute davor und den Doppelpunkt dahinter.
Dazu kannst Du auch in meinem "Tutorial 4: Gleichungen, Zu- und andere Fälle" etwas nachlesen.
Danach folgen in der ersten Gruppe, die ja gar nicht angezeigt wird, noch
ST: eine Frage "kurzer Text" als Container zur Zwischenspeicherung des benötigten Strings.
C eine Matrix(Text) zur Zwischenspeicherung der 12 benötigten Werte.
Nun folgen die zwölf Gruppen, die völlig identisch sind.
Hier ist nicht die geringste Änderung nötig, nur "Kopieren" und entsprechenden Fragecodes vergeben
Auch hier noch einmal eine kurze Erläuterung, was gemacht wird.
eqSTx:
Hier wird aufgrund der cid der entsprechende string gesucht, aufgrund der Frage (1-12) das entsprechende Teilstück herausgeschnitten und in ST zwischengespeichert.
{ST=substr(pool,strpos(pool,cid)+strlen(cid)+(self.gseq-eqST1.gseq)*12,12)}
Sieht kompliziert aus, ist es aber nicht.
strpos(pool,cid) findet den Index in "pool", wo eben "cid" beginnt, also die Raute.
Da es in LimeSurvey ein bisschen kompliziert ist, Zahlen links mit "0" aufzufüllen, ist die Länge von "cid" nicht bekannt.
Daher wird diese Länge berechnet "strlen(cid)" und hinzuaddiert. Dort beginnt also der eigentliche String.
Da wir für die erste Frage die ersten 12 Zeichen, für die zweite Frage die zweiten 12 Zeichen, usw. benötigen, wird mit "self.gseq-eqST1.gseq" die Frage berechnet.
"self.gseq" ist der Gruppenindex der jeweiligen Frage in der laufenden Umfrage, "eqST1.gseq" der Frage eqST1 (die erste Gruppe hat den Wert 0); daher hat diese Differenz in der ersten Gruppe den Wert 0, in der zweiten den Wert 1, usw.
Genau, wie es benötigt wird.
Es wird also bei der ersten Frage 0*12 hinzuaddiert, bei der zweiten Frage 1*12, dann 2*12, 3*12, usw.
Und dann werden genau die folgenden zwölf Zeichen in ST gespeichert.
eqCx:
Hier wird nun dieser 12stellige string aufgedröselt und in die 4x3 Zellen der Matrix gespeichert.
{C_1_1=substr(ST,0,1)}
{C_1_2=substr(ST,1,1)}
Das ist wohl klar:
In die erste Zeile, erste Spalte von C wird vom ersten Zeichen in ST genau ein Zeichen in die Zelle geschrieben.
In die erste Zeile, zweite Spalte von C wird vom zweiten Zeichen in ST genau ein Zeichen in die Zelle geschrieben.
Beachte: Sowohl "strpos" wie auch "substr" beginnen bei "0".
Dies Speicherung in der Matrix erleichtert nun das Folgende - die Anzeige der Texte.
Da haben wir z.B. für die Zeile "Personalisierung" diese drei Spalten:
{if(C_1_1==1,'Silber',if(C_1_1==2,'Schwarz','Weiß'))}
{if(C_1_2==1,'Silber',if(C_1_2==2,'Schwarz','Weiß'))}
{if(C_1_3==1,'Silber',if(C_1_3==2,'Schwarz','Weiß'))}
Und jetzt sieht man, warum diese zusätzliche Speicherung in C die Sache etwas übersichtlicher macht.
Ohne sie sähen die drei Spalten so aus
{if(substr(ST,0,1)==1,'Silber',if(substr(ST,0,1)==2,'Schwarz','Weiß'))}
{if(substr(ST,1,1)==1,'Silber',if(substr(ST,1,1)==2,'Schwarz','Weiß'))}
{if(substr(ST,2,1)==1,'Silber',if(substr(ST,2,1)==2,'Schwarz','Weiß'))}
Man sieht, in jedem IF-Konstrukt wird zweimal dieselbe Berechnung durchgeführt - das ist unnötig.
Dies alles ist simples ExpressionScript mit einigen wenigen Funktionen.
Falls noch nicht geschehen, schau sie Dir hier noch einmal an.
[url]
www.limesurvey.org/manual/ExpressionScri...mentierte_Funktionen
[/url]
Und jetzt endlich die lss.
Wie gesagt, nur mit 5 Gruppen / Fragen. Ich hatte keine Lust sie noch siebenmal zu kopieren
Und es ist offensichtlich, dass diese Umfrage nur im aktivierten Modus funktioniert; sonst gibt es ja keine Datenspeicherung, und somit auch keine SAVEDID.
Wie gesagt, dieser Ansatz mit der SAVEDID ist leicht zu realisieren; natürlich haben auch Abbrecher einen Datensatz und diese fällt dann aus.
Es gibt andere Verfahren. Dazu mehr ebenfalls im angesprochenen Tutorial 4.
Bis dann
Joffm
P.S.
Ein kleiner Zusatz:
Es wäre für die Analyse wohl praktischer, statt einer Einfachnennung - egal ob mit Matrix oder Bootstrap-Buttons - eine Mehrfachnennung zu nehmen, also Matrix(Zahlen) oder auch Bootstrap-Buttons (natürlich dann beschränkt auf eine Antwort)
Vorteil:
In der Analyse benötigst Du die Werte für jede Spalte in binärem Format (0 / 1).
Dies kannst Du ja beim Export der Daten so einstellen, also dass dieses "Y" und "" in irgendwelche anderen Zeichen - Du nimmst natürlich "1" und "0" - umgewandelt werden.
Dann kannst Du mit sehr geringem Aufwand das Ergbnis direkt in die Modell-Datei hineinkopieren.
Ich bin mit R nicht wirklich "auf Du und Du", habe mir aber einmal dieses Video angeschaut
[url]
www.youtube.com/watch?v=s-h5UVarqZg
[/url]
wo die benutzte Datei dieselbe Struktur wie Deine Datei hat und die "choice" Spalte wird dann mit den LimeSurvey Ergebnissen einfach befüllt.