Welcome to the LimeSurvey Community Forum

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

Variable self.qseq konkateniert statt addiert.

  • Uhu226
  • Uhu226's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
4 months 1 day ago #253948 by Uhu226
Ich hatte unerklärliche Berechnungsfehler in meiner Umfrage und konnte das Problem für mich lösen. Ich denke aber, dass es ein Fehler von Limesurvey ist:
Mein erster Berechnungsterm hat immer etwas anderes ausgegeben, als wenn ich den gleichen Term eine Zeile später ausführe.

startId hat den Wert -18 und f1.qseq den Wert 18
In der ersten Zeile ergab die Berechnung "-1818".
In der zweiten Zeile 0.

Mein Workaround ist: {startId+intval(f1.qseq)}. Damit funktioniert es immer.

Die is_numeric() und is_int() Funktion gibt in beiden Zeilen 1 aus (obwohl sie auch true ausgeben kann!).

Den Grund für den Fehler kenne ich nicht. LimeSurvey Community Edition Version 6.4.0+231218
Meine Limesurvey Installation ist recht lahm. Speichern einer Frage dauert 5 Sekunden. Umfrageseite aufrufen 15 Sekunden.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 months 22 hours ago - 4 months 21 hours ago #253949 by Joffm
Hallo,
wenn Du glaubst es sei ein Bug, dann schicke bitte den lss Export.
Dann sehen wir, ob dies reproduzierbar ist - oder nur etwas, was Du vielleicht übersehen hast.

Joffm

P S.
Ich habe noch einmal genau gelesen.
Das ist kein Bug, sondern die Doppeldeutigkeit des "+"-Operators.
Dieser verknüpft ja einerseits Texte, andererseits fuhrt er auch die Addition von Zahlen durch.
Dies siehst Du ja auch:
Es werden einfach die zwei Texte "-18" und "18" verkettet.
Die Programmiersprache (php) kann nicht erkennen, ob "StartId" einen Text repräsentiert oder eine Zahl.
Daher sind bei unklaren Typen die Ergebnisse nicht vorhersehbar; man muss selbst für Klarheit sorgen

​​​​​​Daher wird er in der GUI oft rot gekennzeichnet als Warnung.
Und diese steht auch im Handbuch.

Daher sollte für Additionen besser die "sum"-Funktion benutzt werden.

Deine "intval"-Lösung erzwingt nun, dass php weiß, dass es sich um eine Zahl handelt.

Deine Frage bezüglich TRUE und "1" ist leicht zu beantworten.
Die Datenbank (MySql, MariaDB) kennt keine Bool-Variablen. Diese werden als TinyInt gespeichert.
0=FALSCH
1=WAHR

​​​​​​Du siehst ja auch, dass in Limesurvey oft in Bedingungen als Default-Wert die "1" eingetragen ist 

Conclusio:
Es ist alles, wie man es erwarten kann
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 4 months 21 hours ago by Joffm.

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 months 16 hours ago - 4 months 16 hours ago #253961 by Joffm
Noch ein kleiner Zusatz.

Wie wurde "StartId" eigentlich definiert?
In einer Gleichung, also {-18}?
Als Default-Antwort bzw. Eingabe eines "kurzen Textes"?
Als Default-Antwort bzw. Eingabe einer "Zahleingabe"?
Daher wäre der lss Export immer noch das Mittel der Wahl.

Das ist dummerweise eine akademische Frage, da es mit bei allen drei Möglichkeiten nicht gelungen ist, das Verhalten zu reproduzieren; bei mir ergibt jede Funktion "0".
Unabhängig vom Zugriff; ob über die "self"-Variable oder über den Fragencode.

Wobei ich hinzufügen muss, dass ich in 6.3.8. getestet habe.
Ich werde einmal 6.4.0. installieren; mal sehen, ob es einen Unterschied macht.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 4 months 16 hours ago by Joffm.

Please Log in to join the conversation.

  • Uhu226
  • Uhu226's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
