0 votes
in SoSci Survey (dt.) by s111639 (130 points)
edited by s111639

Hallo,

ich plane eine Tagebuchstudie mit 7 täglichen Befragungen und einer Baseline-Erhebung. Um zu prüfen, dass die VPN mindestens 5 Fragebögen bearbeitet haben, habe ich folgenden Code entwickelt. Nur VPN, die dieses Kriterium erfüllen sollen einen Code erhalten, den sie mir senden können, um die VPN-Stunden zu erhalten. Es treten aber Probleme auf.

Hier der PHP-Code:

put('AB04_01', caseSerial());
statistic('count', 'AB04_01', caseSerial());
if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{text('AB02');} 
else {text('AB05');}

statistic('count', 'AB04_01', caseSerial());
if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{question('AB06');} 
{replace('%code%', 'AB06', 'response');
html('<p>Ihr Code ist: <strong>%code%</strong></p>');}

--> Ist es überhaupt in Ordnung selbst Seriennummern anzulegen, um diese in den Zufallsgenerator für die Vergabe eines Codes einzuspeisen oder entsehen dadurch Probleme, weil ja jeder VPN auch durch die Serienmail Funktion eine Seriennummer zugeordnet wird?

--> eigentlich wollte ich noch folgenden Befehl benutzen, damit eine Fehlermeldung angezeigt wird, wenn die Urne leer ist. Dies erzeugt jedoch eine Fehlermeldung, weil die entsprechende Variable nicht im Fragebogen auftaucht

if (value('AB01_CP') > 0) {text('AB03');} else

Kann ich den Befehl weglassen, wenn ich eine großzügige Anzahl an Seriennummern verwende?

debug(statistic('count', 'AB04_01', caseSerial()));

--> hier zeigt der Funktionstest an :
Debug-Information für statistic('count', 'AB04_01', caseSerial()):
statistic('count', 'AB04_01', caseSerial()) = 0 (integer)

Ist das so korrekt?

1 Answer

0 votes
by SoSci Survey (305k points)

Ist es überhaupt in Ordnung selbst Seriennummern anzulegen, um diese in den Zufallsgenerator für die Vergabe eines Codes einzuspeisen

Sie arbeiten ja mit Serienmails. Dabei wird jedem Eintrag in der Adressliste automatisch eine Personenkennung zugewiesen, die in allen seinen Interviews als "SERIAL" vermerkt wird. Sie legen also gar keine Seriennummern an - das macht die Serienmail-Funktion.

eigentlich wollte ich noch folgenden Befehl benutzen, damit eine Fehlermeldung angezeigt wird, wenn die Urne leer ist.

Ich würde Ihnen auf jeden Fall so ein "Sicherheitsnetz" empfehlen. Man kann ja nie wissen. Natürlich sollten Sie trotzdem mehr als genug Codes in den Zufallsgenerator legen.

hier zeigt der Funktionstest an :
statistic('count', 'AB04_01', caseSerial()) = 0 (integer)

Das bedeutet, dass mit der aktuellen Seriennummer noch kein einziger (FINISHED=1) Fall im Datensatz liegt. Starten Sie mal einen Fragebogen im Debugging-Modus und direkt nach dem Start hängen Sie oben in der Adresszeile des Browsers eine Seriennummer an, also ...&s=Test001, dann mit der EIngabeteste bestätigen und im Fragebogen auf "Weiter" klicken.

Wenn Sie das korrekt gemacht haben, sollten unter "Erhobene Daten" -> "Daten ansehen" in der Variable "SERIAL" der Code "Test001" angezeigt werden. Füllen Sie den Fragebogen komplett aus, damit er in der statistic()-Zählung erscheint.

Dann rufen Sie den Fragebogen mit dem statistic() nochmal auf und hängen auch dort die Seriennummer an den Link an. Nochmal mit der Eingabetaste bestätigen ... und wenn alles korrekt läuft sollte dann angezeigt werden

statistic('count', 'AB04_01', caseSerial()) = 1 (integer)

Wenn hier nun die 1 steht (=es liegt ein Fall zu der Seriennummer vor), dann sollte es soweit passen. Wichtig ist, dass Sie das put() in jedem Ihrer Fragebögen machen, damit dieser in der statistic()-Funktion gezählt wird.

Ach ja, Vorsicht bitte mit diesem Code, den Sie oben gepostet haben:

if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{question('AB06');} 
{replace('%code%', 'AB06', 'response');
html('<p>Ihr Code ist: <strong>%code%</strong></p>');}

Ich formatiere das mal ein wenig anders:

if (statistic('count', 'AB04_01', caseSerial()) >= 5) {
  question('AB06');
} 
{
  replace('%code%', 'AB06', 'response');
  html('<p>Ihr Code ist: <strong>%code%</strong></p>');
}

