0 votes
in SoSci Survey (dt.) by s222544 (640 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 (640 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 (640 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 (327k 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 (327k 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 (640 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 (327k 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 (640 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 (327k 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 (640 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

...