0 votes
in SoSci Survey (dt.) by s101603 (165 points)

Das Looping mit den Rubriken funktioniert gut, wenn alle Fragen aus der Rubrik auf einer einzigen Seite sind.
Innerhalb der Rubriken habe ich Filter, da nicht alle Fragen aus einer Rubrik gestellt werden sollen. So soll z.B. die Frage, ob ein Geschwister im HH gelebt hat nur dann gestellt werden, wenn in der Vorfrage angegeben wurde, dass es vor einem bestimmten Zeitpunkt nicht gestorben ist.
Verteile ich aber die Items auf aufeinanderfolgende Seiten, dann kommt bei der 2. Rubrik bei Frage 1 die Frage 2 der vorangegangen Rubrik, bei Rubrik 3 bei Frage 1 die Frage 3 der vorangegangenen Rubrik usw.
Ich habe jetzt schon sehr lange rumprobiert, finde aber den Fehler nicht, resp. was mache ich falsch?
Vielen Dank für die Hilfe!

1 Answer

+1 vote
by SoSci Survey (327k points)
selected by s101603
 
Best answer

Mit loopIndex() können Sie auf allen Seiten inner halb der Schleife den Durchgang abfragen, eine Liste mit Rubriken können Sie ggf. auf jede Seite kopieren oder mittels registerVariable() für alle Seiten verfügbar machen. Mit id() können Sie aus Rubrik + Frage-Kennung + evtl. Itemkennung bequem die Kennung von Variablen ermitteln. Diese können Sie dann in value() und damit in Filtern verwenden.

Soweit die allgemeine Antwort. Für eine konkretere Antwort müssten Sie bitte mal Ihren bisherigen PHP-Code posten, dazu die Debug-Information und beschreiben, was funktioniert und was nicht.

by s101603 (165 points)
Ok, hier ist mein Beispiel:
Alle Daten sollen am Ende in einem einzigen Rechtecksdatensatz stehen.
Es gibt für jedes Geschwister die gleichen Fragen, daher auch für jedes eine eigene Rubrik (leibliches Geschwister A bis O = LA bis LO). In der Vorfrage wird nach Anzahl der Geschwister gefragt. Dieser Wert wird übernommen. Und genauso viele Rubriken werden abgefragt.
Innerhalb der Rubriken gibt es die Fragen nach Geschlecht,Geburtsjahr, Tod vor Stichtag, Todesjahr, und dann - wenn nicht tot vor Stichtag - ob am Stichtag im Haushalt gelebt oder nicht, und da wieder - wenn nicht im HH - warum nicht.
Um die Befragten nicht zu verwirren, soll jedes dieser Fragen nur auf einer Seite stehen.

Meine bisherige "Lösung": Nimm jede Frage aus der Rubrik LA in eine eigene Seite (LA01 - LA07 + Filter), dann gehe weiter zu Rubrik LB,... bis Anzahl der Geschwister erreicht.

Bei Seite LA01 habe ich folgenden Code:


$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}


// Frageblock wiederholen
loopToPage('L0', $anzahl);
// Definition der Rubriken
$rubriken = array('LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LI', 'LJ', 'LK', 'LM', 'LN', 'LO');
registerVariable($rubriken);


$i = loopIndex();
$rubrik = $rubriken[$i];
 
question(id($rubrik, 1));  // Fragt LA


Der erste Durchgang geht gut.

Bei Seite LB01 habe ich folgenden Code:

$i = loopIndex();
$rubrik = $rubriken[$i];
 
question(id($rubrik, 2)); // usw. bis LO=15

Komme ich auf Seite LB01 an, dann steht unten die Frage der Seite LA02 und die Warnung:

"Eine oder mehrere Variablen (LA02) wurden bereits auf Seite 42 abgefragt. Bitte beachten Sie, dass die Antworten von Seite 42 hier angezeigt und anschließend überschrieben werden. Falls Sie eine gleichartige Frage mehrfach benötigen, erstellen Sie eine Kopie der Frage."

Ich hoffe, das konnte mein Problem hinreichend genau umreißen.
by SoSci Survey (327k points)
Bitte ergänzen Sie auf der ersten Seite noch ein wenig Debugging-Code:

$i = loopIndex();
$rubrik = $rubriken[$i];
question(id($rubrik, 1));  // Fragt LA

debug($rubriken);
debug($rubrik);
debug($i);
debug(id($rubrik, 1));

Anschließend posten Sie bitte die Debug-Information aus dem ersten und zweiten Durchlauf. Danke.
by s101603 (165 points)
**** erste Seite, erster Durchlauf *****
Hinweis (Seite 41)
Debug-Information für $rubriken:
0LA, 1LB, 2LC, 3LD, 4LE, 5LF, 6LG, 7LH, 8LI, 9LJ, 10LK, 11LM, 12LN, 13LO