Da steht kein else zwischen der oberen und unteren Klammer. Das heißt: Der zweite Teil wird immer ausgeführt - unabhängig vom IF. Ich glaube, Sie möchten eigentlich das hier:

if (statistic('count', 'AB04_01', caseSerial()) >= 5) {
  question('AB06');
  replace('%code%', 'AB06', 'response');
  html('<p>Ihr Code ist: <strong>%code%</strong></p>');
}
by s111639 (130 points)
edited by s111639
Vielen Dank!

Ich meinte mit den Seriennummern eher jene, die ich den VPN zuteile, damit sie am Gewinnspiel teilnehmen können und habe mich gefragt, ob es zu Komplikationen kommen kann, wenn zusätzlich zu den Kennungen (Serienmail) Sereinnummern angelegt werden. Aber wenn die Serienmail-Funktion die Personenkennung automatisch zuweist, sollte es ja nicht problematisch sein, den VPN zusätzlich am Ende der Befragung noch eine Nummer von der Liste mit den Seriennummern zuzuordnen, oder?

Die Fehlermeldung bei der Erstellung des Sicherheitsnetzes kam wohl daher, dass der Zufallsgenerator vorher im Fragebogen nicht aufgetaucht ist. Ich habe ihn daher auf einer vorigen Seite eingefügt, ohne den Wert anzeigen zu lassen, nun müsste es funktionieren.  

Das ist nun der PHP-Code:

put('AB04_01', caseSerial());
statistic('count', 'AB04_01', caseSerial());
if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{text('AB02');}
else {text('AB05');}

statistic('count', 'AB04_01', caseSerial());
if ((statistic('count', 'AB04_01', caseSerial()) >= 5) and (value('AB06_CP') == 0))
{question('AB06');replace('%code%', 'AB06', 'response');
html('Ihr Code ist: %code%'); }  
 
if ((value('AB06_CP') > 0) and (statistic('count', 'AB04_01', caseSerial()) >= 5))
{text('AB03');}

debug(statistic('count', 'AB04_01', caseSerial()));

AB06_CP beschreibt die Anzahl der Leerungen der Urne.

Vielen Dank für die Anmerkung zum unteren Code, ich habe ihn abgeändert und auch der Test im Debugging-Modus hat funktioniert.

Für die Testung der Serienmails muss der Befragungszeitraum ja bereits begonnen haben, kann man ihn dann nach der Testung wieder deaktivieren?
by SoSci Survey (305k points)
> Ich meinte mit den Seriennummern eher jene, die ich den VPN zuteile, damit sie am Gewinnspiel teilnehmen können

Aha! Nein, diese Gewinnspiel-Codes aus dem Zufallsgenerator haben mit den Seriennummern /persönliche Kennungen) der Serienmail-Funktion nichts zu tun.

> Ich habe ihn daher auf einer vorigen Seite eingefügt, ohne den Wert anzeigen zu lassen, nun müsste es funktionieren.

Eigentlich sollten Sie ihn gar nicht einbinden, sondern nur (!) mit dem question('AB06') einbinden, wenn der Teilnehmer auch einen Code bekommt. So lässt sich später im Datensatz nachvollziehen, wer einen Code bekommen hat (und es wird nicht für jeden einer gezogen).

> Für die Testung der Serienmails muss der Befragungszeitraum ja bereits begonnen haben, kann man ihn dann nach der Testung wieder deaktivieren?

Es sollte ausreichen, wenn Sie bei den Testadress-Einträgen das Kästchen "Fragebogen im Debugging-Modus starten" aktivieren. Allerdings bin ich da nicht 100%ig sicher. Falls nicht, können Sie nach Ende des Tests einfach einen neuen Befragungszeitraum einstellen, ja.
by s111639 (130 points)
>Eigentlich sollten Sie ihn gar nicht einbinden, sondern nur (!) mit dem question('AB06') einbinden, wenn der Teilnehmer auch einen Code bekommt.

Stimmt, daran habe ich garnicht gedacht. Allerding erscheint dann folgende Fehlermeldung.

Die Variable AB06_CP wurde im Laufe dieses Interviews auf keiner vorhergehenden Seite abgefragt. Daher kann die Funktion value() keinen Antwort-Wert ermitteln.

Wie kann ich das verhindern?
>Es sollte ausreichen, wenn Sie bei den Testadress-Einträgen das Kästchen "Fragebogen im Debugging-Modus starten" aktivieren
 
Die Testadress-Einträge kann man erst erstellen, wenn der AVV-Vertrag abgeschlossen ist, oder?
by SoSci Survey (305k points)
> Die Variable AB06_CP wurde im Laufe dieses Interviews auf keiner vorhergehenden Seite abgefragt. Daher kann die Funktion value() keinen Antwort-Wert ermitteln.

