0 votes
in SoSci Survey (dt.) by s222544 (555 points)
edited by SoSci Survey

Hallo SoSci Survey Online Support Team,

vielen Dank für Ihre bisherige Hilfe in meinem Projekt!

In meiner Umfragen sollen die Probanden im ersten Schritt ein Portfolio erstellen, im zweiten bekommen sie Renditeveränderungen angezeigt und im dritten Schritt wird die Veränderung in der Gewichtung angezeigt.

Ich habe derzeit Probleme beim Anzeigen der Veränderungen in der Gewichtung.

Als Beispiel:
1) Eine frei verfügbare Summe zum Anlegen wird als Text angezeigt.
2) Es gibt vier verschiedene Kategorien in denen angelegt werden kann. Der Proband soll mittels Text-Eingabefeld und Antwortprüfung die Summe von 100 Prozent verteilen - gespeichert in TE01_01 bis _04.
3) Die Rendite aller vier Kategorien wird angezeigt, gespeichert als interne Variable EX04_01 bis EX04_04
4) Die veränderte Gewichtung soll angezeigt werden.

Die veränderte Gewichtung wird wie folgt berechnet:

Beispiel: Angelegte Summe €25.000
Gewichtung: 50%, 10%, 30%,10%
Rendite: 0.7%; 16.06%, -3.16%, 38.60%
Anfangswert: Gewichtung Angelegte Summe --> 50%25k = 12500€; 10%25k; 30%25k; 10%25k
Endwert: Anfangswert
(1+Rendite) --> 12500(1+0.7%) = 12587.5€
Alle Endwerte sollen summiert werden (hier 26217€)

Endgewichtung= Endwert/ Summe der Endwerte

Nur die Endgewichtung in jeder Kategorie soll angezeigt werden.

Als ersten Schritt habe ich versucht, die angelegte Summe aus dem Text zu extrahieren:

// Angelegte Summe extrahieren
if (value('EX02_01')== TB01){
    $Summe1 = value('200000');
} elseif (value('EX02_01')== TB02) {
    $Summe2 = value('25000');
} elseif (value('EX02_01')== TB03) {
    $Summe3 = value('30000');
} else { 
    $Summe4 = value('100000');

Hierbei trat folgender Fehler auf:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Uncaught Error: Undefined constant "s2survey\questionnaire\environment\TB01" in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547) : eval()'d code:4 Stack trace: #0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547): eval() #1 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode() #2 /var/www/s2survey/html/inc/QuestionnairePHP.php(563): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode() #3 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(480): QuestionnairePHP->runElement() #4 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1516): s2survey\questionnaire\QuestionnaireElement->run() #5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1435): s2survey\questionnaire\QnrPage->runContent() #6 /var/www/s2survey/html/inc/InterviewCase.php(1469): s2survey\questionnaire\QnrPage->run() #7 /var/www/s2survey/html/inc/Interviewer.php(655): InterviewCase->createQuestionnairePage() #8 /var/www/s2survey/html/inc/Interviewer.php(824): Interviewer->handleCreate() #9 /var/www/s2survey/html/inc/Interviewer.php(1951): Interviewer->handleInterview() #10 /var/www/s2survey/html/rer/index.php(4): Interviewer::run() #11 {main} thrown
Zeile: 4

PHP-Code

001 namespace s2survey\questionnaire\environment;
002 
003  
004 if (value('EX02_01')== TB01){
005     $Summe1 = value('200000');
006 } elseif (value('EX02_01')== TB02) {
007     $Summe2 = value('25000');
}

EX02 ist die interne Variable, die speichert welcher der 4 Texte (TB01 bis TB04) gezogen wird.

Wie behebe ich diesen Fehler?

Wie kann ich die Veränderungen berechnen und anzeigen?

Vielen Dank im Voraus.

1 Answer

0 votes
by SoSci Survey (302k points)

Der Fehler beschwert sich über diese Zeile:

if (value('EX02_01')== TB01) {

Was erwarten Sie denn in der Variable EX02_01? Wenn es eine Zahl ist, dann müsste rechts vom == eine Zahl stehen. Wenn Sie es mit der Variable TB01 vergleichen möchten, müssten Sie auch hierfür value() verwenden:

if (value('EX02_01') == value('TB01')) {

Aber Ihrer Frage entnehme ich, dass es sich eher um die Ausprägung z.B. einer Zufallziehung handelt? Dann ...

if (value('EX02_01') == 1) {

Oder vielleicht steht in EX02_01 auch schon die Summe als Zahl?

Wie kann ich die Veränderungen berechnen und anzeigen?

Klären wir erst einmal, was genau Sie in den internen Variablen abgelegt haben. Und woraus sich eine Veränderung der Gewichtung ergibt oder ableiten lässt? Dann wird das mit der Antwort einfacher.

by s222544 (555 points)
Genau, TB01 bis TB04 sind die Kennungen der Texte eingespeist im Zufallsgenerator. In diesen Texten ist der Wert der angelegten Summe hinterlegt (mitunter anderer Informationen, die fürs Experiment relevant sind, aber für dieses Problem nicht wichtig sind.

Für die Veränderung der Gewichtung (wie oben dargestellt) benötige ich
die angelegte Summe (im Voraus bekannt), die Gewichtung der 4 Kategorien (wird vom Probanden bestimmt - unter TE01_01 bis _04 abgespeichert, die Rendite (im Voraus bekannt, eingespeichert unter interner Variable EX04_01 bis EX04_04.

Folgende Berechnungen müssen stattfinden:

der Anfangswert: Gewichtung multipliziert mit angelegter Summe

der Endwert: Anfangswert(1+Rendite)

die Summe aller Endwerte

die Endgewichtung als Endwert geteilt durch die Summe aller Endwerte

Ich hoffe, das hilft Ihnen weiter. :)

Vielen Dank im Voraus!
by s222544 (555 points)
Habe den PHP Code wie folgt angepasst:
// Angelegte Summe extrahieren
if (value('EX01x01')== 1){
    $Summe1 = value('200000');
} elseif (value('EX01x01')== 2) {
    $Summe2 = value('25000');
} elseif (value('EX01x01')== 3) {
    $Summe3 = value('30000');
} elseif (value('EX01x01')== 4) {
    $Summe4 = value('100000');
}

EX01x01 ist direkt der Zufallsgenerator und die Werte 1-4 stehen für die jeweiligen Texte, die gezogen werden können.

Es erscheint folgender Fehler im Fragebogen:
Die Variable 200000 gibt es in diesem Projekt nicht (siehe Variablen-Übersicht). Daher kann kein Antwort-Wert dafür ermittelt werden.

Deshalb habe ich im nächsten Versuch den PHP Code angepasst:
$Summe3 ==('30000'); --> das value weggelassen.

Führte zu diesem Fehler im Fragebogen: Undefined variable $Summe4
Zeile: 11

PHP-Code

008 } elseif (value('EX01x01')== 3) {
009     $Summe3 ==('30000');
010 } elseif (value('EX01x01')== 4) {
011     $Summe4 ==('100000');
012 }
013 return 'ok';

Als nächstes dann die Anführungszeichen entfernt:
// Angelegte Summe extrahieren
if (value('EX01x01')== 1){
    $Summe1 == 200000;
} elseif (value('EX01x01')== 2) {
    $Summe2 == 25000;
} elseif (value('EX01x01')== 3) {
    $Summe3 == 30000;
} elseif (value('EX01x01')== 4) {
    $Summe4 ==100000;
}

weshalb dieser Fehler erschien:
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined variable $Summe4
Zeile: 11

PHP-Code

008 } elseif (value('EX01x01')== 3) {
009     $Summe3 == 30000;
010 } elseif (value('EX01x01')== 4) {
011     $Summe4 ==100000;
012 }
013 return 'ok';

Ich bitte um Ihre Hilfe. Vielen Dank!
by s222544 (555 points)
Ich glaube, ich habe das Problem mit der Summe wie folgt gelöst:
// Angelegte Summe extrahieren
if (value('EX01x01')== 1){
    $Summe = 200000;
} elseif (value('EX01x01')== 2) {
    $Summe = 25000;
} elseif (value('EX01x01')== 3) {
    $Summe = 30000;
} elseif (value('EX01x01')== 4) {
    $Summe = 100000;
}

Danach kommt folgender PHP Code:
$begassets_cash1 = $Summe * (value('TE01_01'));
$begassets_ak1 = $Summe * (value('TE01_02'));
$begassets_bo1 = $Summe * (value('TE01_03'));
$begassets_go1 = $Summe * (value('TE01_04'));


$endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
$endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
$endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
$endassets_go1 = $begassets_go1*(1+(value('EX04_04')));
$totalendassets1 = valueSum(array('$endassets_cash1', '$endassets_ak1', '$endassets_bo1', '$endassets_go1'));


$weight_cash1 = $endassets_cash1/$totalendassets1;
$weight_ak1 = $endassets_ak1/$totalendassets1;
$weight_bo1 = $endassets_bo1/$totalendassets1;
$weight_go1 = $endassets_go1/$totalendassets1;


Es erscheint folgender Fehler im Fragebogen:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Uncaught DivisionByZeroError: Division by zero in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547) : eval()'d code:3 Stack trace: #0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547): eval() #1 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode() #2 /var/www/s2survey/html/inc/QuestionnairePHP.php(563): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode() #3 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(480): QuestionnairePHP->runElement() #4 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1516): s2survey\questionnaire\QuestionnaireElement->run() #5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1435): s2survey\questionnaire\QnrPage->runContent() #6 /var/www/s2survey/html/inc/InterviewCase.php(1469): s2survey\questionnaire\QnrPage->run() #7 /var/www/s2survey/html/inc/Interviewer.php(655): InterviewCase->createQuestionnairePage() #8 /var/www/s2survey/html/inc/Interviewer.php(824): Interviewer->handleCreate() #9 /var/www/s2survey/html/inc/Interviewer.php(1951): Interviewer->handleInterview() #10 /var/www/s2survey/html/rer/index.php(4): Interviewer::run() #11 {main} thrown
Zeile: 3

PHP-Code

001 namespace s2survey\questionnaire\environment;
002
003 $weight_cash1 = $endassets_cash1/$totalendassets1;
004 $weight_ak1 = $endassets_ak1/$totalendassets1;
005 $weight_bo1 = $endassets_bo1/$totalendassets1;
006 $weight_go1 = $endassets_go1/$totalendassets1;

Dieser Fehler erscheint auch, wenn alle Ursprungsgewichtungen nicht Null sind, d.h. - keine Division durch Null.

Darf ich Sie höflich um Rat bei diesem Fehler bitten?

Vielen Dank!
by SoSci Survey (302k points)
Das geht schonmal robust in die richtige Richtung.

> Dieser Fehler erscheint auch, wenn alle Ursprungsgewichtungen nicht Null sind

Lassen Sie sich in solchen Fällen anzeigen, was in den Variablen steht, also...

debug($totalendassets1);  // Anzeigen
$weight_cash1 = $endassets_cash1/$totalendassets1;
$weight_ak1 = $endassets_ak1/$totalendassets1;
$weight_bo1 = $endassets_bo1/$totalendassets1;
$weight_go1 = $endassets_go1/$totalendassets1;

Höchstwahrscheinlich wird das debug() bestätigen, dass die Variable den Wert 0 hat. Im nächsten Schritt steht also valueSum().

Da ist das Problem: valueSum() ist daüfr da, um Variablen aus dem Datensatz zu addieren, vgl. https://www.soscisurvey.de/help/doku.php/de:create:functions:valuesum - und dafür erwartet es Variablennamen aus dem Datensatz.

Sie haben aber die Namen Ihrer PHP-Variablen (s. https://www.soscisurvey.de/help/doku.php/de:create:variables) als Strings eingetragen. Ich vermute, dass sich SoSci Survey auch beschwert, dass es diese Variablen nicht findet.

Sie haben hier aber m.E. nur ein wenig zu kompliziert gedacht:

$totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;

Oder falls Sie unbedingt mit einem Array arbeiten möchten, wäre array_sum() die korrekte Funktion:

$totalendassets1 = array_sum(array($endassets_cash1, $endassets_ak1, $endassets_bo1, $endassets_go1));

Allerdings dann ohne Anführungszeichen, denn Strings lassen sich i.d.R. nicht addieren. Wobei PHP durchaus flexibel ist und ein 1 + '2' brav als 3 berechnet.
by s222544 (555 points)
Vielen Dank für Ihre Antwort und Ihre Hilfe!

Habe das Array in der Summe entfernt und habe jetzt $totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1; Ihrem Vorschlag folgend.

Habe die Debug Zeile eingefügt, folgender Fehler wird angezeigt:

Debug-Information für $totalendassets1:
Keine Daten (null)

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

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined variable $totalendassets1
Zeile: 18

PHP-Code

015 $begassets_bo1 = $Summe * (value('TE01_03'));
016 $begassets_go1 = $Summe * (value('TE01_04'));
017
018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
Fehler im Fragebogen: Unsupported operand types: int + string
Zeile: 19

PHP-Code

016 $begassets_go1 = $Summe * (value('TE01_04'));
017
018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
022 $endassets_go1 = $begassets_go1*(1+(value('EX04_04')));

Vielen Dank im Voraus für Ihre Hilfe!
by s222544 (555 points)
Habe den Fehler mit bezüglich der "Variable EX04_01 wurde im Laufe dieses Interviews auf keiner vorhergehenden Seite abgefragt. Daher kann die Funktion value() keinen Antwort-Wert ermitteln." behoben.


Es erscheint jetzt diese Fehlermeldung:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined variable $totalendassets1
Zeile: 18

PHP-Code

015 $begassets_bo1 = $Summe * (value('TE01_03'));
016 $begassets_go1 = $Summe * (value('TE01_04'));
017
018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 19

PHP-Code

016 $begassets_go1 = $Summe * (value('TE01_04'));
017
018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
022 $endassets_go1 = $begassets_go1*(1+(value('EX04_04')));
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 20

PHP-Code

017
018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
022 $endassets_go1 = $begassets_go1*(1+(value('EX04_04')));
023 $totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 21

PHP-Code

018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
022 $endassets_go1 = $begassets_go1*(1+(value('EX04_04')));
023 $totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;
024
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 22

PHP-Code

019 $endassets_cash1 = $begassets_cash1*(1+(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(value('EX04_03')));
022 $endassets_go1 = $begassets_go1*(1+(value('EX04_04')));
023 $totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;
024
025 $weight_cash1 = $endassets_cash1/$totalendassets1;

Vielen Dank für Ihre Unterstützung!
by s222544 (555 points)
Habe jetzt versucht aus den Strings ganze Zahlen zu kreieren:
$begassets_cash1 = $Summe * (int)(value('TE01_01'));
$begassets_ak1 = $Summe * (int)(value('TE01_02'));
$begassets_bo1 = $Summe * (int)(value('TE01_03'));
$begassets_go1 = $Summe * (int)(value('TE01_04'));

debug($totalendassets1); //Anzeigen
$endassets_cash1 = $begassets_cash1*(1+(int)(value('EX04_01')));
$endassets_ak1 = $begassets_ak1*(1+(int)(value('EX04_02')));
$endassets_bo1 = $begassets_bo1*(1+(int)(value('EX04_03')));
$endassets_go1 = $begassets_go1*(1+(int)(value('EX04_04')));
$totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;

Folgende Fehlermeldung tritt auf:
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined variable $totalendassets1
Zeile: 18

PHP-Code

015 $begassets_bo1 = $Summe * (int)(value('TE01_03'));
016 $begassets_go1 = $Summe * (int)(value('TE01_04'));
017
018 debug($totalendassets1);  
019 $endassets_cash1 = $begassets_cash1*(1+(int)(value('EX04_01')));
020 $endassets_ak1 = $begassets_ak1*(1+(int)(value('EX04_02')));
021 $endassets_bo1 = $begassets_bo1*(1+(int)(value('EX04_03')));


Wie kann $totalendassets1 undefiniert sein, wenn keine Fehler früher erscheinen und die Variable eine Summierung von vorherigen Variablen ist?

Per Debugger werden in TE01_01 bis _04 ganze Zahlen gespeichert.
Das Problem könnte in EX04_01 bis _04 liegen, denn laut Debugger werden Werte wie "0.1%" eingespeichert.

Vielen Dank!
by SoSci Survey (302k points)
> Fehler im Fragebogen: Undefined variable $totalendassets1

Die Reihenfolge ist hier das Problem. Sie rufe das

debug($totalendassets1);

auf, bevor Sie die Variable definieren:

$totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;
by s222544 (555 points)
Vielen Dank für den Hinweis, habe den Code entsprechend angepasst.
Die gute Nachricht: es kommen keine Fehlermeldungen auf.
Die schlechte Nachricht: die Berechnungen sind falsch.

Die Summe wird in der debug Zeile richtig angezeigt.
Ich vermute der Fehler liegt in der Rendite, gespeichert wird 0.4%, also eine Zahl mit Nachkommastelle und Prozentzeichen.

Gibt es einen Weg die PHP Code Berechnungen ($begassets_, $endassets_ und $weight_ anzeigen zu lassen (um sie nachzuvollziehen und mit Excel zu vergleichen)?

Ich bin sehr dankbar für Ihre Hilfe!
by SoSci Survey (302k points)
> Ich vermute der Fehler liegt in der Rendite, gespeichert wird 0.4%, also eine Zahl mit Nachkommastelle und Prozentzeichen.

Wenn in einer internen Variable ein Prozentzeichen steht, kann ein Computer damit nicht rechnen. Sie können dieses Zeichen aber einfach entfernen:

$zahl = (float)str_replace(value('EX04_01'), '%', '') * 100;

Da kann man sicher noch ein wenig optimieren, z.B. kann man systematisch das letzte Zeichen weglassen:

$zahl = (float)substr(value('EX04_01'), 0, -1) * 100;

> Gibt es einen Weg die PHP Code Berechnungen ($begassets_, $endassets_ und $weight_ anzeigen zu lassen

Ja, debug() haben SIe dafür ja schonmal verwendet, also...

debug($begassets_bo1);
debug($begassets_go1);
debug($begassets_cash1);
debug($begassets_ak1);
debug($begassets_bo1);
debug((int)(value('EX04_03')));
by s222544 (555 points)
Vielen Dank für Ihre Hilfe!

Habe jetzt folgenden PHP Code:

// Angelegte Summe extrahieren
if (value('EX01x01')== 1){
    $Summe = 200000;
} elseif (value('EX01x01')== 2) {
    $Summe = 25000;
} elseif (value('EX01x01')== 3) {
    $Summe = 30000;
} elseif (value('EX01x01')== 4) {
    $Summe = 100000;
}

// Bei TE01_01 bis _04 werden ganze Zahlen gespeichert, die die Gewichtung
// angeben (z.B. 100). Deshalb versuche ich nichts zu ersetzen, aber durch 100 zu teilen.
$we1 = (int)str_replace(value('TE01_01'),'','')/100;
$we2 = (int)str_replace(value('TE01_02'),'','')/100;
$we3 = (int)str_replace(value('TE01_03'),'','')/100;
$we4 = (int)str_replace(value('TE01_04'),'','')/100;

debug($we1);
debug($we2);
debug($we3);
debug($we4);

$begassets_cash1 = $Summe * $we1;
$begassets_ak1 = $Summe * $we2;
$begassets_bo1 = $Summe * $we3;
$begassets_go1 = $Summe * $we4;

$ren1 = (float)str_replace(value('EX04_01'), '%', '') * 100;
$ren2 = (float)str_replace(value('EX04_02'), '%', '') * 100;
$ren3 = (float)str_replace(value('EX04_03'), '%', '') * 100;
$ren4 = (float)str_replace(value('EX04_04'), '%', '') * 100;

$endassets_cash1 = $begassets_cash1*(1+$ren1);
$endassets_ak1 = $begassets_ak1*(1+$ren2);
$endassets_bo1 = $begassets_bo1*(1+$ren3);
$endassets_go1 = $begassets_go1*(1+$ren4);

$totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;


$weight_cash1 = $endassets_cash1/$totalendassets1;
$weight_ak1 = $endassets_ak1/$totalendassets1;
$weight_bo1 = $endassets_bo1/$totalendassets1;
$weight_go1 = $endassets_go1/$totalendassets1;

debug($begassets_bo1);
debug($begassets_go1);
debug($begassets_cash1);
debug($begassets_ak1);
debug($begassets_bo1);

Nichtsdestotrotz erscheint folgender Fehler:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Uncaught DivisionByZeroError: Division by zero in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547) : eval()'d code:42 Stack trace: #0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547): eval() #1 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode() #2 /var/www/s2survey/html/inc/QuestionnairePHP.php(563): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode() #3 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(480): QuestionnairePHP->runElement() #4 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1516): s2survey\questionnaire\QuestionnaireElement->run() #5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1435): s2survey\questionnaire\QnrPage->runContent() #6 /var/www/s2survey/html/inc/InterviewCase.php(1469): s2survey\questionnaire\QnrPage->run() #7 /var/www/s2survey/html/inc/Interviewer.php(655): InterviewCase->createQuestionnairePage() #8 /var/www/s2survey/html/inc/Interviewer.php(824): Interviewer->handleCreate() #9 /var/www/s2survey/html/inc/Interviewer.php(1951): Interviewer->handleInterview() #10 /var/www/s2survey/html/rer/index.php(4): Interviewer::run() #11 {main} thrown
Zeile: 42

PHP-Code

039 $totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;
040
041
042 $weight_cash1 = $endassets_cash1/$totalendassets1;
043 $weight_ak1 = $endassets_ak1/$totalendassets1;
044 $weight_bo1 = $endassets_bo1/$totalendassets1;
045 $weight_go1 = $endassets_go1/$totalendassets1;


Wenn Fehler erst in Zeile 42 auftauchen, in der das Endgewicht ermittelt wird, warum klappen die Debug Statements nicht?

Vielen Dank für Ihre Unterstützung!
by SoSci Survey (302k points)
Was wird denn angezeigt, wenn Sie noch ein paar debug() ergänzen:

$totalendassets1 = $endassets_cash1 + $endassets_ak1 + $endassets_bo1 + $endassets_go1;
debug($totalendassets1);
debug($endassets_cash1);
debug($endassets_ak1);
debug($endassets_bo1);
debug($endassets_go1);

Ich würde übrigens (weiter oben) empfehlen, den Code nicht unnötig kompliziert zu machen. Also statt

$we1 = (int)str_replace(value('TE01_01'),'','')/100;

besster

$we1 = value('TE01_01') / 100;
by s222544 (555 points)
Vielen Dank für die Verbesserung des Codes.

Die Rendite hat 2 Nachkommastellen (nicht eine wie zuerst vermutet). Die Debug Informationen liefern immer Null ab --> $ren1 = 0 (double), $ren2 = 0 (double); $ren3 = 0 (double); $ren4 = 0 (double) obwohl die Rendite wie folgt war: 0.40%; 12.51%; 0.55% und -0.90%.

Wie kann ich $ren1 = (float)str_replace(value('EX04_01'), '%', '') * 100; etc. anpassen, damit die Zahlen korrekt verarbeitet werden?

Bei den $begassets_ und $endassets_ werden die hunderter Reihen nicht angezeigt, als Bespiel: wenn 50200 richtig ist, wird nur 50000 angezeigt - ohne die nötigen 200. Als anderes Beispiel: 30721 ist korrekt aber 31000 wird angezeigt - es fehlen die 721.

Genauso beim Endgewicht $weight_cash1 = $endassets_cash1/$totalendassets1;

$weight_cash1 = 0.5 (double) wird angezeigt (im Debugger) - korrekt ist 49.59%
$weight_ak1 = 0.1 (double) wird angezeigt (im Debugger) - korrekt ist 11.12%

Wie kann ich den Code so verändern, dass die Zahlen akkurater dargestellt werden?

Vielen Dank im Voraus!
by SoSci Survey (302k points)
> Die Debug Informationen liefern immer Null ab --> $ren1 = 0 (double), $ren2 = 0 (double); $ren3 = 0 (double); $ren4 = 0 (double) obwohl die Rendite wie folgt war: 0.40%; 12.51%; 0.55% und -0.90%.

Gut, dann setzen wir dort mal an, also genauer gesagt hier:

$ren1 = (float)str_replace(value('EX04_01'), '%', '') * 100;

Ergänzen Sie bitte noch mehr Code zur Fehlersuche:

debug(value('EX04_01'));
debug(str_replace(value('EX04_01'), '%', ''));
debug((float)str_replace(value('EX04_01'), '%', ''));

> $weight_cash1 = 0.5 (double) wird angezeigt (im Debugger) - korrekt ist 49.59%

Das ist vermutlich nur eine vereinfachte Anzeige des debug()-Befehls - wenn Sie es genauer brauchen:

html('<p>'.$weight_cash1.'</p>');

oder

html('<p>'.sprintf('%f1.4', $weight_cash1).'</p>');
by s222544 (555 points)
Vielen Dank!

Folgende Rendite wurde im Fragebogen angezeigt: 0%, -18,26%, -4,81% und 3,00%.

Die Ergebnisse vom Debugger:
Debug-Information für value('EX04_01'):
value('EX04_01') = 0% (string)

Debug-Information für str_replace(value('EX04_01'), '%', ''):
str_replace(value('EX04_01'), '%', '') = (string)

Debug-Information für (float)str_replace(value('EX04_01'), '%', ''):
(float)str_replace(value('EX04_01'), '%', '') = 0 (double)

$ren1 bis 4: weiterhin $ren1 = 0 (double)

Vielen Dank für den Hinweis mit sprintf, es werden jetzt 2 Nachkommastellen angezeigt!
by s222544 (555 points)
P.S. Wenn man nur in eine der 4 Kategorien anlegt, also eine Gewichtung von 100% hat, dann erscheint folgender Fehler:
(hier wurde 100% auf TE01_01 gelegt)

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Unsupported operand types: string / int
Zeile: 15

PHP-Code

012 }
013
014 $begassets_cash1 = $Summe * (value('TE01_01') / 100);
015 $begassets_ak1 = $Summe * (value('TE01_02') / 100);
016 $begassets_bo1 = $Summe * (value('TE01_03') / 100);
017 $begassets_go1 = $Summe * (value('TE01_04') / 100);
018

Verteilt man das Gewicht so, dass keine Kategorie leer ist (also Gewichtung von 0%) hat, dann erscheint dieser Fehler nicht.

Darf ich Sie höflich um Rat bitten?
by SoSci Survey (302k points)
> Debug-Information für str_replace(value('EX04_01'), '%', ''):
> str_replace(value('EX04_01'), '%', '') = (string)

Arg, da habe ich die Parameter vertauscht. Es muss

str_replace('%', '', value('EX04_01'))

heißen - nachzulesen hier: https://www.php.net/manual/en/function.str-replace.php
by s222544 (555 points)
Vielen Dank!

Habe jetzt an passender Stelle als PHP Code:
$ren1 = (float)str_replace(value('%', '', 'EX04_01')) * 100;
$ren2 = (float)str_replace(value('%', '','EX04_02')) * 100;
$ren3 = (float)str_replace(value('%', '', 'EX04_03')) * 100;
$ren4 = (float)str_replace(value('%', '', 'EX04_04')) * 100;

und darunter die debugger Statements:
debug(value('EX04_01'));
debug(str_replace('%', '', value('EX04_01')));
debug((float)str_replace('%', '',value('EX04_01')));

Folgende Fehlermeldung kommt jetzt:

Warnung (Seite 6)
You have specified an invalid value () for parameter 2 in function value(). This parameter is ignored.

Fehler im Fragebogen (Seite 6)
Die Variable % gibt es in diesem Projekt nicht (siehe Variablen-Übersicht). Daher kann kein Antwort-Wert dafür ermittelt werden.

Fehler im Fragebogen (Seite 6)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: str_replace() expects at least 3 arguments, 1 given
Zeile: 19

PHP-Code

016 $begassets_bo1 = $Summe * (value('TE01_03') / 100);
017 $begassets_go1 = $Summe * (value('TE01_04') / 100);
018
019 $ren1 = (float)str_replace(value('%', '', 'EX04_01')) * 100;
020 $ren2 = (float)str_replace(value('%', '','EX04_02')) * 100;
021 $ren3 = (float)str_replace(value('%', '', 'EX04_03')) * 100;
022 $ren4 = (float)str_replace(value('%', '', 'EX04_04')) * 100;

Vielen Dank für Ihre Unterstützung und Hilfe!
by SoSci Survey (302k points)
$ren1 = (float)str_replace(value('%', '', 'EX04_01')) * 100;

Schon nah' dran, aber value() will nur einen Parameter, das Prozent und der leere String gehören zum str_replace().
by s222544 (555 points)
Vielen Dank!

Wollte das so umsetzen:
$ren1 = (float)str_replace('%', '')(value('EX04_01') * 100);
$ren2 = (float)str_replace('%', '')(value('EX04_02') * 100);
$ren3 = (float)str_replace('%', '')(value('EX04_03') * 100);
$ren4 = (float)str_replace('%', '')(value('EX04_04') * 100);

jedoch kommt die Warnung: Warnung: Der folgende PHP-Code ist nicht zulässig:
str_replace('%', '')(value('EX04_01')

Warnung: Der PHP-Code enthält Funktionen oder PHP-Elemente, die nicht für die Verwendung im Fragebogen freigegeben wurden. Falls Sie der Meinung sind, dass die monierten Konstrukte ungefährlich sind, setzen Sie sich bitte mit dem Administrator in Kontakt!

Sobald ich die Klammern um die Multiplikation mit 100 weglasse (wie es auch im Debug Statement ohne Klammern steht), kommt folgende Warnung:
Warnung: Unerwartetes Element: value - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?
$ren1 = (float)str_replace('%', '')value

Vielen Dank!
by SoSci Survey (302k points)
Ich sehe schon, wir müssen noch ein wenig am Programmieren arbeiten :)

Die Funktion str_replace() erwartet drei Parameter, im obigen Code haben Sie zwei: str_replace('%', ''). Alle drei Parameter müssen innerhalb der Klammer stehen. Der dritte ist der Text, in dem gesucht/ersetzt werden soll. In Ihrem Fall ist der dritte Parameter also die value()-Funktion.

Das Ergebnis der str_replace()-Funktion wird dann mittels (float) in eine Dezimalzahl konvertiert, und anschließend mit dem Astersik (*) mit der 100 multipliziert.
by s222544 (555 points)
Vielen Dank für Ihren hilfreichen Kommentar! Die Gewichtungen funktionieren richtig, nur kommt folgende Fehlermeldung auf:
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 19

PHP-Code

016 $begassets_bo1 = $Summe * (value('TE01_03') / 100);
017 $begassets_go1 = $Summe * (value('TE01_04') / 100);
018
019 $ren1 = (float)str_replace('%', '', value('EX04_01')/100);
020 $ren2 = (float)str_replace('%', '', value('EX04_02')/100);
021 $ren3 = (float)str_replace('%', '', value('EX04_03')/100);
022 $ren4 = (float)str_replace('%', '', value('EX04_04')/100);
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 20

PHP-Code

017 $begassets_go1 = $Summe * (value('TE01_04') / 100);
018
019 $ren1 = (float)str_replace('%', '', value('EX04_01')/100);
020 $ren2 = (float)str_replace('%', '', value('EX04_02')/100);
021 $ren3 = (float)str_replace('%', '', value('EX04_03')/100);
022 $ren4 = (float)str_replace('%', '', value('EX04_04')/100);
023
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 21

PHP-Code

018
019 $ren1 = (float)str_replace('%', '', value('EX04_01')/100);
020 $ren2 = (float)str_replace('%', '', value('EX04_02')/100);
021 $ren3 = (float)str_replace('%', '', value('EX04_03')/100);
022 $ren4 = (float)str_replace('%', '', value('EX04_04')/100);
023
024 $endassets_cash1 = $begassets_cash1*(1+$ren1);
Fehler im Fragebogen: A non-numeric value encountered
Zeile: 22

PHP-Code

019 $ren1 = (float)str_replace('%', '', value('EX04_01')/100);
020 $ren2 = (float)str_replace('%', '', value('EX04_02')/100);
021 $ren3 = (float)str_replace('%', '', value('EX04_03')/100);
022 $ren4 = (float)str_replace('%', '', value('EX04_04')/100);
023
024 $endassets_cash1 = $begassets_cash1*(1+$ren1);
025 $endassets_ak1 = $begassets_ak1*(1+$ren2);

Debug Informationen für die Fehler Zeilen ren1 bis 4:

Debug-Information für $ren1:
$ren1 = 0.004 (double) korrekt nur in Dezimalform

Debug-Information für $ren2:
$ren2 = 0.2548 (double) auch korrekt, wieder in Dezimalform

Debug-Information für $ren3:
$ren3 = -0.0165 (double)

Debug-Information für $ren4:
$ren4 = -0.309 (double)

Woran liegt dieser Fehler?

Vielen vielen Dank für Ihre Unterstützung!
by SoSci Survey (302k points)
> $ren1 = (float)str_replace('%', '', value('EX04_01')/100);

Sie solten die Klammer noch ein wenig anders setzen. Erst str_replace(), dann durch 100 dividieren.
by s222544 (555 points)
Vielen Dank für Ihre Hilfe!
Das Problem wurde behoben! :)

Es tritt nur noch ein Fehler auf, wenn eine oder mehrere Kategorien (der 4) eine Gewichtung von 0% haben. Zum Beispiel: 100% Cash und nichts in den anderen dreien.

Es tritt folgender Fehler auf, immer in (ab) der Zeile, die eine Gewichtung von 0% haben:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Unsupported operand types: string / int
Zeile: 15

PHP-Code

012 }
013
014 $begassets_cash1 = $Summe * (value('TE01_01') / 100);
015 $begassets_ak1 = $Summe * (value('TE01_02') / 100);
016 $begassets_bo1 = $Summe * (value('TE01_03') / 100);
017 $begassets_go1 = $Summe * (value('TE01_04') / 100);
018

Habe jetzt folgenden Code unter "Angelegter Summe" ergänzt - ohne Behebung des Problems.
if (value('TE01_01') == '') {
    $weight_cash1 = '';
} elseif (value('TE01_02') == '') {
    $weight_ak1 = '';
} elseif (value('TE01_03') == '') {
    $weight_bo1 = '';
} elseif (value('TE01_04') == '') {
    $weight_go1 = '';
}

if (value('TE01_01') == '100') {
    $weight_cash1 = 100;
} elseif (value('TE01_02') == '100') {
    $weight_ak1 = 100;
} elseif (value('TE01_03') == '100') {
    $weight_bo1 = 100;
} elseif (value('TE01_04') == '100') {
    $weight_go1 = 100;
}

danach kommt $begassets_cash1 = $Summe * (value('TE01_01') / 100); usw.


Ich bin sehr dankbar für Ihre Hilfe!
by SoSci Survey (302k points)
> Fehler im Fragebogen: Unsupported operand types: string / int

Was genau wird denn in TE01_02 gespeichert, wenn da Gewicht dort 0 ist?

Sie können den Fehler voraussichtlich durch eine explizite Umwandlung in eine Zahl vermeiden:

$begassets_ak1 = $Summe * ((int)value('TE01_02') / 100);

Ob Sie (int) oder (float) für das sog. "typecasting" verwenden, das hängt natürlich davon ab, ob die Zahl als Ganzzahl oder Dezimalzahl gespeichert ist.
by s222544 (555 points)
Vielen Dank für Ihren Hinweis mit (int)! Alles funktioniert!

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

...