Hinweis (Seite 41)
Debug-Information für $rubrik:
$rubrik = LA (string)

Hinweis (Seite 41)
Debug-Information für $i:
$i = 0 (integer)

Hinweis (Seite 41)
Debug-Information für id($rubrik, 1):
id($rubrik, 1) = LA01 (string)
value('LA01') =



**** erste Seite, zweiter Durchlauf *****
Hinweis (Seite 47)
Debug-Information für $rubriken:
0LA, 1LB, 2LC, 3LD, 4LE, 5LF, 6LG, 7LH, 8LI, 9LJ, 10LK, 11LM, 12LN, 13LO

Hinweis (Seite 47)
Debug-Information für $rubrik:
$rubrik = LA (string)

Hinweis (Seite 47)
Debug-Information für $i:
$i = 0 (integer)

Hinweis (Seite 47)
Debug-Information für id($rubrik, 1):
id($rubrik, 1) = LA01 (string)
value('LA01') = 1
by SoSci Survey (327k points)
Okay, hier ist das Problem:

> $i = 0 (integer)

Warum der loopIndex() hier den falschen Wert liefert, muss ich untersuchen. Bitte ändern Sie den Code derweilen wie folgt - nur auf der ersten Seite:

// Frageblock wiederholen
$i = loopToPage('L0', $anzahl);
// Definition der Rubriken
$rubriken = array('LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LI', 'LJ', 'LK', 'LM', 'LN', 'LO');
registerVariable($rubriken);

$rubrik = $rubriken[$i];
question(id($rubrik, 1));  // Fragt LA

Das $i wird hier direkt aus dem loopToPage() ermitteln, nicht aus dem loopIndex().
by s101603 (165 points)
Ich habe die Code-Anpassungen eingebaut, aber isch erhalte einen katastrophalen Absturz:

**** Seite LA01 ***
CODE:
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}


// Frageblock wiederholen
 $i = loopToPage('LC', $anzahl);
 // Definition der Rubriken
 $rubriken = array('LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LI', 'LJ', 'LK', 'LM', 'LN', 'LO');
 registerVariable($rubriken);

 $rubrik = $rubriken[$i];
 question(id($rubrik, 1));  // Fragt LA


Debug-Information für $rubriken:
0LA, 1LB, 2LC, 3LD, 4LE, 5LF, 6LG, 7LH, 8LI, 9LJ, 10LK, 11LM, 12LN, 13LO
Hinweis (Seite 41)
Debug-Information für $rubrik:
$rubrik = LA (string)
Hinweis (Seite 41)
Debug-Information für $i:
$i = 0 (integer)
Hinweis (Seite 41)
Debug-Information für id($rubrik, 1):
id($rubrik, 1) = LA01 (string)
value('LA01') =

**** Seite LB01 *****
CODE:
//$i = loopToPage('LC', $anzahl);
//$rubrik = $rubriken[$i];
 
question(id($rubrik, 2));  // Fragt G101, G201, G301, ...

debug($rubriken);
debug($rubrik);
debug($i);
debug(id($rubrik, 1));

Fehler im Fragebogen (Seite 47)
Für die Funktion id wurden nicht ausreichend Argumente angegeben, 1 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.
Fehler im Fragebogen (Seite 47)
Im Befehl question() wurde keine Frage-Kennung angegeben.
Hinweis (Seite 47)
Debug-Information für $rubriken:
0LA, 1LB, 2LC, 3LD, 4LE, 5LF, 6LG, 7LH, 8LI, 9LJ, 10LK, 11LM, 12LN, 13LO
Hinweis (Seite 47)
Debug-Information für $rubrik:
Keine Daten (null)
Hinweis (Seite 47)
Debug-Information für $i:
Keine Daten (null)
Fehler im Fragebogen (Seite 47)
Für die Funktion id wurden nicht ausreichend Argumente angegeben, 1 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.
Hinweis (Seite 47)
Debug-Information für id($rubrik, 1):
Keine Daten (null)
Fehler im Fragebogen (Seite 47)
Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Die PHP-Variable $rubrik wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

001
002
003  
004 question(id($rubrik, 2));  
005
006 debug($rubriken);
007 debug($rubrik);

Fehler im Fragebogen: Die PHP-Variable $rubrik wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

004 question(id($rubrik, 2));  
005
006 debug($rubriken);
007 debug($rubrik);
008 debug($i);
009 debug(id($rubrik, 1));
010 return 'ok';

Fehler im Fragebogen: Die PHP-Variable $i wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

005
006 debug($rubriken);
007 debug($rubrik);
008 debug($i);
009 debug(id($rubrik, 1));
010 return 'ok';

Fehler im Fragebogen: Die PHP-Variable $rubrik wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

006 debug($rubriken);
007 debug($rubrik);
008 debug($i);
009 debug(id($rubrik, 1));
010 return 'ok';

