Total sum of fileds

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?

LloydCapture%20storting

1 Like

Hello @LloydS

I suggest you to add ValueChangeListener for all required fields and recalculate total sum

Regards,
Daniil

1 Like

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.