In diesem Fall passt die Reihenfolge vermutlich noch nicht. Das question('AB06') muss vor dem value('AB01_CP') kommen.

> Die Testadress-Einträge kann man erst erstellen, wenn der AVV-Vertrag abgeschlossen ist, oder?

Erst dann kann man die Serienmail-Funktion nutzen, ja. SoSci Survey weiß ja nicht, dass Sie nur Dummies eintragen möchten. Und leider hatten im vergangenen Jahr die meisten Nutzer sich nicht um einen AVV gekümmert. Deshalb mussten wir nun software-seitig ein wenig mehr motivieren...
by s111639 (130 points)
Der Code lautet:

put('AB04_01', caseSerial());
statistic('count', 'AB04_01', caseSerial());
if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{text('AB02');}
else {text('AB05');}

statistic('count', 'AB04_01', caseSerial());
if ((statistic('count', 'AB04_01', caseSerial()) >= 5) and (value('AB06_CP') == 0))
{question('AB06');replace('%code%', 'AB06', 'response'); html('Ihr Code ist: %code%'); }  

if ((value('AB06_CP') > 0) && (statistic('count', 'AB04_01', caseSerial()) >= 6))
{text('AB03');}


debug(statistic('count', 'AB04_01', caseSerial()));

Für die Funktion value() ist wohl wichtig, dass nur solche Antworten abgefragt werden können, welche der Teilnehmer auf einer früheren Fragebogen-Seite angegeben und bereits mit „Weiter“ an den Server übermittelt hat. Daher reicht es nicht aus, wenn der question() Befehl vor AB06_CP auftaucht. Wenn die Frage mit Filter auf der vorherigen Seite eingebaut wird:

if ((statistic('count', 'AB04_01', caseSerial()) >= 5) {question('AB06');}

erscheint die Fehlermeludng trotzdem noch, da die Frage ja nur für jene VPN, die auch das Mindestkriterium erfüllen, den Code würfelt. Wenn ich sie komplett einbinde, funktioniert es ohne Fehlermeldung, dann erhält allerdings jeder einen Code.

Gibt es eine Möglichkeit nur die Variable AB06_CP einzubinden? Mit dem question() Befehl gibt es eine Fehlermeldung.
by SoSci Survey (305k points)
Ich hatte es schon ein paar mal geschrieben ... es ist auch nicht wirklich relevant. Aber wenn Sie die einsamen Zeilen

> statistic('count', 'AB04_01', caseSerial());

weglassen, wird es ein wenig übersichtlicher. Diese Zeilen haben außerhalb des IF keine Funktion.

Die Fehlermeldung stammt von dieser Zeile:

if ((statistic('count', 'AB04_01', caseSerial()) >= 5) and (value('AB06_CP') == 0))
{question('AB06');replace('%code%', 'AB06', 'response'); html('Ihr Code ist: %code%'); }

Und zwar wird das _CP hier abgefragt, bevor die Ziehung erfolgt. Lösung: Zwei IF-Filter ineinander und das question() dazwischen:

if (statistic('count', 'AB04_01', caseSerial()) >= 5) {
  question('AB06');
  if (value('AB06_CP') == 0) {
    replace('%code%', 'AB06', 'response');
    html('Ihr Code ist: %code%');
  } else {
    ...
  }
}
by s111639 (130 points)
gut, ich habe die überflüssige Zeile entfernt!

Vielen Dank! Es funktioniert jetzt ohne Fehlermeldung.

Noch eine letzte Frage:

Zählt dann auch der Fragebogen für den Opt-In Mail Verteiler in die Zählung hinein und werden die abgeschlossenen Fragebögen im Debug-Modus auch unter einem SERIAL gezählt? Weil der Befehl mittlerweile folgendes Ergebnis erzeugt, obwohl ich kein  ...&s=Test001 angefügt habe:

statistic('count', 'AB04_01', caseSerial()) = 5 (integer)
by SoSci Survey (305k points)
> Zählt dann auch der Fragebogen für den Opt-In Mail Verteiler in die Zählung hinein

Nur, wenn Sie auch dort die SERIAL mittels put() in die interne Variable AB01_01 kopieren.

> und werden die abgeschlossenen Fragebögen im Debug-Modus auch unter einem SERIAL gezählt?

Ja, im Debug-Modus werden auch Debug-Datensätze mitgezählt. Sonst wäre das mit dem Testen ziemlich müßig :)
by s111639 (130 points)
Danke für die Rückmeldung!

Ist folgender Code korrekt und sollte ohne Fehlermeldung funktionieren?

Es gibt nun zusätzlich eine weitere Frage für VPN, die 5 der Befragungen bearbeitet haben, die nur dann angezeigt werden soll, wenn diese Bedingung erfüllt ist. Ich habe dazu den mittleren if-Befehl ergänzt, das müsste stimmen, oder?

put('AB04_01', caseSerial());
statistic('count', 'AB04_01', caseSerial());
if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{text('AB02');}
else {text('AB05');}

if (statistic('count', 'AB04_01', caseSerial()) >= 5)
{question('AB08');}

if (statistic('count', 'AB04_01', caseSerial()) >= 5) {
  question('AB06');
  if (value('AB06_CP') == 0) {
    replace('%code%', 'AB06', 'response');
    html('Ihr Code ist: %code%');
  } else {text('AB03');}}

debug(statistic('count', 'AB04_01', caseSerial()));
by SoSci Survey (305k points)
> Ist folgender Code korrekt und sollte ohne Fehlermeldung funktionieren?

Das kann der Fragebogen deutlich besser beantworten als ich :)

Was ich sagen kann, ist dass die folgende Zeile keine Funktion übernimmt:

> statistic('count', 'AB04_01', caseSerial());

Im darunter stehenden Filter ergobt deren Verwendung hingegen Sinn.

Weniger sinnvoll (aber nicht zwangsläufig falsch) ist es, dass Sie denselben Filter gleich 3-mal verwenden. Eigentlich würde man das alles in denselben Filter schreiben.
by s111639 (130 points)
es handelt sich um eine Tagebuchstudie, die schon im Feld ist, weshalb ich mich nicht getraut habe, den Code mit der Ergänzung nochmals zu testen (es hat allerdings noch niemand den betreffenden Fragebogen sieben gemacht).

Ist es möglich während der laufenden Befragung einen neuen Fragebogen anzulegen und es dort zu testen oder was würden Sie empfehen?

statistic('count', 'AB04_01', caseSerial()); --> Es würde aber nicht schaden, wenn ich die Zeile drin lasse, auch wenn sie überflüssig ist, oder?

Ok gut, ich habe mich für die umständliche Version entschieden, weil das für mich weniger Fehlerpotential hatte. Wenn es nicht falsch, sondern nur umständlich ist, würde ich es daher so lassen.
by SoSci Survey (305k points)
> Ist es möglich während der laufenden Befragung einen neuen Fragebogen anzulegen und es dort zu testen oder was würden Sie empfehen?

Ja. Sie sollten nur aufpassen, dass unter "Fragebögen verwalten" nachher noch der richtige Fragebogen als "Standard" ausgewählt ist, falls das relevant ist.

> Es würde aber nicht schaden, wenn ich die Zeile drin lasse, auch wenn sie überflüssig ist, oder?

Korrekt.

> Wenn es nicht falsch, sondern nur umständlich ist, würde ich es daher so lassen.

Ja, das scheint mir sinnvoll - außer, wenn Sie ohnehin in einem zweiten Fragebogen noch testen.
by s111639 (130 points)
edited by s111639
Gut, das habe ich jetzt versucht. Der Befehl:

debug(statistic('count', 'AB04_01', caseSerial()));
zeigt mir allerdings eine Zahl größer als 290 an, liegt das daran, dass im Debug-Modus schon so viele Fragebogen gemacht wurden? Wenn die VPN das mit der Seriennummer machen, sollte ja dann die richtige Anzahl bearbeitete Fragebögen berechnet werden?

Das hatte ich mit dem alten Befehl auch eigentlich schonmal getestet.

Wenn ich eine Test-Seriennummer anhänge und der Wert für den Befehl 0 ist, wird aber wie gewünscht nur ein Text angezeigt.

Ist es normal, dass Codes, die im Debug-Modus gezogen werden, beim Zufallsgenerator nicht als gezogen vermerkt werden? Die entsprechenden Variablen sind bei mir immer noch als 0 x gezogen aufgelistet.

Den debug Befehl habe ich jetzt im Fragebogen fürs Feld gelöscht!
by SoSci Survey (305k points)
> zeigt mir allerdings eine Zahl größer als 290 an, liegt das daran, dass im Debug-Modus schon so viele Fragebogen gemacht wurden?

Ja, im Debug-Modus werden auch Debug-Interviews mitgezählt - damit man die statistic()-Funktion testen kann.

> Wenn die VPN das mit der Seriennummer machen, sollte ja dann die richtige Anzahl bearbeitete Fragebögen berechnet werden?

Ja.

> Ist es normal, dass Codes, die im Debug-Modus gezogen werden, beim Zufallsgenerator nicht als gezogen vermerkt werden?

Wenn das Projekt im Feld ist, ja. Sonst würde man sich ja beim Testen die Ziehung verzerren.

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

...