Ich denke mittlerweile, dass ich aufGrund mangelndes Verständnisses grobe Programmierfehler eingebaut habe...
by SoSci Survey (327k points)
//$i = loopToPage('LC', $anzahl);
//$rubrik = $rubriken[$i];

Diese beiden Zeilen haben Sie auskommentiert - das verursacht den Fehler.
by s101603 (165 points)
Deswegen habe ich die beiden Zeilen auskommentiert:


Fehler im Fragebogen (Seite 47)

Für die Funktion loopToPage() wurden nicht ausreichend Argumente angegeben, 2 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.

Fehler im Fragebogen (Seite 47)

Für die Funktion id wurden nicht ausreichend Argumente angegeben, 1 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.

Fehler im Fragebogen (Seite 47)

Im Befehl question() wurde keine Frage-Kennung angegeben.

Hinweis (Seite 47)

Debug-Information für $rubriken:
0LA, 1LB, 2LC, 3LD, 4LE, 5LF, 6LG, 7LH, 8LI, 9LJ, 10LK, 11LM, 12LN, 13LO

Hinweis (Seite 47)

Debug-Information für $rubrik:
Keine Daten (null)

Hinweis (Seite 47)

Debug-Information für $i:
Keine Daten (null)

Fehler im Fragebogen (Seite 47)

Für die Funktion id wurden nicht ausreichend Argumente angegeben, 1 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.

Hinweis (Seite 47)

Debug-Information für id($rubrik, 1):
Keine Daten (null)

Fehler im Fragebogen (Seite 47)

Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Die PHP-Variable $anzahl wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code
001 $i = loopToPage('LC', $anzahl);
002 $rubrik = $rubriken[$i];
003  
004 question(id($rubrik, 2));  


Fehler im Fragebogen: Undefined index:
Zeile: 2

PHP-Code
001 $i = loopToPage('LC', $anzahl);
002 $rubrik = $rubriken[$i];
003  
004 question(id($rubrik, 2));  
005
by SoSci Survey (327k points)
> Für die Funktion loopToPage() wurden nicht ausreichend Argumente angegeben, 2 Argumente sind zwingend erforderlich. Weitere Details finden Sie in der Anleitung zur Funktion.

Diese Fehlermeldung erscheint, wenn die Variable $anzahl nicht korrekt gesetzt ist. Den Code über dem loopToPage (aus Ihrem ursprünglichen) PHP-Code benötigen sie weiterhin. Ich hatte in meiner Antwort nur den unteren Teil angegeben.

$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}

// Dann geht es weiter mit loopToPage()
by s101603 (165 points)
Das geht noch immer nicht; die schlimmen Fehler sind weg, aber die Wiederholung der Frage LA02 auf Seite LB01 kommt immer noch; Ich hänge den internen Code der betreffenden Stelle an, vielleicht habe ich einen Designfehler- habe ein paar comments in den Code reingeschrieben - danke, CH

// Das ist die Seite, wo die Anzahl der Geschwister ausgewählt wird:

<!-- Seite 40 -->
<page ident="GS02" intID="66">
<info>Anzahl leibliche Geschwister</info>
<question id="GS02" intID="96" />
</page>

// Das ist die Seite, an der die erste Frage der Rubrik LA gestellt wird:

<!-- Seite 41 -->
<page ident="LA01" intID="68">
<info>Leibliche Geschwister 1</info>
<php intID="69"><![CDATA[
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}


// Frageblock wiederholen
$i = loopToPage('LC', $anzahl);
// Definition der Rubriken
$rubriken = array('LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LI', 'LJ', 'LK', 'LM', 'LN', 'LO');
registerVariable($rubriken);

$rubrik = $rubriken[$i];
question(id($rubrik, 1));  // Fragt LA

debug($rubriken);
debug($rubrik);
debug($i);
debug(id($rubrik, 1));
]]></php>
</page>


// dann folgt Seite zwei.... etc. bis zur letzten, korrekt mit allen Filtern

<!-- Seite 42 -->
<page ident="LA02" intID="101">
<question id="LA02" intID="103" />
</page>


<!-- Seite 43 -->
<page ident="LA03" intID="104">
<question id="LA03" intID="129" />
</page>


<!-- Seite 44 -->
<page ident="LA04" intID="102">
<question id="LA04" intID="105" />
</page>


<!-- Seite 45 -->
<page ident="LA06" intID="130">
<question id="LA06" intID="131" />
</page>


<!-- Seite 46 -->
<page ident="LA07" intID="133">
<question id="LA07" intID="134" />
</page>

// korrekterweise kommt bei Auswahl in GS02 "2" diese Seite, aber auch bei Auswahl von GS02 "1"... jedes Mal mit dem Hinweis, dass die Frage LA02 schon einmal beantwortet wurde...

<!-- Seite 47 -->
<page ident="LB01" intID="71">
<info>Leibliche Geschwister 2</info>
<question id="LB01" intID="140" />
<php intID="77"><![CDATA[
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}


$i = loopToPage('LC', $anzahl);
$rubrik = $rubriken[$i];
 
question(id($rubrik, 2));  // Fragt G101, G201, G301, ...

debug($rubriken);
debug($rubrik);
debug($i);
debug(id($rubrik, 2));
]]></php>
</page>


<!-- Seite 48 -->
<page ident="LB02" intID="106">
<question id="LB02" intID="107" />
</page>


<!-- Seite 49 -->
<page ident="LB03" intID="108">
<question id="LB03" intID="109" />
</page>


<!-- Seite 50 -->
<page ident="LB04" intID="110">
<question id="LB04" intID="135" />
</page>


<!-- Seite 51 -->
<page ident="LB05" intID="136">
<question id="LB06" intID="137" />
</page>


<!-- Seite 52 -->
<page ident="LB07" intID="138">
<question id="LB07" intID="139" />
</page>
by SoSci Survey (327k points)
Auf Seite 41 haben Sie ein loopToPage() zur Seite "LC" - diese sehe ich hier aber nicht. Stattdessen kommt auf Seite 47 nochmal ein loopToPage(). Das scheint mir nicht korrekt. Zumal auch hier wieder auf "LC" verwiesen wird, die ich aber nicht sehe. Man kann auch nicht (!) mehrere loopToPage() verschachteln.

Wenn Frage GS02 beantwortet ist und Sie dann im Debug-Modus direkt zur Seite 47 springen: Was wird denn beim ersten und zweiten Durchgang auf Seite 47 an Debug-Informationen angezeigt?
by s101603 (165 points)
edited by s101603
Ich kenne mich jetzt überhaupt nicht mehr aus. Vielleicht liegt es daran, dass ich in meiner Konzeption nicht mehr auf die Rubrik verweise, sondern nur auf Fragen aus der Rubrik;

Ursprüngliche Idee war, die Fragen zu jedem einzelnen Geschwister nur sooft zu stellen, wieviele Geschwister die befragte Person angegeben hat.
Mit der Lösung "LoopToPage" hat das gut funktioniert, solange alle Fragen der Rubrik LA,...,LO auf einer einzigen Seite platziert wurden.
Nach ein paar Testungen war sehr schnell klar, dass es für die Befragten verwirrend ist, Fragen auf einer Seite gestellt zu bekommen, auch wenn sie nicht zutreffen. Daher habe ich mich entschlossen, jede Frage einer Rubrik auf eine eigene Seite zu stellen - und da begann das Problem.
Vielleicht haben wir uns zu sehr auf die Lösung LoopToPage mit den Rubriken eingeengt?
Ich bin in dieser Programmiersprache einfach zu unerfahren, aber ist eine Lösung dieser Art denkbar:
-) nimm die Antwort aus der Frage nach den Geschwistern
-) übergib diesen Wert an einen Zähler i
-) initialisiere einen zweiten Zähler j, der nach den Fragen zu jedem Geschwister um eins erhöht wird
-) springe weiter zum nächsten Frageblock, wenn das letzte Geschwister erreicht ist (etwa: "if j > i then goto xxxx")
Das hätte allerdings den Nachteil (?) dass alle Fragen aus allen Rubriken auf jeweils eine Seite platziert werden müssten...
Danke, CH
by SoSci Survey (327k points)
Das mit dem loopToPage() ist schon korrekt - aber ich denke, Sie haben zu viele Seiten. Also, was Sie brauchen:

Eine Seite pro Frage - aber nur EINMAL, nicht pro Rubrik. Wenn Sie also pro Geschwister/Rubrik 5 Fragen haben, dann brauchen Sie 5 Seiten. Und auf die erste kommt einmalig (im Fragebogen) loopToPage().

Ziehen Sie keine Fragena uf die Seiten - fügen Sie auf den 5 Seiten nur den PHP-Code ein. Es benötigt nur die letzte der 5 Seiten (und die darauffolgenden für das goToPage()) eine Kennung. Alle anderen Seiten benötigen keine Kennungen.
by s101603 (165 points)
Danke, ich glaube ich hab's jetzt - danke für die Geduld; zur Sicherheit hier nochmals meine Lösung als minimal example (bitte um kurzes Feedback, ob so korrekt):

<?xml version="1.0"?>
<questionnaire>

<!-- Seite 1 -->
<page ident="GS02" intID="1">
<question id="GS02" intID="2" />
<php intID="15">

</php>
</page>