3 months 4 weeks ago #253997 by Uhu226
Hier meine LSS Datei.
Ich möchte mal die verschiedenen Fehler beschreiben, die ich beobachte:
Ich definiere startId als Gleichung:
Code:
if(is_empty(startId), -4, startId)

Dann habe ich die Frage F1. Hier schreibe ich folgendes:
Code:
a: {startId+f1.qseq}
b: {startId+f1.qseq}

raus kommt:
a: -41
b: -3

Dann die Frage F2. Hier schreibe ich:
Code:
a: {startId+self.qseq}
b: {startId+self.qseq}

und raus kommt:

a: -42
b: startId + self.qseq

Bei F1 sollte bei a und b -3 herauskommen (qseq = 1). Bei F2 bei beiden -2, weil qseq dort 2 ist.
Interessanterweise funktioniert in der Fragenvorschau bei F2 auch der zweite Term:

a: 2
b: 2

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 months 4 weeks ago - 3 months 4 weeks ago #254005 by Joffm
Hallo,
Vorbemerkung: Wozu dient denn dieses Konstrukt?
if(is_empty(startId), -4, startId)
Bei Dir ist es doch eine Konstante (-4).
Dann ist {-4} völlig ausreichend. Daran ändert sich ja nichts.
Wir benutzen diese IF-Geschichte doch nur deswegen, weil die "rand()"-Funktion bei jedem Klick in dieser Gruppe einen neuen Wert liefert.
Also genau wie die "Zufallszahl" in Excel.
In LimeSurvey würde - wenn diese Funktion in einer Gruppe mit anderen Fragen steht oder zu dieser Frage zurückgegangen wird - einen neuen Wert liefern. Das kann dann dazu führen, dass der Teilnehmer "Bild4" sieht, später im Datensatz aber eine "2" als erzeugte Zufallszahl steht.

Gut, zu Deiner Frage.
Erzeuge Deine "startId" in einer separaten Gruppe oder zeige "Frage für Frage" an - und gut ist es.


ABER:
Nächste Frage: Wozu soll es eigentlich dienen? Und warum so kompliziert?
Zunächst wird mithilfe einer Gleichungs-Frage eine konstante negative Zahl erzeugt, die dann später zu einer Variablen hinzuaddiert wird.
Aber das ist doch gleichbedeutend mit
{f1.qseq-4}
{self.qseq-4}

Und das funktioniert ja immer - ohne die Doppeldeutigkeit des "+"-Operators.
 
Joffm


 

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

Please Log in to join the conversation.

  • Uhu226
  • Uhu226's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
3 months 4 weeks ago #254008 by Uhu226
Wozu dient dieses Konstrukt?:
 - In meiner echten Umfrage war es auch mal eine Zufallszahl. Wenn man es für das Beispiel hier noch weiter vereinfachen kann, umso besser.

Wozu soll das dienen?:
- Ich verteile mit Modulo (was ja in limesurvey nicht geht. Also Workaround (x%a) = x-floor(x/a)) gewisse IDs an die Umfrageteilnehmer. Teilnehmer 1 bekommt z.B. ID 1-10, Teilnehmer 2 11-20, Teilnehmer 3 21-30 und Teilnehmer 4 wieder 1-10. Mit den IDs binden sich die Fragen dann externe Dateien ein, zu denen es Fragen gibt.

Wenn man die Initialisierung der Variable in eine Gruppe vorher verschiebt, funktioniert es wohl laut meinem Kollegen (Dann wird es von PHP richtig ausgewertet).
Auf der gleichen Seite gibt es die gezeigten Fehler (JavaScript wertet + Operator falsch aus.)

Warum so kompliziert?:
- Natürlich gibt es workarounds wie intval() und - Operator. Das gezeigte Beispiel soll das fehlerhafte Verhalten des + Operators zeigen.

Please Log in to join the conversation.

Moderators: Joffm

Lime-years ahead

Online-surveys for every purse and purpose