Welcome to the LimeSurvey Community Forum

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

100 Datensätze je Teilnehmer mit Bearbeitungsmöglichkeit durch die Antwortenden

More
6 months 3 weeks ago #269173 by BlackSwan
Danke Joffm,

Wäre aber vielleicht sinnvoll, um nicht 500 Quoten anlegen zu müssen.
Dann ginge wohl {if(statcountif(SourceID.sgqa,SourceID.NAOK)>grplimit,0,1)}
Hier kannst/musst Du dann das Limit der Gruppe mit übergeben, wobei ich aber denke, dies sollte man innerhalb der Umfrage vorhalten.
Dann genügt eine Quote mit Limit 0, die den Teilnehmer im Falle von "0" rausschmeißt (denn dann wurde ja das Limit der Gruppe überschritten.

Genau das war meine Intention. Danke!

Du vergibst doch URLs nur mit gültiger GruppenID.
Meinst Du, dass jemand einfach einen anderen Parameter anhängt und dann die Umfrage beantwortet?

Ja genau. Der Fragebogen soll über Jahre laufen und Daten sammeln. Im offen Modus läuft der Basislink ja nie ab. Daher würde ich dem gerne vorbeugen, dass genau das passiert und sich jemand eine eigene Gruppe erstellt. 

Das Szenario ist bereits realistisch. Alle bekommen die gleichen Fragen. Die Auswertung erfolgt gestaffelt auf unterschiedlichen Ebenen:
  1. Über die Gruppen hinweg. (Deshalb soll es alles in Befragung liegen)
  2. Auswertung nach Gruppen
  3. Auswertung Subgruppen, die durch den Teilnehmenden angegeben werden.

 

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269174 by Joffm

Die Quellen kommen laufenden hinzu. Das hinterlegen in einer versteckten Frage ist eine Option. Ich müsste die dann aber laufend aktualisieren

Lass mal die Kirche im Dorf. Das ist ja wirklich kein Problem.
Du müsstest ja nur die neuen Werte - wohl strukturiert, wenn Du immer noch das Limit, das Anfangs-, Enddatum, usw. zusätzlich hinterlegen willst - in die "default"-Antwort einer Frage vom Typ "langer Text" hinzukopieren.

Aber wenn Du etwas hast, was Dir Links kreiert, dann könntest Du auch in eine csv-Datei schreiben, und - wie bereits geschrieben - mit "papaparse" die Werte einlesen.

Wie holch, mach bitte einmal ein mehr oder weniger (eher mehr) realistisches Beispiel.

Joffm
 

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

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269176 by BlackSwan
Also "papaparse" schaue ich mir an. 

Die Quota habe ich nun per JS gelöst. Beispiel als lss für alle die mal vor einem ähnlichen Problem stehen wie ich. Deine Lösung  {if(statcountif(SourceID.sgqa,SourceID.NAOK)>grplimit,0,1)} ist aber eleganter, da sie ohne JS auskommt. Werde ich auch nochmal testen. 

Das Beispiel bildet ziemlich genau meinen Anwendungsfall ab. Ich übergebe anfangs per URL Parameter, speichere diese in versteckten Gleichungsfragen. Dann folgen zu 95% Bootstrap-Button mit Likert-Skala + wenige Multiple-Choice-Fragen. Die Fragen sind für alle Gruppen gleich. 
Meine Herausforderung ist, dass ich für jede Quelle, die dazu kommt, einen Ansprechpartner habe. Dieser stellt seiner Gruppe den Link zu Verfügung. Die Quelle bekommt für Ihre Gruppe dann eine Auswertung mit Bezugswerten zur Gesamtgruppe. In vielen Fällen unterteilt sich die Quelle nochmal in Untergruppen (Ärzte in Chirugen, Orthopäden, usw.). Diese Angaben wird aber nicht per URL getrackt. 
Last edit: 6 months 3 weeks ago by BlackSwan.

Please Log in to join the conversation.

More
6 months 3 weeks ago #269177 by holch

ist aber eleganter, da sie ohne JS auskommt.


Sehe ich ähnlich. Würde, wo es geht, immer auf JS verzichten und versuchen alles so weit wie möglich mit Limesurvey Boardmittelns zu lösen.

Joffm ist wirklich fit in solchen Sachen und wenn er sich nicht 100% damit auskennt, fuchst er sich meist rein. Bin immer wieder erstaunt mit welchen Lösungen er ankommt. Ohne Joffm wäre das Forum nur halb so viel wert. Und damit möchte ich die Leistungen anderer Top-Contributer wie Tparter und Denis gar nicht schmälern. Denen gehören jeweils 20%. ;-)