<!-- Seite 2 -->
<page ident="LBeginn" intID="3">
<php intID="32"><![CDATA[
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('end');
}

// Frageblock wiederholen
loopToPage('LEnd', $anzahl);
// Definition der Rubriken
$rubriken = array('LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LI', 'LJ', 'LK', 'LM', 'LN', 'LO');
registerVariable($rubriken);

$i = loopIndex();
$rubrik = $rubriken[$i];

question(id($rubrik, 1));

debug($anzahl);
debug($rubriken);
debug($rubrik);
debug($i);
debug(id($rubrik, 1));
]]></php>
</page>


<!-- Seite 3 -->
<page intID="4">
<php intID="9"><![CDATA[
$rubrik = $rubriken[loopIndex()];
 
question(id($rubrik, 2));
]]></php>
</page>


<!-- Seite 4 -->
<page intID="5">
<php intID="22"><![CDATA[
$rubrik = $rubriken[loopIndex()];
 
question(id($rubrik, 3));
]]></php>
</page>


<!-- Seite 5 -->
<page intID="6">
<php intID="29"><![CDATA[
$rubrik = $rubriken[loopIndex()];
 
question(id($rubrik, 4));
]]></php>
</page>


<!-- Seite 6 -->
<page intID="7">
<php intID="30"><![CDATA[
$rubrik = $rubriken[loopIndex()];
 
question(id($rubrik, 6));
]]></php>
</page>


<!-- Seite 7 -->
<page ident="LEnd" intID="13">
<php intID="31"><![CDATA[
$rubrik = $rubriken[loopIndex()];
 
question(id($rubrik, 7));
]]></php>
</page>


</questionnaire>
by SoSci Survey (327k points)
Sieht auf den ersten Blick gut aus :)
by s101603 (165 points)
edited by s101603
Wenn ich allerdings durch einen Filter die letzten beiden Fragen LA06 und LA07(das ist die  "LEnd-Seite) ausschließe, dann kommt mit der gestern geposteten Lösung:
Wieder die erste Seite mit der Frage nach dem Namen (LB08), was korrekt ist, siehe Debug-Code:
******
Information]    Interview Nummer 232 wird fortgesetzt
[Information]    Der Fragebogen qnr2 im Projekt test144687 wird verwendet
[Verarbeitung]    Lese Antworten von Seite 45
[Information]    Die Verweildauer auf Seite 45 war 4 Sekunden
[Information]    Antwort auf LA04 = 7
[Information]    ▼ Filter LA04/1 wird aktiv (Bedingung erfüllt).
[Information]    ▼ Filter LA04/2 wird aktiv (Bedingung erfüllt).
[Information]    Fragen bisher zu 100% vollständig beantwortet
[Information]    Entsprechend der vorher festgelegten Seitenabfolge wird Seite 46 [] angezeigt
[Verarbeitung]    Erstelle Fragebogen-Seite Nr. 46
[Information]    Entsprechend Filter LA04/F1 wird LA06 nicht angezeigt.
[Information]    Die Seite zeigt keine Inhalte, automatisch weiter mit Seite Nr. 47
[Verarbeitung]    Erstelle Fragebogen-Seite Nr. 47
[Information]    Entsprechend Filter LA04/F2 wird LA07 nicht angezeigt.
[Information]    Die Seite zeigt keine Inhalte, automatisch weiter mit Seite Nr. 41
[Verarbeitung]    Erstelle Fragebogen-Seite Nr. 41
[Information]    value("GS02") = 2
[Inhalt]    Erstelle Frage LB08
[Information]    Folgende Platzhalter sind vorbereitet:
%name% = (Text) Heidi
*****
ABER:
statt der Frage LB01 (Geschlecht), springt er wieder auf die Rubrik LA zurück, mit der Fehlermeldung:
"Die Funktion loopIndex() funktioniert nur, wenn Sie zusammen mit loopToPage() verwendet wird."

siehe Debug-Code:
******
[Information]    Interview Nummer 232 wird fortgesetzt
[Information]    Der Fragebogen qnr2 im Projekt test144687 wird verwendet
[Verarbeitung]    Lese Antworten von Seite 46+47+41
[Information]    Die Verweildauer auf Seite 41 betrug zusätzliche 157 Sekunden
[Information]    Antwort auf LB08_01 = Alfons
[Information]    Fragen bisher zu 100% vollständig beantwortet
[Information]    Entsprechend der vorher festgelegten Seitenabfolge wird Seite 42 [] angezeigt
[Verarbeitung]    Erstelle Fragebogen-Seite Nr. 42
[Information]    value("LA08_01") = "Heidi"
[Inhalt]    Erstelle Frage LA01
[Information]    Folgende Platzhalter sind vorbereitet:
%name% = (Text) Heidi




Bitte um Hilfe, vielen Dank!
by s101603 (165 points)
edited by s101603
Ich habe es auch mit dem Workaround probiert, statt dem LoopIndex das $i aus dem LooptoPage zu holen:

nach dem Filter, der die letzten beiden Seiten weglässt:
Fehler:

