- Posts: 3
- Thank you received: 0
Welcome to the LimeSurvey Community Forum
Ask the community, share ideas, and connect with other LimeSurvey users!
Variable self.qseq konkateniert statt addiert.
- Uhu226
- Topic Author
- Offline
- New Member
Less
More
4 months 1 day ago #253948
by Uhu226
Variable self.qseq konkateniert statt addiert. was created 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.
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.
Attachments:
Please Log in to join the conversation.
- Joffm
- Offline
- LimeSurvey Community Team
Less
More
- Posts: 12941
- Thank you received: 3979
4 months 22 hours ago - 4 months 22 hours ago #253949
by Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
Replied by Joffm on topic Variable self.qseq konkateniert statt addiert.
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
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 22 hours ago by Joffm.
Please Log in to join the conversation.
- Joffm
- Offline
- LimeSurvey Community Team
Less
More
- Posts: 12941
- Thank you received: 3979
4 months 17 hours ago - 4 months 16 hours ago #253961
by Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
Replied by Joffm on topic Variable self.qseq konkateniert statt addiert.
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
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
- Topic Author
- Offline
- New Member
Less
More
- Posts: 3
- Thank you received: 0
3 months 4 weeks ago #253997
by Uhu226
Replied by Uhu226 on topic Variable self.qseq konkateniert statt addiert.
Hier meine LSS Datei.
Ich möchte mal die verschiedenen Fehler beschreiben, die ich beobachte:
Ich definiere startId als Gleichung:
Dann habe ich die Frage F1. Hier schreibe ich folgendes:
raus kommt:
a: -41
b: -3
Dann die Frage F2. Hier schreibe ich:
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
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
- Offline
- LimeSurvey Community Team
Less
More
- Posts: 12941
- Thank you received: 3979
3 months 4 weeks ago - 3 months 4 weeks ago #254005
by Joffm
Volunteers are not paid.
Not because they are worthless, but because they are priceless
Replied by Joffm on topic Variable self.qseq konkateniert statt addiert.
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
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
- Topic Author
- Offline
- New Member
Less
More
- Posts: 3
- Thank you received: 0
3 months 4 weeks ago #254008
by Uhu226
Replied by Uhu226 on topic Variable self.qseq konkateniert statt addiert.
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.
- 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