Help us to help you!
  • Provide your LS version and where it is installed (own server, uni/employer, SaaS hosting, etc.).
  • Always provide a LSS file (not LSQ or LSG).
Note: I answer at this forum in my spare time, I'm not a LimeSurvey GmbH employee.

Please Log in to join the conversation.

More
6 months 3 weeks ago #269178 by BlackSwan
Ich kann dir  nur zustimmen holch. Ohne Euch hätte ich Tage gebraucht, um eine Lösung herauszubekommen. Wenn ich mich nicht weiter verannt hätte. Eure schnellen und ausführlichen Antworten sind alles andere als selbstverständlich und mehr als hilfreich.

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269181 by Joffm
Ja, ich habe einmal etwas gespielt.
Dieser Source-Pool (anzeigend SourceID, Limit, Startdatum, Enddatum, Verbatim der Gruppe)
 

Wie gesagt, das kann man auch anders machen.

Wenn nun die Umfrage mit ?SourceID=11114 aufgerufen wird, kann ich mit ein paar Gleichungen
nämlich
Code:
{strpos(Pool,join('#',SourceID))}
und
Code:
{Params_1=substr(Pool,eqPos+1,5)}
{Params_2=intval(substr(Pool,eqPos+6,3))}
{Params_3=substr(Pool,eqPos+9,10)}
{Params_4=substr(Pool,eqPos+19,10)}
{Params_5=substr(Pool,eqPos+29,11)}
{Params_6=date('Y-m-d')}
{Params_7=statCountIf(SourceID.sgqa, SourceID.NAOK)}
meine gewünschten Werte in einem Container (Params) (mehrfache kurze Texte) zwischenspeichern
 

Als nächstes kommt nun die Quote, nämlich
"liegt er in der Zeit"
{if(strtotime(Params_3) gt strtotime(Params_6) or strtotime(Params_4) lt strtotime(Params_6),0,1)}
Liegt er in der Zeit, ist das Resultat 1, sonst 0.

"sind noch Interviews frei"
{if(Params_7 ge Params_2,0,1)}
analog

Daher gibt es nur noch zwei Quoten, die beide bei der "0" den Teilnehmer rausschmeißen.
 

Wie hier; die Meldung ist natürlich dynamisch Die Umfrage ist nur vom {Params_3} - {Params_4} auszufüllen.
 

Und danach geht es dann mit der eigentlichen Umfrage los:
Je nach SourceID werden die entsprechenden Fragen gestellt


Diese ganzen Fragen werden natürlich versteckt.

Ich denke, mehr braucht man nicht.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 6 months 3 weeks ago by Joffm.
The following user(s) said Thank You: holch, BlackSwan

Please Log in to join the conversation.

More
6 months 3 weeks ago #269185 by holch
Wusste doch, dass da noch irgendwas unglaubliches kommt!

Help us to help you!
  • Provide your LS version and where it is installed (own server, uni/employer, SaaS hosting, etc.).
  • Always provide a LSS file (not LSQ or LSG).
Note: I answer at this forum in my spare time, I'm not a LimeSurvey GmbH employee.

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269193 by Joffm
Da es ein erster schneller Entwurf war, müssen noch einige Feinheiten korrigiert werden.
Nämlich für die Überprüfung, ob die SourceID überhaupt vorhanden ist.

Die Funktion liefert bei "Nicht-Gefunden" eine "0" zurück; dies ist beim ersten Link aber auch der Fall (strpos startet bei "0").
Um dies zu vermeiden, wird einfach noch ein  Zeichen an den Anfang gesetzt.

Jetzt kommen die Screenouts.
Wenn die ID nicht gefunden wird, wird in "Params" trotzdem etwas stehen (allerdings Unsinn).
Und damit können auch die anderen Checks (Datum, Anzahl) zuschlagen und ein falsches Screenout angezeigt werden.

Aus diesem Grund werden die "Screenout"-Gleichungen auf zwei Gruppen verteilt.
In die erste Gruppe
{if(eqPos gt 0,1,0)} für den Rauswurf wegen ungültiger SourceID
die anderen in die folgende Gruppe.

Seht dann irgendwie so aus.
 
Und in G3 / Q1 gehjt es dann endlich los.