"Dieses Interview versuchte, auf Seite Nr. 8 (Kennung LEnd) zu springen, die bei der Ausgabe der aktuellen Darstellung bereits verarbeitet wurde. Bitte überprüfen Sie, ob goToPage() eine Shcleife erzeugt oder ob Sie loopPage() verwenden, dabei aber auf einzelnen Seiten keinen Inhalt (Text oder Fragen) erstellen."

Dazu Debug-Info:
*************************
Interview Nummer 233 wird fortgesetzt
[Information] Der Fragebogen qnr3 im Projekt test144687 wird verwendet
[Verarbeitung] Lese Antworten von Seite 6
[Information] Die Verweildauer auf Seite 6 war 8 Sekunden
[Information] Antwort auf LA04 = 17
[Information] ▼ Filter LA04/1 wird aktiv (Bedingung erfüllt).
[Information] ▼ Filter LA04/2 wird aktiv (Bedingung erfüllt).
[Information] Fragen bisher zu 100% vollständig beantwortet
[Information] Entsprechend der vorher festgelegten Seitenabfolge wird Seite 7 [] angezeigt
[Verarbeitung] Erstelle Fragebogen-Seite Nr. 7
[Information] value("GS02") = 2
[Information] loopToPage() wiederholt nun 2 Seiten 2 mal
[Information] Entsprechend Filter LA04/F1 wird LA06 nicht angezeigt.
[Information] Die Seite zeigt keine Inhalte, automatisch weiter mit Seite Nr. 8
[Verarbeitung] Erstelle Fragebogen-Seite Nr. 8
[Information] value("GS02") = 2
[Information] loopToPage() wiederholt nun 1 Seiten 2 mal
[Information] Entsprechend Filter LA04/F2 wird LA07 nicht angezeigt.
[Information] Die Seite zeigt keine Inhalte, automatisch weiter mit Seite Nr. 8
[Verarbeitung] Erstelle Fragebogen-Seite Nr. 8
[Information] Folgende Platzhalter sind vorbereitet:
%name% = (Text) sdf
by SoSci Survey (327k points)
Damit ich es korrekt verstehe: Sie haben im Loop 2 Seiten (Seiten 7 und 8). Auf Seite 7 beginnt der Loop. Und es kann aber vorkommen, dass aufgrund von Filtern weder auf Seite 7 noch auf Seite 8 etwas angezeigt wird? Das scheint mir von der Filterführung her zumindest bedenklich. Welche Überslegung steht denn dahinter?
by s101603 (165 points)
edited by s101603
Ich habe 8 Seiten

1. Seite Fragt nach der Anzahl der Geschwister

2. Seite fragt nach dem Namen des Geschwisters

3. Seite fragt nach dem Geschlecht

4. Seite fragt nach dem Geburtsjahr

5. Seite fragt, ob das Geschwister vor 1955 verstorben ist - hier ist der Filter:
    -> Filter S. 5: wenn verstorben, dann frage 6. Seite
    -> Filter S. 5: wenn verstorben, dann stelle Frage S. 7 NICHT: Lebte Geschwister 1955 mit ihnen zusammen?
     -> Filter S. 5: wenn verstorben, dann stelle Frage S. 8 NICHT: Warum lebe Geschwister nicht mit ihnen zusammen

6. Seite: Sterbejahr -> Ende, neues Geschwister = 2. Durchgang



5. Seite: wenn nicht verstorben, dann
Seite 7: Hat Geschwister mit ihnen zusammen gelebt - JA-> Ende, 2. Durchgang
           -> Filter S.7: wenn nicht zusammengelebt: stelle Frage S. 8:

Frage S. 8: warum lebte Geschwister mit Ihnen nicht zusammen -> Ende, 2. Durchgang


Seite 8 ist die Seite mit dem LEnd, bis wohin geloopt werden soll.

Ich hoffe, ich konnte das genau genug erklären.
by SoSci Survey (327k points)
Wenn ich Sie korrekt verstehe, dann sollte das loopToPage() eigentlich gar nicht auf Seite 7 starten (wie es im Moment laut Debug-Information der Fall ist), sondern auf Seite 3.

Der Befehl darf dann auch nur (!) auf Seite 3 stehen und danach nicht wiederholt werden.

>  Filter S. 5: wenn verstorben, dann frage 6. Seite

Wie haben Sie diesen Filter genau formuliert? Wenn Sie eine Seitenabfolge definiert haben, dann kann das mit loopPage() interferieren. Das Ausblenden von Fragen via Filter hingegen ist unproblematisch.
by s101603 (165 points)
LooptoPage startet auf S. 2 und sollte bis Seite 8 laufen;
Ich habe 2 Möglichkeiten beim Code ausprobiert, einmal mit loopIndex(), das hat dann gecrasht, dann eine 2. Möglichkeit, mit LoopToPage auf jeder Seite den Zähler zu initalisieren - das ist aber nicht meine bevorzugte Variante, sondern wurde mit geraten, das das loopIndex() nicht korrekt zählt ???

