Hi everyone,
I’m trying to get a total sum of some calculated fields. I’ve tried many examples given but still no luck. Can someone please help?
Lloyd
Hi everyone,
I’m trying to get a total sum of some calculated fields. I’ve tried many examples given but still no luck. Can someone please help?
Lloyd
Hello @LloydS
I suggest you to add ValueChangeListener
for all required fields and recalculate total sum
Regards,
Daniil
Thanks Daniil,
Can you please help with an example?
Regards,
Lloyd
Let’s consider the following screen layout:
<textField dataContainer="totalSumEntityDc" property="name"/>
<form id="form" dataContainer="totalSumEntityDc">
<column width="150px">
<textField id="f1" datatype="int"/>
<textField id="f2" datatype="int"/>
<textField id="f3" datatype="int"/>
</column>
<column width="250px">
<textField id="field1Field" property="field1" editable="false"/>
<textField id="field2Field" property="field2" editable="false"/>
<textField id="field3Field" property="field3" editable="false"/>
</column>
</form>
<textField id="totalSumField"
dataContainer="totalSumEntityDc" property="totalSum"
editable="false"/>
So recalculate logic will be the following:
@Inject
protected TextField<String> f1;
@Inject
protected TextField<String> f2;
@Inject
protected TextField<String> f3;
@Inject
protected TextField<Integer> field1Field;
@Inject
protected TextField<Integer> field2Field;
@Inject
protected TextField<Integer> field3Field;
@Subscribe("f1")
private void onF1ValueChange(HasValue.ValueChangeEvent<Integer> event) {
// "calculate" value
field1Field.setValue(nullToZero(event.getValue()) * 2);
}
@Subscribe("f2")
private void onF2ValueChange(HasValue.ValueChangeEvent<Integer> event) {
// "calculate" value
field2Field.setValue(nullToZero(event.getValue()) * 3);
}
@Subscribe("f3")
private void onF3ValueChange(HasValue.ValueChangeEvent<Integer> event) {
// "calculate" value
field3Field.setValue(nullToZero(event.getValue()) * 4);
}
@Subscribe("field1Field")
private void onField1FieldValueChange(HasValue.ValueChangeEvent<Integer> event) {
// trigger update
recalcTotalSum();
}
@Subscribe("field2Field")
private void onField2FieldValueChange(HasValue.ValueChangeEvent<Integer> event) {
// trigger update
recalcTotalSum();
}
@Subscribe("field3Field")
private void onField3FieldValueChange(HasValue.ValueChangeEvent<Integer> event) {
// trigger update
recalcTotalSum();
}
private void recalcTotalSum() {
getEditedEntity().setTotalSum(
nullToZero(field1Field.getValue()) +
nullToZero(field2Field.getValue()) +
nullToZero(field3Field.getValue()));
}
// helper function
private static int nullToZero(Integer integer) {
return integer != null ? integer : 0;
}
Regards
Thank you very much. Many thanks
package com.company.qbase.web.storting;
import com.company.qbase.entity.Registreren;
import com.haulmont.cuba.core.global.Metadata;
import com.haulmont.cuba.gui.components.AbstractEditor;
import com.company.qbase.entity.Storting;
import javax.inject.Inject;
import javax.inject.Named;
import java.math.BigDecimal;
import java.util.Map;
import java.util.UUID;
import com.haulmont.cuba.gui.components.Component;
import com.haulmont.cuba.gui.components.Field;
import com.haulmont.cuba.gui.data.CollectionDatasource;
import com.haulmont.cuba.gui.data.Datasource;
public class StortingEdit extends AbstractEditor {
@Inject
private Metadata metadata;
@Override
protected boolean preCommit() {
BigDecimal subTotalCent = getItem()
.getCenten()
.multiply(BigDecimal.valueOf(getItem().getMaalCenten()));
getItem().setTotaalCenten(subTotalCent);
BigDecimal subTotalStuiver = getItem()
.getStuivers()
.multiply(BigDecimal.valueOf(getItem().getMaalStuivers()));
getItem().setTotaalStuivers(subTotalStuiver);
BigDecimal subTotalDubbeltje = getItem()
.getDubbeltjes()
.multiply(BigDecimal.valueOf(getItem().getMaalDubbeltjes()));
getItem().setTotaalDubbeltjes(subTotalDubbeltje);
BigDecimal subTotalKwartje = getItem()
.getKwartjes()
.multiply(BigDecimal.valueOf(getItem().getMaalKwartjes()));
getItem().setTotaalKwartjes(subTotalKwartje);
BigDecimal subTotalGulden = getItem()
.getGuldens()
.multiply(BigDecimal.valueOf(getItem().getMaalGuldens()));
getItem().setTotaalGuldens(subTotalGulden);
BigDecimal subTotalRijksdaalder = getItem()
.getRijksdaalders()
.multiply(BigDecimal.valueOf(getItem().getMaalRijksdaalders()));
getItem().setTotaalRijksdaalders(subTotalRijksdaalder);
BigDecimal subTotalVijfgulden = getItem()
.getVijfguldens()
.multiply(BigDecimal.valueOf(getItem().getMaalVijfguldens()));
getItem().setTotaalVijfguldens(subTotalVijfgulden);
BigDecimal subTotalTiengulden = getItem()
.getTienguldens()
.multiply(BigDecimal.valueOf(getItem().getMaalTienguldens()));
getItem().setTotaalTienguldens(subTotalTiengulden);
BigDecimal subTotalTwintiggulden = getItem()
.getTwintigguldens()
.multiply(BigDecimal.valueOf(getItem().getMaalTwintigguldens()));
getItem().setTotaalTwintigguldens(subTotalTwintiggulden);
BigDecimal subTotalVijftiggulden = getItem()
.getVijftigguldens()
.multiply(BigDecimal.valueOf(getItem().getMaalVijftigguldens()));
getItem().setTotaalVijftigguldens(subTotalVijftiggulden);
BigDecimal subTotalHonderdgulden = getItem()
.getHonderdguldens()
.multiply(BigDecimal.valueOf(getItem().getMaalHonderdguldens()));
getItem().setTotaalHonderdguldens(subTotalHonderdgulden);
return super.preCommit();
}
private boolean needRefreshBrowser;
// indicates for the calling code that we saved some entities
// and the browser's datasource should be refreshed
public boolean isNeedRefreshBrowser() {
return needRefreshBrowser;
}
private void setInitialData(Storting newStorting) {
}
public void onSaveAndNewClick() {
// commit entity
if( commit()){
Storting newStorting = metadata.create(Storting.class);
this.setInitialData(newStorting);
// create new instance and set it for the editor
setItem(newStorting);
}
// indicate that we saved some entities
needRefreshBrowser = true;
}
}
I would like to have a grandtotal of all totaal…fields in one field. I tried to use the example given, but i get only errors. So i started again from the working situation.