Liferay: Berechnungen innerhalb von dynamischen Datenlisten (Velecity Templates)

Nachdem ich heute auf das Problem gestoßen bin, bisher in Calc-Sheets geführte Listen in Liferay mittels dynamischer Datenlisten abzubilden, kam das Problem auf, die kann ich denn innerhalb eines Feldes Berechnungen aus anderen Feldern durchführen zu lassen?

Bauen wir uns ein Velocity Template zusammen und das berechnet uns dann die Werte. Problem aktuell: Wir sind nicht generisch, d.h. die Felder, die berechnet werden sollen, müssen wir quasi fest „verdrahten“, aber egal, dem Kunden genügt’s.

Berechnungen sind die normalen Grundrechenarten (+, -, *, /), doch damit lässt sich ja schon einiges anfangen 😉

Im Control Panel von Liferay klicken wir uns die Datenliste gemäß den Wünschen des Kunden zusammen, die Felder, die zur Berechnung herangezogen werden sollen, sowie alle anderen Felder auch, benennen wir so, das es uns später leicht fällt sie im Velocity Template heraus zu filtern.

Abspeichern und schon ein paar Testwerte eintragen, damit später auch getestet werden kann, ob die Berechnung klappt.

Gehen wir zurück in unser Frontend, exemplarisch habe ich jetzt im folgenden Code nur die beiden Datenfelder ausgelesen, die die Zahlen zur Berechnung beinhalten, ich habe hier die SUM() Funktion über zwei Zellen abgebildet.

#set ($ddlRecordService = $serviceLocator.findService('com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService'))
#set ($recordSetId = $getterUtil.getInteger($reserved_record_set_id.data, 0))

## Wir holen uns sämtliche Einträge der konfigurierten Liste
## und packen Sie in ein neues Array

#set ($records = $ddlRecordService.getRecords($recordSetId))
#set ($listItems= [])
#foreach($rec in $records)
#set ($fields = $rec.getFields())
#set ($no1 = $fields.get("no1").getValue())
#set ($no2 = $fields.get("no2").getValue())
#set ($no3 = $fields.get("no2").getValue()+$fields.get("no2").getValue())

Nr1 Nr2 Nr3
$no1 $no2 $no3
#end

Abspeichern, auf das Template umschalten und fertig. Zusätzlich müssen natürlich die weiteren Felder noch hinzugefügt werden, die ich hier aber zu Demozwecken weggelassen habe.