filter S. 5 ist definiert, dass er die FRAGEN nicht stellt, es ist KEIN Ausschluss von bestimmten Seiten

Ich schicke meine Minimal example mit:
******
<?xml version="1.0"?>
<questionnaire>

<!-- Seite 1 -->
<page ident="GS02" intID="1">
<question id="GS02" intID="2" />
<php intID="15">

</php>
</page>


<!-- Seite 2 -->
<page ident="LBeginn" intID="3">
<php intID="32"><![CDATA[
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('end');
}

// Frageblock wiederholen
$i=loopToPage('LEnd', $anzahl);
// Definition der Rubriken
$rubriken = array('LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LI', 'LJ', 'LK', 'LM', 'LN', 'LO');
registerVariable($rubriken);

//$i = loopIndex();
$rubrik = $rubriken[$i];

question(id($rubrik, 8));

debug($anzahl);
debug($rubriken);
debug($rubrik);
debug($i);
debug(id($rubrik, 1));
]]></php>
</page>


<!-- Seite 3 -->
<page intID="8">
<php intID="10"><![CDATA[
//$rubrik = $rubriken[loopIndex()];
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}
$i=loopToPage('LEnd', $anzahl);
$rubrik = $rubriken[$i];


//ermittelt den Namen des Geschwisters und fügt ihn in den Fragetext ein
$var =  value(id($rubrik, 8,1));
replace('%name%', $var);
 
//Frage auf Seite
question(id($rubrik, 1));

debug($var);
debug($rubriken);
debug($rubrik);
debug(id($rubrik, 1));
]]></php>
</page>


<!-- Seite 4 -->
<page intID="4">
<php intID="9"><![CDATA[
//$rubrik = $rubriken[loopIndex()];
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}
$i=loopToPage('LEnd', $anzahl);
$rubrik = $rubriken[$i];
 
question(id($rubrik, 2));
]]></php>
</page>


<!-- Seite 5 -->
<page intID="5">
<php intID="22"><![CDATA[
//$rubrik = $rubriken[loopIndex()];
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}
$i=loopToPage('LEnd', $anzahl);
$rubrik = $rubriken[$i];

question(id($rubrik, 3));
]]></php>
</page>


<!-- Seite 6 -->
<page intID="6">
<php intID="29"><![CDATA[
//$rubrik = $rubriken[loopIndex()];
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}
$i=loopToPage('LEnd', $anzahl);
$rubrik = $rubriken[$i];
 
question(id($rubrik, 4));
]]></php>
</page>


<!-- Seite 7 -->
<page intID="7">
<php intID="30"><![CDATA[
$rubrik = $rubriken[loopIndex()];
$anzahl = (int)value('GS02');
//Filter: Keine Geschwister
if ($anzahl < 0) {
 goToPage('demografie');
 }
$i=loopToPage('LEnd', $anzahl);
$rubrik = $rubriken[$i];
 
question(id($rubrik, 6));
]]></php>
</page>


<!-- Seite 8 -->
<page ident="LEnd" intID="13">
<php intID="31"><![CDATA[
//$rubrik = $rubriken[loopIndex()];
$anzahl = (int)value('GS02');
// Filter: Keine Geschwister
if ($anzahl < 0) {
  goToPage('demografie');
}
$i=loopToPage('LEnd', $anzahl);
$rubrik = $rubriken[$i];
 
question(id($rubrik, 7));
]]></php>
</page>


</questionnaire>

*****
by SoSci Survey (327k points)
>  sondern wurde mit geraten, das das loopIndex() nicht korrekt zählt ???

Ich bezog mich ausschließlich auf die erste Seite, wo der Loop startet - auf Basis der ursprünglichen Fehlerbeschreibung. Auf den folgenden Seiten darf loopToPage() nicht wiederholt werden, hier ist loopIndex() vollkommen korrekt.
by s101603 (165 points)
Ok, bitte nicht als angriffige Kritik verstehen ;-)  

ich habe es genauso wieder gebaut - mit loopIndex()

Fakt ist, dass es dann crasht, wenn die letzten beiden Seiten mit einem Filter übersprungen werden; dann kommt zwar noch die erste Frage der zweiten Rubrik (=Seite 2, LB01), aber dann kommt die zweite Frage der Rubrik 1 (LA02) mit der Fehlermeldung:
 
"Warnung (Seite 3)
Die Funktion loopIndex() funktioniert nur, wenn Sie zusammen mit loopToPage() verwendet wird."

