Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Zufallsauswahl: Maximal 3 Fragen anzeigen, wenn mehr als 3 "Y" ausgewählt wurden

  • ngolub
  • ngolub's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 weeks 3 days ago - 2 weeks 2 days ago #268471 by ngolub
 Hallo zusammen

Ich habe in meiner Limesurvey-Umfrage (Frage 6.1) zehn sogenannte Handlungsfelder, bei denen die Befragten jeweils "Y" oder "N" auswählen können (Mehrfachauswahl). Wenn jemand mehr als drei Handlungsfelder mit "Y" markiert, sollen in einer späteren Fragegruppe nur drei Follow-up-Fragen zufällig angezeigt werden. Wenn drei oder weniger mit "Y" ausgewählt wurden, sollen einfach die ausgewählten Handlungsfelder erscheinen. Aktuell habe ich unter jeder Frage eine einfache Bedingung:
Code:
((handlungsfeld_1.NAOK == "Y"))
((handlungsfeld_2.NAOK == "Y"))
...
((handlungsfeld_10.NAOK == "Y"))
Meine Frage: Wie kann ich das so ändern, dass bei mehr als drei ausgewählten Handlungsfeldern nur drei davon zufällig auftauchen, damit der Fragebogen nicht zu lang wird? (Wenn bei 6.1 mehr als 3 Handlungsfelder mit 6.1=="Y", dann per Zufall drei HF auswählen.)Ich freue mich über jeden Tipp oder Trick zu Expression Manager, JavaScript oder anderen Ideen, wie ich das optimal umsetzen kann.
Last edit: 2 weeks 2 days ago by ngolub.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 3 days ago - 2 weeks 3 days ago #268473 by Joffm
Hallo,
dies ist nahezu 1:1 in meinem "Tutorial 4: Gleichungen, Zufall" in Kap. 3.3.1. beschrieben (wo nach Initialisierung der "Urne" das Procedere von 3.2.2. verwendet wird, um die 3 rauszusuchen. (nur ExpressionScript)

Tutorial findest Du hier auf Seite 17 +-.

Und als javascript-Lösung (sehr ähnlich Kap. 3.2.1):
Nach der Initialisierung in einer Gleichung (QBase) eigentlich das "Standardscript" für solche Dinge.
In einer Frage vom Typ "kurzer Text" (QRes)
Code:
<script type="text/javascript" charset="utf-8">
 
  function shuffle(array) {
    var currentIndex = array.length, temporaryValue, randomIndex;
    // While there remain elements to shuffle...
    while (0 !== currentIndex) {
      // Pick a remaining element...
      randomIndex = Math.floor(Math.random() * currentIndex);
      currentIndex -= 1;
      // And swap it with the current element.
      temporaryValue = array[currentIndex];
      array[currentIndex] = array[randomIndex];
      array[randomIndex] = temporaryValue;
    }
    return array;
  }
 
$(document).on('ready pjax:scriptcomplete',function(){
  var arr = [];
  var base='{QBase}';
  arr = base.split("");  
  arr = shuffle(arr).join('').slice(0, 3)
  $('#question{QID} input[type="text"]').val('#'+arr);
  $('#question{QID}.hide();
});
</script>

QBase meinetwegen in Gruppe 6
Das script (QRes) dann in eine andere Gruppe, eben 7


In beiden Fällen hast Du dann als Bedingungen in Frage 9:
strpos(QRes,"A")>0
strpos(QRes,"B")>0
strpos(QRes,"C")>0
...

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 2 weeks 3 days ago by Joffm.

Please Log in to join the conversation.

  • ngolub
  • ngolub's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 weeks 3 days ago - 2 weeks 2 days ago #268478 by ngolub
Hallo Joffm,vielen Dank für dein Tutorial! Ich habe es bei mir implementiert, inklusive "eqUrne", aber es funktioniert leider nicht.Mir ist aufgefallen, dass bei den eqRand-Gleichungen, die ich von dir übernommen habe, schließende Klammern fehlten. Diese habe ich ergänzt, aber das Problem besteht weiterhin. Die Randomisierung der Fragenauswahl bei Frage 9 funktioniert nicht, was vermutlich mit der Auswahl der Objekte bei der Mehrfachnennung in Frage 6.1 zusammenhängt.Kannst du einen Fehler bei mir finden? Ich habe meine .lss-Datei angehängt. Alle "eqFragen" befinden sich in Gruppe 6, und die Fragen, die ich durch die Randomisierung aktivieren möchte, befinden sich in Gruppe 9.

Noah
 

 
Last edit: 2 weeks 2 days ago by ngolub.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 3 days ago #268479 by Joffm
Hallo,
naja,
eqBase1 ist ja völlig falsch. Du musst doch hier eine Basis schaffen, die den ausgewählten Feldern entspricht.
Wie in 3.3.1.

Die Mehrfachnennungsfrage möge Q1 heißen mit den Teilfragencodes „Y001“, „Y002“, „Y003“,…Dann sagen wir:Wenn die Teilfrage 1 ausgewählt wurde (Q1_Y001==“Y“), dann füge ein „A“ hinzu, sonst nichts.
Und dies für alle Teilfragen.{join(if(Q1_Y001==“Y“,“A“,““),if(Q1_Y002==“Y“,“B“,““),if(Q1_Y003==“Y“,“C“,““),…,if(Q1_Y012==“Y“,“L“,““))}Damit haben wir die Urne gefüllt.

Das hast Du zwar in eqUrne gemacht, benutzt aber in der Folge immer wieder eqBase.

Und wozu dient hier eqLaenge?
Dies war doch nur nötig um bei dreistelligen Kennzeichen für die "Kugeln in der Urne" die richtige Länge zu bestimmen.
Du hast in eqUrne aber nur einstellige Kennzeichen.

Joffm

Und: Ja, stimmt; es fehlen die schließenden Klammern bei is_empty()

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

  • ngolub
  • ngolub's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 weeks 3 days ago #268480 by ngolub
Alles klar, dann lösche ich eqBase1 und eqLaenge.Muss ich anschließend, wie bei eqBase, dasselbe für eqUrne tun? Sprich, eqUrne2
Code:
{str_replace(eqZahl1, "", eqUrne)}
und eqUrne3
Code:
{str_replace(eqZahl1, "", eqUrne2)}
erstellen?

Please Log in to join the conversation.

  • ngolub
  • ngolub's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 weeks 3 days ago #268485 by ngolub
Hallo Joffm

Ich habe das Ganze nochmals mit der Javascript-Lösung versucht, aber es funktioniert nicht bei mir.

Ich habe drei Teile:
  1. Die Gleichung "QBase" in Gruppe 6
  2. Das Javascript "QRes" in Gruppe 7
  3. Die Bedingungen strpos(QRes,"A")>0, strpos(QRes,"B")>0, strpos(QRes,"C")>0, ... in Gruppe 9
Für QBase verwende ich die folgende Gleichung im Fragetextfeld (Fragetyp: short free text):

{join(if(handlungsfeld_1.NAOK == "Y","A",""), if(handlungsfeld_2.NAOK == "Y","B",""), if(handlungsfeld_3.NAOK == "Y","C",""), if(handlungsfeld_4.NAOK == "Y","D",""), if(handlungsfeld_5.NAOK == "Y","E",""), if(handlungsfeld_6.NAOK == "Y","F",""), if(handlungsfeld_7.NAOK == "Y","G",""), if(handlungsfeld_8.NAOK == "Y","H",""), if(handlungsfeld_9.NAOK == "Y","I",""), if(handlungsfeld_10.NAOK == "Y","J",""))}
 

Für QRes verwende ich deinen Code Fragetyp: short free text):
Code:
<script type="text/javascript" charset="utf-8">
 
  function [url=http://www.php.net/shuffle]shuffle[/url]([url=http://www.php.net/array]array[/url]) {
    var currentIndex = [url=http://www.php.net/array]array[/url].length, temporaryValue, randomIndex;
    // While there remain elements to shuffle...
    while (0 !== currentIndex) {
      // Pick a remaining element...
      randomIndex = Math.[url=http://www.php.net/floor]floor[/url](Math.random() * currentIndex);
      currentIndex -= 1;
      // And swap it with the current element.
      temporaryValue = [url=http://www.php.net/array]array[/url][currentIndex];
      [url=http://www.php.net/array]array[/url][currentIndex] = [url=http://www.php.net/array]array[/url][randomIndex];
      [url=http://www.php.net/array]array[/url][randomIndex] = temporaryValue;
    }
    return [url=http://www.php.net/array]array[/url];
  }
 
$(document).on('ready pjax:scriptcomplete',function(){
  var arr = [];
  var base='{QBase}';
  arr = base.[url=http://www.php.net/split]split[/url]("");  
  arr = [url=http://www.php.net/shuffle]shuffle[/url](arr).[url=http://www.php.net/join]join[/url]('').slice(0, 3)
  $('#question{QID} input[type="text"]').val('#'+arr);
  $('#question{QID}.hide();
});
</script>
Die Bedingungen sind bei den entsprechenden Fragen in Gruppe 9 aufgeführt
 

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
2 weeks 3 days ago #268488 by Joffm
Hallo,
ich habe jetzt erst gesehen, dass diese ganzen Fragen ja vom Typ "langer Text" waren.
Dann kann ja alles nicht funktionieren.

Ich habe einmal die gesamte Logik in die Gruppe GCalc ausgelagert.
Außerdem eqUrne qieder in eqBase1 geändert (war einfacher als den Rest auf eqUrne zu ändern)

Und dann sah ich diese Bedingung
((handlungsfeld_1.NAOK == "Y")) or ((regexMatch("/strpos(eqFinal,“A“)>0/",semester.NAOK)))
1. ist der erste Term ja absolet; wir benutzen ja nur die ausgewählten Felder
2. Ich wusste nicht, dass auch die Frage "semester" eine Rolle spielt.
3. Was soll diese RegEx da?
Ich sehe, Du wolltest den "Bedingungsdesigner" benutzen.
Bitte streiche dieses Gerät aus Deinem Gedächtnis. Es ist total veraltet. Heute arbeiten wir mit ExpressionScript
Die Bedingung lautet ha einfach
strpos(eqFinal,"A")>0
strpos(eqFinal,"B")>0
...


Außerdem gibt es in Gruppe 7 die javascript-Lösung.
Sie geift auf dieselbe Variable "eqBase1" zu.
Und das Ergebnis ist wieder ein String der Art "#CGB".
D.h. die Bedingung der Fragen bleibt; Du musst nur auf den richtigen Heuhaufen zugreifen

 

File Attachment:

File Name: limesurvey...5528.lss
File Size:814 KB


Joffm

P.S.
In Deinem neuen Versuch hast Du schon wieder statt einer "Gleichungs"-Frage (QBase) eine Frage vom Typ "kurzer Text" genommen.
Das bringt Dir doch nur einen Fragetext, aber nichts anderes. Du willst den Wert der Funktion doch speichern und irgendwann weiterbenutzen.

Wie ist denn dieser URL-Teil in die array-Funktionen "split" und "shuffle" gekommen?
Hat der Editor wieder einmal gesponnen?
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: ngolub

Please Log in to join the conversation.

  • ngolub
  • ngolub's Avatar Topic Author
  • Offline
  • Senior Member
  • Senior Member
More
2 weeks 2 days ago #268500 by ngolub
Hallo Joffm,

vielen Dank für deine Hilfe! Es klappt jetzt endlich, und ich verstehe auch, warum. Ich hatte nicht verstanden, dass alle Fragen den Fragetyp "Gleichung" haben müssen.

Danke auch für den Hinweis mit dem Bedingungsdesigner. Das hatte zu der komischen Regex/Semester-Bedingung geführt, die eigentlich strpos(eqFinal, "A") > 0 hätte sein sollen. Ab jetzt nutze ich nur noch ExpressionScript.

Herzlichen Dank!

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose