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

Hallo SoSci Survey Support Team,

vielen Dank für die Unterstützung in meinem Projekt.

Ich möchte die PHP Berechnungen, die früher vertikal angzeigt wurden, in einer HTML Tabelle zusammenfassen. Meine Frage baut auf einer früheren Frage auf: https://support.soscisurvey.de/?qa=45752/veranderungen-in-der-gewichtung-anzeigen

Es soll die Veränderung in Prozent berechnet werden. Probleme treten auf, wenn der Ursprungswert 0 ist, somit keine Division durch 0 möglich ist.

Der PHP Code hat das Problem elegant gelöst:

if ((int)value('TE01_01') == 0) {
    html('<p> Tagesgeld: Keine Berechnung der Veränderung möglich.</p>');
} else {
    $change_cash1 = (($weight_cash1-(int)value('TE01_01'))/(int)value('TE01_01'))*100;
 html('<p> Tagesgeld: '.str_replace('.', ',', sprintf('%1.2f', $change_cash1)).'%</p>');
}
if ((int)value('TE01_02') == 0) {
    html('<p> Aktien: Keine Berechnung der Veränderung möglich.</p>');
} else {
    $change_ak1 = (($weight_ak1-(int)value('TE01_02'))/(int)value('TE01_02'))*100;
  html('<p> Aktien: '.str_replace('.', ',', sprintf('%1.2f', $change_ak1)).'%</p>');
}
if ((int)value('TE01_03') == 0) {
    html('<p> Anleihen: Keine Berechnung der Veränderung möglich.</p>');
} else {
    $change_bo1 = (($weight_bo1-(int)value('TE01_03'))/(int)value('TE01_03'))*100;
  html('<p> Anleihen: '.str_replace('.', ',', sprintf('%1.2f', $change_bo1)).'%</p>');
}
if ((int)value('TE01_04') == 0) {
    html('<p> Gold: Keine Berechnung der Veränderung möglich.</p>');
} else {
    $change_go1 = (($weight_go1-(int)value('TE01_04'))/(int)value('TE01_04'))*100;
  html('<p> Gold: '.str_replace('.', ',', sprintf('%1.2f', $change_go1)).'%</p>');
}

Wie kann ich diese PHP Berechnungen in meine HTML Tabelle einfügen?

Hier ist meine Tabelle:

<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
text-align: center;
}
</style> 

<table style="width:100%">
<table>
  <tr>
    <th></th>
    <th>Ursprungsportfolio</th>
    <th>Rendite</th>
    <th>Portfolio in einem Jahr</th>
    <th>Veränderung</th>
    
  </tr>
  <tr>
    <td>Tagesgeld</td>
    <td>%bargeld1%%</td>
    <td>%wert11%</td>
    <td>%portcash1%%</td>
    <td>%portchangecash1%%</td>
    
  </tr>
  <tr>
    <td>Aktien</td>
    <td>%aktien1%%</td>
    <td>%wert21%</td>
    <td>%portaktien1%%</td>
    <td>%portchangeaktien1%%</td>
    
  </tr>
  <tr>
    <td>Anleihen</td>
    <td>%bonds1%%</td>
    <td>%wert31%</td>
    <td>%portbonds1%%</td>
    <td>%portchangebonds1%%</td>
    
  </tr>
  <tr>
    <td>Gold</td>
    <td>%gold1%%</td>
    <td>%wert41%</td>
    <td>%portgold1%%</td>
    <td>%portchangegold1%%</td>
  </tr>
  
</table>

Anbei ein Foto, wie die optimale Umsetzung wäre.

Vielen Dank im Voraus!

by s222544 (565 points)
edited by s222544
Vielleicht als bessere Ansicht der Tabelle:

<!-- Tabelle erstellen

<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
text-align: center;
}
</style>

<table style="width:100%">
<table>
  <tr>
    <th></th>
    <th>Ursprungsportfolio</th>
    <th>Rendite</th>
    <th>Portfolio in einem Jahr</th>
    <th>Veränderung</th>
    
  </tr>
  <tr>
    <td>Tagesgeld</td>
    <td>%bargeld1%%</td>
    <td>%wert11%</td>
    <td>%portcash1%%</td>
    <td>%portchangecash1%%</td>
    
  </tr>
  <tr>
    <td>Aktien</td>
    <td>%aktien1%%</td>
    <td>%wert21%</td>
    <td>%portaktien1%%</td>
    <td>%portchangeaktien1%%</td>
    
  </tr>
  <tr>
    <td>Anleihen</td>
    <td>%bonds1%%</td>
    <td>%wert31%</td>
    <td>%portbonds1%%</td>
    <td>%portchangebonds1%%</td>
    
  </tr>
  <tr>
    <td>Gold</td>
    <td>%gold1%%</td>
    <td>%wert41%</td>
    <td>%portgold1%%</td>
    <td>%portchangegold1%%</td>
  </tr>
  
</table>
 -->

Vielleicht noch zur Erklärung von der Veränderung in der Gewichtung:
Folgenden PHP Code benutze ich vor der Tabelle:

putList('EX14', [$change_cash1,$change_ak1,$change_bo1,$change_go1]); um die Veränderungen der Gewichtung als interne Variable zu speichern.


//Platzhalter für Veränderung in der Gewichtung nach einem Jahr
replace('%portchangecash1%', 'EX14_01', 'response');
replace('%portchangeaktien1%', 'EX14_02', 'response');
replace('%portchangebonds1%', 'EX14_03', 'response');
replace('%portchangegold1%', 'EX14_04', 'response');

//Punkt durch Komma ersetzen in der Veränderung der Gewichtung nach einem Jahr
replace('%portchangecash1%', str_replace('.', ',', sprintf('%1.2f',value('EX14_01'))));
replace('%portchangeaktien1%', str_replace('.', ',',sprintf('%1.2f', value('EX14_02'))));
replace('%portchangebonds1%', str_replace('.', ',',sprintf('%1.2f', value('EX14_03'))));
replace('%portchangegold1%', str_replace('.', ',', sprintf('%1.2f',value('EX14_04'))));
by s222544 (565 points)
Durch die Ergänzung von if ((int)value('TE01_01') == 0) {
$change_cash1 = "Keine Berechnung möglich"; usw.
speichert die IV EX14 (Veränderung in der Gewichtung) bei einem Ausgangswert von Null "Keine Berechnung möglich".

Debug Statements bestätigen dies: Debug-Information für 'EX14_01':
'EX14_01' = EX14_01 (string)
value('EX14_01') = Keine Berechnung möglich

Trotz replace(): replace('%portchangecash1%', 'EX14_01', 'response');
speichert und zeigt %portchangecash1% in der HTML Tabelle nicht an, dass keine Berechnung möglich ist. Es erscheint immernoch die Null.

Hier das Debug Statement: Debug-Information für '%portchangecash1%':
'%portchangecash1%' = %portchangecash1% (string)

Warum wird das Statement zwar korrekt in der internen Variable angezeigt, nicht, aber in der Tabelle mit Platzhalter %portchangecash1%, obwohl der PHP Code mit den Platzhaltern keine Fehler anzeigt?

Vielen Dank im Voraus!
by SoSci Survey (305k points)
Mit dem Knopf {} beim Eintragen von Fragen können Sie Code als solchen formatieren. Ich habe das oben mal geändert.

1 Answer

0 votes
by SoSci Survey (305k points)

Ich würde empfehlen, dass Sie den Text nicht direkt mittels html() ausgeben, sondern in einen Platzhalter schreiben.

// Bisher
if ((int)value('TE01_01') == 0) {
    html('<p> Tagesgeld: Keine Berechnung der Veränderung möglich.</p>');
} else {
    $change_cash1 = (($weight_cash1-(int)value('TE01_01'))/(int)value('TE01_01'))*100;
 html('<p> Tagesgeld: '.str_replace('.', ',', sprintf('%1.2f', $change_cash1)).'%</p>');
}

// Platzhalter
if ((int)value('TE01_01') == 0) {
    replace('%tagesgeld%', 'Keine Berechnung der Veränderung möglich');
} else {
    $change_cash1 = (($weight_cash1-(int)value('TE01_01'))/(int)value('TE01_01'))*100;
    replace('%tagesgeld%', str_replace('.', ',', sprintf('%1.2f', $change_cash1)).'%');
}

In der HTML-Tabelle würden Sie dann einfach den Platzhalter an die entsprechende Stelle schreiben.

<td>%tagesgeld%</td>
by s222544 (565 points)
Vielen Dank für Ihre elegante Lösung!
by s222544 (565 points)
Darf ich Sie noch um Rat bezüglich des Designs der HTML Tabelle bitten?

Trotz <table style="width:100%"> nimmt die Tabelle nicht die gesamte Breite des Bildschirms in Anspruch. Wie kann ich die Tabelle so vergrößern, dass die Breite besser genutzt wird?

Aufgrund des gesamten Style Blocks:

 <style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
text-align: center;
}
</style>

sehen die Fragen, die unter der Tabelle stehen komisch aus und der "Weiter" Knopf unten rechts auf der Seite ist eingerahmt.

Wenn ich das <style> weglasse sind zwar die Formatierungen wieder normal, aber es entfällt auch der Rahmen um die Tabelle, den ich gerne beibehalten würde.