Joffm
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 6 months 3 weeks ago by Joffm.
The following user(s) said Thank You: BlackSwan

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269196 by Joffm
Und mit der Bibliothek "Papaparse" ist es vielleicht ein wenig angenehmer.
In unseren "Container" dieses script
Code:
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.4.1/papaparse.js" ></script>
 
<script type="text/javascript" charset="utf-8">
  $(document).on('ready pjax:complete',function() {
 
       var id = '{SourceID}';    
 
      Papa.parse("/upload/surveys/{SID}/files/test1.csv", {
          download: true,
          header: true,
          skipEmptyLines: true,
          complete: function(results) {
              for (i=0; i < results.data.length; i++) {
                  if (results.data[i].id==id) {
                      $('#question{QID} input[type="text"]:eq(0)').val(results.data[i].id);
                      $('#question{QID} input[type="text"]:eq(1)').val(results.data[i].limit);
                      $('#question{QID} input[type="text"]:eq(2)').val(results.data[i].start);
                      $('#question{QID} input[type="text"]:eq(3)').val(results.data[i].ende);
                      $('#question{QID} input[type="text"]:eq(4)').val(results.data[i].text);
                      break;
                  }
              }
          }
      });
  });
</script>[/i][/i][/i][/i][/i][/i]


mit dieser Datei "test1.csv"

Code:
id,limit,start,ende,text
11111,2,2025-01-01,2025-03-31,Arzt
11112,3,2025-02-01,2025-03-02,Ingenieur
11113,4,2025-02-01,2025-03-31,Klempner
11114,22,2025-03-01,2025-03-31,Dachdecker
11115,3,2025-02-01,2025-03-31,Masseur


Die Werte für das aktuelle Datum und die bereits erfolgten Completes der Gruppe habe ich hier direkt in die Vorgabe-Antwort eingetragen
 

Dann bekomme ich diese drei Screenouts.
Datum
 
Quote voll
 
Ungültige ID
 

Bei Interesse einfach etwas Realistisches schicken.

Joffm
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 6 months 3 weeks ago by Joffm.
The following user(s) said Thank You: BlackSwan

Please Log in to join the conversation.

More
6 months 3 weeks ago #269198 by BlackSwan
Vielen Dank Joffm! Ich konnte das, Dank Deiner detaillierten Hilfe, so umsetzen. Alle drei Quoten greifen. 
Als nächste steht damit die Einbindung der Bibliothek "Papaparse" an. Dazu bin ich noch nicht gekommen. 
Eine Frage habe ich noch: Was ist entscheidend, welche Quota und damit welcher Screenouts zuerst ausgelöst wird. Soweit ich es verstanden habe, ist die Reihung der Umfrage-Quoten egal. Entscheidend ist die Reihenfolge der entsprechenden Antwort. Sprich, erfolgt die Prüfung auf die SourceID vor der Datumprüfung, dann wird auch diese zuerst ausgelöst. Korrekt?

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269199 by Joffm
Daher habe ich die eqID auch in eine separate Gruppe gelegt.
Wenn nämlich die Datumsfelder leer sind, würde evtl. auch hier eine Quote zuschlagen.

Übrigens habe ich nach einer weiteren Nacht alle Füllungen vom Params in die Vorgabe-Antwort gelegt, gleichzeitig mit dem Test, ob die ID gefunden wurde.
Dann steht kein Unsinn in "Params"
 
Damit ist die Gleichung für die SourceID einfach
{if(is_empty(Params_1),0,1)}

Und die Gleichungen für Datum und Anzahl bekommen jetzt den Zusatz "Params_1 (SourceID) ist nicht leer"
{if(!is_empty(Params_1) and ((strtotime(Params_3) gt strtotime(Params_6) or strtotime(Params_4) lt strtotime(Params_6))),0,1)}
{if(!is_empty(Params_1) and Params_7 ge Params_2,0,1)}

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 6 months 3 weeks ago by Joffm.
The following user(s) said Thank You: BlackSwan

Please Log in to join the conversation.

More
6 months 3 weeks ago #269200 by BlackSwan

Please Log in to join the conversation.

More
6 months 3 weeks ago - 6 months 3 weeks ago #269234 by BlackSwan
Ich habe noch einen Fehler gefunden und korrigiert:
Code:
{strpos(Pool,join('#',SourceID))}
muss heißen:
Code:
{strpos(Pool,join('#',str_pad(SourceID, 5, "@")))}

Andernfalls würde das erste Zeichen der SourceID ausreichen, damit die Gültigkeit bestätigt wird. 
 
Last edit: 6 months 3 weeks ago by BlackSwan.

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose