0 votes
in SoSci Survey (dt.) by s127586 (120 points)

Hallo Zusammen,

im Rahmen einer Tagebuchstudie möchte ich einen Zufallsgenerator verwenden, durch den eine zufällige Antwort gezogen wird. Wenn die gezogene Antwort nicht existiert (z.B. weil der vorherige Fragebogen an dem Tag nicht ausgefüllt wurde), möchte ich, dass der Zufallsgenerator eine neue Antwort zieht. Mit dem dropvalue-Befehl lösche ich die ursprüngliche Ziehung des Zufallsgenerators, ehe eine neue Ziehung beginnt. Die Ziehung ist dann beendet, wenn eine vorhandene Antwort gezogen wurde. Das Prinzip funktioniert gut. Nur leider wird fälschlicherweise folgende Fehlermeldung angezeigt:

"Dieses Interview versuchte, auf Seite Nr. ## (Kennung .##) zu springen, die bei der Ausgabe der aktuellen Darstellung bereits verarbeitet wurde. Bitte überprüfen Sie, ob goToPage() eine Schleife erzeugt"

Wenn ich diese Fehlermeldung ausblenden könnte, würde der Loop super funktionieren. Sobald ich die Fehlermeldung wegklicke, läuft der Loop auch wie gedacht durch.
Gibt es eine Möglichkeit, diese Fehlermeldung zu umgehen?

Vielen Dank für Ihre Hilfe!

1 Answer

0 votes
by SoSci Survey (306k points)

Bitte posten Sie mal die komplette Debug-Information von der Seite mit der Fehlermeldung.

möchte ich, dass der Zufallsgenerator eine neue Antwort zieht.

Das mit dem dropValue() ist pfiffig, aber ich kann diese Idee nicht gutheißen. Das geht zu weit an der eigentlichen Funktion vorbei.

Es gibt aber eine viel einfachere Lösung. Erstellen Sie eine Liste, welche Werte erlaubt sind (also welche Codes der im Zufallsgenerator hinterlegten Zettel) und rufen Sie den Zufallsgenerator mit dieser Liste als Filter auf.

$erlaubt = [2,4,6];
show('RG01', [
  'filter' => $erlaubt
]);

Die Alternative bestünde darin, dass Sie alle möglichen Werte in zufälliger Reihenfolge ziehen, und in einer FOR-Schleife fix durchsehen, welches davon der erste brauchbare ist.

by s127586 (120 points)
Vielen Dank für die schnelle Antwort!

Die "erlaubt"-Variante scheint mir in meinem Fall keine pragmatische Lösung zu sein. Hier ein paar mehr Infos zur Studie: Im ersten Fragebogen und zweiten Fragebogen des Tages können Teilnehmende jeweils bis zu drei Beschreibungen abgeben. Im zweiten Fragebogen soll dann eine Beschreibung zufällig gezogen werden. Es kann sein, dass eine Teilnehmerin im ersten Fragebogen gar keine Beschreibungen abgegeben hat oder nur eine Beschreibung abgegeben hat etc. (das gleiche gilt für den 2. Fragebogen). Mit der "erlaubt"-Lösung müsste ich viele verschiedene Seiten für jede mögliche Variante anlegen (insgesamt 18 Seiten) oder einen sehr komplexen Code schreiben.
Gibt es vielleicht eine simplere Lösung?

Zur FOR-Schleife versuche ich mich gerade einzulesen; leider habe ich noch keine offiziellen Instruktionen von SosciSurvey gefunden.

Hier ist die Debug-Information:

[Verarbeitung]    Springe zur Seite FTFZUFALL (Nr. 39)
[Verarbeitung]    Erstelle Seite 39 in Fragebogen 3_diary_013
[Inhalt]    Erstelle Frage UX42
[Information]    Vom Zufallsgenerator UX42 wurden folgende Codes gezogen: 4
[Information]    Die Seite zeigt keine Inhalte, automatisch weiter mit Seite Nr. 40
[Verarbeitung]    Erstelle Seite 40 in Fragebogen 3_diary_013
[Information]    value("UX42") = 4
[Information]    value("UX42") = 4
[Information]    value("UX42") = 4
[Information]    value("UX42") = 4
[Verarbeitung]    Springe zur Seite PEOWFTF1 (Nr. 51)
[Verarbeitung]    Erstelle Seite 51 in Fragebogen 3_diary_013
[Verarbeitung]    Springe zur Seite PREZUFALL (Nr. 41)
[Verarbeitung]    Erstelle Seite 41 in Fragebogen 3_diary_013
[Information]    Daten aus Variable UX42_CP gelöscht
[Verarbeitung]    Springe zur Seite FTFZUFALL (Nr. 39)
[Verarbeitung]    Erstelle Seite 39 in Fragebogen 3_diary_013
by SoSci Survey (306k points)
>  Mit der "erlaubt"-Lösung müsste ich viele verschiedene Seiten für jede mögliche Variante anlegen

Nein, eigentlich müssen Sie nur in einer kleinen FOR-Scheife die 6 Variablen für die max. 2x3 Eingabefelder durchsehen, ob dort etwas gespeichert wurde.

Das scheint mir wesentlich unkomplizierter als das Springen quer durch den Fragebogen.

> Zur FOR-Schleife versuche ich mich gerade einzulesen; leider habe ich noch keine offiziellen Instruktionen von SosciSurvey gefunden.

Es handelt sich bei FOR-Schleifen um eine Grundkonstruktion in fast jeder Programmiersprache. Im wesentlichen geht man damit mehrere Zahlen oder eben Variablen durch.

Wie heißen denn Ihre 6 Variablen, wo etwas eingetragen wurde oder nicht?
by s127586 (120 points)
Vielen Dank für die hilfreiche Antwort.
Zurzeit fehlt es mir noch ein Wissen, wie ich die FOR-Schleife benutze - das muss ich mir nun noch aneignen.

> Wie heißen denn Ihre 6 Variablen, wo etwas eingetragen wurde oder nicht?

Man soll mit dem Zufallsgenerator zu eine von 6 Seiten springen, die jeweils eine der 6 Variablen anzeigen. Mittels der Datenbank für Inhalte würde ich dann die drei Beschreibungen aus dem ersten Fragebogen in den zweiten Fragebogen einfügen.
Beispielhaft könnten die Seiten und Variablen folgendermaßen heißen:

Seite01; Variable VA01_01 (erste Beschreibung aus dem ersten Fragebogen)
Seite02; Variable VA01_02 (zweite Beschreibung aus dem ersten Fragebogen)
Seite03; Variable VA01_03 (dritte Beschreibung aus dem ersten Fragebogen)
Seite04; Variable VA01_04 (erste Beschreibung aus dem zweiten Fragebogen)
Seite05; Variable VA01_05 (zweite Beschreibung aus dem zweiten Fragebogen)
Seite06; Variable VA01_06 (dritte Beschreibung aus dem zweiten Fragebogen)
by SoSci Survey (306k points)
Erstmal definieren wir den Zusammenhang zwischen 6 Variablen und 6 Codes (Seiten) als Array:

$vars = [
  'VA01_01' => 1,
  'VA01_02' => 2,
  'VA01_03' => 3,
  'VA01_04' => 4,
  'VA01_05' => 5,
  'VA01_06' => 6
];

Dann brauchen wir eine Variable (ebenfalls ein Array, erstmal ein leeres) zum Sammeln der "erlaubten" Codes.

$codes = [];

Und dann nehmen wir ein FOREACH, um das Array von oben abzuarbeiten.

foreach ($vars as $varID => $code) {}

Inn erhalb der Schleife prüfen wir, ob etwas in der Variable gespeichert wurde, und notieren den Code ggf. in $codes

foreach ($vars as $varID => $code) {
  if (trim(value($varID, 'code:ifany')) != '') {
    $codes[] = $code;
  }
}

Das trim() sorgt dafür, dass Leerzeichen entfernt werden. So, nun haben wir die erlaubten Codes - lassen Sie sich die mal wie folgt im Debug-Modus anzeigen:

debug($codes);

Wenn alles passt, können wir nun ziehen.

show('RG01', [
  'filter' => $codes
]);
by s127586 (120 points)
Vielen Dank, das ist sehr hilfreich.
Leider läuft der Code immer noch nicht reibungslos durch.
Hier ist die Debug-Information:

[Information]    Interview gestartet (neue Nummer 720)
[Information]    Der Fragebogen 3_diary_013 im Projekt BRS wird verwendet
[Verarbeitung]    Erstelle Seite 43 in Fragebogen 3_diary_013
[Information]    value("$mow01ftf01") = ""
[Information]    value("$mow01ftf02") = ""
[Information]    value("$mow01ftf03") = ""
[Information]    value("$eow01ftf01") = ""
[Information]    value("$eow01ftf02") = ""
[Information]    value("$eow01ftf03") = ""
debug()    Inhalt: Array (ohne Elemente)

mow01ftf01 etc. sind die Variablen, die ich über dbGet() aus der Datenbank hole.

so sieht der gesamte Code derzeit bei mir aus:

$keymow01ftf01 = 'mow01ftf01-'.caseSerial();
$mow01ftf01 = dbGet($keymow01ftf01);

$keymow01ftf02 = 'mow01ftf02-'.caseSerial();
$mow01ftf02 = dbGet($keymow01ftf02);

$keymow01ftf03 = 'mow01ftf03-'.caseSerial();
$mow01ftf03 = dbGet($keymow01ftf03);

$keyeow01ftf01 = 'eow01ftf01-'.caseSerial();
$eow01ftf01 = dbGet($keyeow01ftf01);

$keyeow01ftf02 = 'eow01ftf02-'.caseSerial();
$eow01ftf02 = dbGet($keyeow01ftf02);

$keyeow01ftf03 = 'eow01ftf03-'.caseSerial();
$eow01ftf03 = dbGet($keyeow01ftf03);

$vars = [
  '$mow01ftf01' => 1,
  '$mow01ftf02' => 2,
  '$mow01ftf03' => 3,
  '$eow01ftf01' => 4,
  '$eow01ftf02' => 5,
  '$eow01ftf03' => 6
];

$codes = [];

foreach ($vars as $varID => $code) {}

foreach ($vars as $varID => $code) {
  if (trim(value($varID, 'code:ifany')) != '') {
    $codes[] = $code;
  }
}

debug($codes);

show('ZU14', [
  'filter' => $codes
]);
by SoSci Survey (306k points)
Sie haben die Variablennamen als Strings in Ihrem Array. Der Fragebogen sucht also wirklich nach einer Variable mit dem (ungültigen) Namen $mow01ftf01.

Aber Sie scheinen die 6 Variablen ohnehin nicht im aktuellen Fall zu haben, sondern in der Datenbank für Inhalte? Dann fütten Sie Ihr Array wie folgt:

$answers = [
  1 => $mow01ftf01[0],
  2 => $mow01ftf02[0],
  3 => $mow01ftf03[0],
  4 => $eow01ftf01[0],
  5 => $eow01ftf02[0],
  6 => $eow01ftf03[0]
];

Einmal fix kontrollieren:

debug($answers);

Und dann die Schleife noch ein wenig umschreiben:

$codes = [];
foreach ($answers as $code => $answer) {
  if (trim($answer) != '') {
    $codes[] = $code;
  }
}

debug($codes);

Wie sieht es dann aus?
by s127586 (120 points)
Ganz lieben Dank.
Der Code funktioniert nur, wenn alle Beschreibungen im ersten Fragebogen vorhanden sind. Sobald eine Beschreibung jedoch fehlt (z.B., weil der Fragebogen nicht ausgefüllt wurde), kommt eine Fehlermeldung. Sobald diese Fehlermeldung dann weggeklickt ist, läuft es wieder wie geplant.

Hier ist die Debug-Information:

[Information]    Interview Nummer 756 wird fortgesetzt
[Information]    Der Fragebogen 3_diary_013 im Projekt BRS wird verwendet
[Information]    Die Verweildauer auf Seite 35 war 15 Sekunden
[Verarbeitung]    Lese Antworten von Seite 35
[Information]    Antwort auf UX23_01 = 1. Beschreibung
[Information]    Antwort auf UX23_02 = 2. Beschreibung
[Information]    Antwort auf UX23_03 = 3. Beschreibung
[Information]    Fragen bisher zu 100% vollständig beantwortet
[Verarbeitung]    Erstelle Seite 36 in Fragebogen 3_diary_013
[Information]    value("UX23_01") = "1. Beschreibung"
[Information]    value("UX23_02") = "2. Beschreibung"
[Information]    value("UX23_03") = "3. Beschreibung"
[Verarbeitung]    Springe zur Seite SOSCI (Nr. 42)
[Verarbeitung]    Erstelle Seite 42 in Fragebogen 3_diary_013
debug()    Inhalt: 04, 15, 26
[Information]    Vom Zufallsgenerator ZU14 wurden folgende Codes gezogen: 5

Hier ist die Fehlermeldung:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Trying to access array offset on value of type bool
Zeile: 22

PHP-Code

019 $eow01ftf03 = dbGet($keyeow01ftf03);
020
021 $answers = [
022   1 => $mow01ftf01[0],
023   2 => $mow01ftf02[0],
024   3 => $mow01ftf03[0],
025   4 => $eow01ftf01[0],
Fehler im Fragebogen: Trying to access array offset on value of type bool
Zeile: 23

PHP-Code

020
021 $answers = [
022   1 => $mow01ftf01[0],
023   2 => $mow01ftf02[0],
024   3 => $mow01ftf03[0],
025   4 => $eow01ftf01[0],
026   5 => $eow01ftf02[0],
Fehler im Fragebogen: Trying to access array offset on value of type bool
Zeile: 24

PHP-Code

021 $answers = [
022   1 => $mow01ftf01[0],
023   2 => $mow01ftf02[0],
024   3 => $mow01ftf03[0],
025   4 => $eow01ftf01[0],
026   5 => $eow01ftf02[0],
027   6 => $eow01ftf03[0]


Ich möchte mich nochmal für den wirklich hervorragenden Support bedanken!
by SoSci Survey (306k points)
> Trying to access array offset on value of type bool

Oh ja, guter Punkt. dbGet() liefert false, wenn es nichts findet. Da gibt es dann kein [0]. Kein Problem - man kann hier ein "IF" mit ?...: direkt in die Zeile schreiben.

$answers = [
  1 => $mow01ftf01 ? $mow01ftf01[0] : '',
  2 => $mow01ftf02 ? $mow01ftf02[0] : '',
  3 => $mow01ftf03 ? $mow01ftf03[0] : '',
  4 => $eow01ftf01 ? $eow01ftf01[0] : '',
  5 => $eow01ftf02 ? $eow01ftf02[0] : '',
  6 => $eow01ftf03 ? $eow01ftf03[0] : ''
];
by s127586 (120 points)
Vielen Dank! Die Testläufe haben allesamt funktioniert. Ich bin also zuversichtlich, dass der Code nun richtig ist.

Fürs Protokoll der Code, der nun gut durchläuft:

$keymow01ftf01 = 'mow01ftf01-'.caseSerial();
$mow01ftf01 = dbGet($keymow01ftf01);

$keymow01ftf02 = 'mow01ftf02-'.caseSerial();
$mow01ftf02 = dbGet($keymow01ftf02);

$keymow01ftf03 = 'mow01ftf03-'.caseSerial();
$mow01ftf03 = dbGet($keymow01ftf03);

$keyeow01ftf01 = 'eow01ftf01-'.caseSerial();
$eow01ftf01 = dbGet($keyeow01ftf01);

$keyeow01ftf02 = 'eow01ftf02-'.caseSerial();
$eow01ftf02 = dbGet($keyeow01ftf02);

$keyeow01ftf03 = 'eow01ftf03-'.caseSerial();
$eow01ftf03 = dbGet($keyeow01ftf03);

$answers = [
  1 => $mow01ftf01 ? $mow01ftf01[0] : '',
  2 => $mow01ftf02 ? $mow01ftf02[0] : '',
  3 => $mow01ftf03 ? $mow01ftf03[0] : '',
  4 => $eow01ftf01 ? $eow01ftf01[0] : '',
  5 => $eow01ftf02 ? $eow01ftf02[0] : '',
  6 => $eow01ftf03 ? $eow01ftf03[0] : ''
];

debug($answers);

$codes = [];

foreach ($answers as $code => $answer) {
  if (trim($answer) != '') {
    $codes[] = $code;
  }
}

show('ZU14', [
  'filter' => $codes
]);

Vielen Dank nochmal für die große Unterstützung!

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

...