Debug zeigt an:
******
Information]    Interview Nummer 241 wird fortgesetzt
[Information]    Der Fragebogen qnr4 im Projekt test144687 wird verwendet
[Verarbeitung]    Lese Antworten von Seite 7+8+2
[Information]    Die Verweildauer auf Seite 2 betrug zusätzliche 328 Sekunden
[Information]    Antwort auf LB08_01 = ghj
[Information]    Fragen bisher zu 100% vollständig beantwortet
[Information]    Entsprechend der vorher festgelegten Seitenabfolge wird Seite 3 [] angezeigt
[Verarbeitung]    Erstelle Fragebogen-Seite Nr. 3
[Information]    value("LA08_01") = "Hrifi"
[Inhalt]    Erstelle Frage LA01
[Information]    Folgende Platzhalter sind vorbereitet:
%name% = (Text) Hrifi
*****
Danach bringt er die vorher ausgefüllten Fragen von Rubrik 1 (LA)
by SoSci Survey (327k points)
Ich habe das Gefühl, wir drehen uns hier ein wenig im Kreis. Ich befürchte die Konstruktion mit den Filtern, PHP-Codes und loopToPage() ist ein wenig zu komplex als dass es sich in den Kommentaren hier unten vollständig darstellen lässt.

Wäre es Ihnen recht, wenn ich mir das Projekt einmal direkt ansehe? Wenn ja, dann müssten Sie mir bitte den Namen des Projekts mitteilen, damit ich einen Administrator-Zugang dafür anlegen kann.
by s101603 (165 points)
reshown by s101603
Ja, das ist eine gute Idee, danke; ich hoffe der Link reicht aus:
https://www.soscisurvey.de/admin/index.php?o=Questionnaire&a=edit&id=350084  (Testprojekt 01 - 09/2018)

ab S. 40, da werden die Geschwister gezählt, bis S. 47

Ich habe auch eine Testumgebung gebaut, in dem nur die Schleife läuft:
https://www.soscisurvey.de/admin/index.php?o=Questionnaire&a=edit&id=356091
by s101603 (165 points)
Projektverzeichnis: test144687
by SoSci Survey (327k points)
Dankeschön, ich habe mir die Situation nun einmal angesehen. Vorab: Sie haben 4 (!) Fragebogen unter "Fragebogen zusammenstellen" angelegt. Das ist kein Problem, aber Sie sollten im Auge behalten, dass Sie stets im richtigen Fragebogen arbeiten. Ich habe mir jetzt den "qnr2" angesehen, den Sie oben verlinkt hatten.

GS02 fragt nach der Anzahl der Geschwister (S. 40). Auf Seite 41 ist dann das loopToPage() bis 'LEnd' (S. 47). Soweit alles gut. LA08 wird dann auch korrekt angezeigt. Auch sonst sieht auf den ersten Blick alles bis Seite 47 korrekt aus.

Wenn nun die LA04 (Frage nach dem Todesjahr) angezeigt wird, wird es ein wenig komplizierter. Denn hier ist ein Filter hinterlegt, dass entweder LA06 oder LA07 ausgeblendet wird. Aber wenn die Frage LA04 gar nicht angezeigt wird, dann bleibt der FIlter inaktiv und keine der beiden Fragen wird ausgeblendet. Dies nur als Hinweis.

Aber ansonsten sieht alles korrekt aus. Was muss ich denn auswählen, damit der Fehler auftritt?
by s101603 (165 points)
edited by s101603
Sie müssen in den Zweig gehen, wo nach dem Todesjahr gefragt wird;
Frage LA03 mit "Ja" beantworten, dann in LA04 das Sterbejahr auswählen;
Dann kommt - korrekterweise - LB08 (Name) - und dann - falsch - LA01(Geschlecht) wieder.
by SoSci Survey (327k points)
Nur kurz als Zwischenmeldung: Mit Ihrr Beschreibung kann ich das Problem replizieren. Ich hoffe, dass es sich morgen oder spätestens am Donnerstag beheben lässt.
by SoSci Survey (327k points)
Puh ... der Fehler hatte sich gut versteckt. Aber nun ist er behoben und es funktioniert :)

Der Fehler trat auf, wenn in einer loopToPage()-Schleife nicht nur eine, sondern zwei (oder mehr) Seiten direkt nacheinander übersprungen wurden. Das ist eine relativ seltene Konstellation, deshalb war er nicht früher aufgefallen.

Eine letzte Anmerkung noch. In der Frage "Nennen Sie uns bitte den Namen Ihres Geschwisters." würde ich empfehlen, dass Sie per Platzhalter noch die Nummer des Geschwisters angeben. Zumindest wenn n>1. Das ist lreativ einfach:

if (value('GS02') > 1) {
  replace('%num%', ($i+1).'tes');
} else {
  replace('%num%', '');
}

Der Code muss unter das loopToPage() bzw. loopIndex() und vor das question().
by s101603 (165 points)
edited by s101603
Vielen herzlichen Dank! - Jetzt funktioniert es so, wie es sollte. Auch der Zähler funktioniert, danke für den Tipp! :-)))

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...