Vielen Dank im Voraus!
by SoSci Survey (305k points)
Bitte posten Sie einen Pretest-Link, der direkt zur Tabelle führt - um die Frage zu beantworten, benötige ich mehr Kontext :)
by s222544 (565 points)
Gerne, danke! :)

Hier ein Link mit nur Zahlen in der Tabelle (kleinste Größe der Tabelle): https://www.soscisurvey.de/reta/index.php?i=R1AKMJUVBO3W&rnd=SXJE


Hier ein Link mit der Aussage, dass keine Berechnung möglich ist (Tabelle wird etwas breiter):
https://www.soscisurvey.de/reta/index.php?i=P468L744CXV8&rnd=AUMG
by SoSci Survey (305k points)
Im HTML-Code der Seite steht folgendes:

<table style="width:400%">
<table>

Also, mal angesehen davon, dass 400% zu breit ist, ist dieses <table>-Tag nicht für Ihre Tabelle zuständig, weil direkt darunter noch ein weiteres, neues <table>-Tag öffnet. Entfernen Sie das zweite bitte.
by s222544 (565 points)
Vielen Dank! Habe das zweite <table> entfernt und die Tabelle nimmt jetzt die gesamte Breite in Anspruch.

Nur die Umrandungen stören noch. Hätten Sie da vielleicht Vorschläge, wie der Rahmen der Tabelle erhalten bleibt, aber die Umrandungen der Folgefragen und des Weiter Knopfes entfallen?

Vielen Dank im Voraus!
by SoSci Survey (305k points)
Spezifizieren Sie das CSS, zum Beispiel indem Sie der Tabelle eine Klasse geben:

<table class="changes">

Und dann in Ihrem CSS entsprechend:

table.changes,
table.changes th,
table.changes td {
  border: 1px solid black;
  border-collapse: collapse;
}
by s222544 (565 points)
Dürfte ich Sie höflich um eine genauere Anleitung bitten?
Die Seite sieht zwar wieder normal aus, nur hat meine Tabelle keinen Rand mehr und table.changes, table.changes th, table.changes td { border: 1px solid black; border-collapse: collapse; } th, td { padding: 5px; text-align: center; } steht jetzt über der Tabelle...

Hier ein Link zur Seite:
https://www.soscisurvey.de/reta/index.php?i=QQS4T89DY1Z5&rnd=BCZZ

Vielen Dank im Voraus für Ihre Unterstützung! :)
by SoSci Survey (305k points)
> Dürfte ich Sie höflich um eine genauere Anleitung bitten?

https://www.w3schools.com/html/html_classes.asp

> und table.changes, table.changes th, table.changes td { border: 1px solid black; border-collapse: collapse; } th, td { padding: 5px; text-align: center; } steht jetzt über der Tabelle...

Den CSS-Code müssen Sie bitte weiterhin via pageCSS() einbinden, nicht als HTML-Code. Das CSS steuert die Darstellung. Das class="changes" (das "changes" ist hier willkürlich gewählt) sagt nur, in welchem stil die Tabelle dargestellt werden soll. Und natürlich gehört das class="changes" in die <table>, die Sie schon haben - nicht in ein neues zusätzliches <table>-Element, denn Sie wollen ja weiterhin nur eine Tabelle.
by s222544 (565 points)
Vielen Dank für Ihre Anleitung!
Benutze folgenden PHP Code:
// CSS Design in HTML Tabelle einbinden
pageCSS('
 table.changes,
table.changes th,
table.changes td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
padding: 5px;
text-align: center;
}
');

Jetzt tritt nur noch das Problem auf, dass
<table class="changes"> und
<table style="width:100%">

nicht zusammen verwendet werden können. Lasse ich <table class="changes"> so entfällt der Rahmen, aber die gesamte Breite wird genutzt.

Lasse ich <table style="width:100%"> weg, so erscheint zwar der Rahmen, aber die gesamte Breite wird nicht genutzt.

Ich habe schon versucht, eins der Befehle in den PHP Code zu verschieben, ohne Erfolg.

Wie kann ich beide gleichzeitig verwenden?

Vielen Dank im Voraus!
by SoSci Survey (305k points)
> <table class="changes"> und
> <table style="width:100%">
> nicht zusammen verwendet werden können.

Doch, natürlich ... s. https://www.w3schools.com/htmL/html_attributes.asp

Also <table class="changes" style="width:100%">

Natürlich könnten Sie das width:100% auch direkt im CSS-Code unterbringen. Dann müssten Sie table.change und die Defintion für td/th nur trennen.
by s222544 (565 points)
DANKE für Ihre Hilfe!

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

...