Como calcular saldo acumulativo

Olá

Segue imagem

Estou precisando calcular o saldo desse extrato linha a linha e ir acumulando. Exemplo

Valor Saldo
500,00 C 500,00
1.000,00 C 1.500,00
450,90 D 1.049,10

Alguém tem alguma ideia de como fazer isso?

Qual é o método de calculo, tens o fonte? Foi criada regra para desconto e compra ? Só criar um laço incrementando o valor[1] para o valor[2]… Se [D] - se [C] +

É justamente esse laço que não estou conseguindo fazer… O que fiz não acumula o valor ele fica repetindo o mesmo valor da coluna valor.

      //aqui estou assumindo que C e D é um boolean, true quando for C
If (creditoOuDebito) valorIterado = valor;
                else valorIterado = -valor;

saldoAtual = saldoLinhaAnterior  + valorIterado

pra ajudar mais precisaria saber o código

Qual o código você precisa ver?

Tentei colocar um ajax no datatable chamando um método no bean

Mas da erro dizendo que load não é suportado pelo datatable. E não sei qual evento colocar.

<p:ajax event=“load"
listener=”#{bancolancamentosBean.fnCalculaSaldo}"
update=“tabela” />

if (bancoextrato.getCd().equals(“C”)){
saldo = saldo.add(valor);
} else {
saldo = saldo.subtract(valor);
}

como vc chama cada campo saldo de cada linha? para definir um valor ao campo saldo da linha 10 por exemplo?

Não entendi

Você quer dizer como preenchi o datatable?

Alex vc tem uma Classe que representa este dados não tem? Você poderia usar enum para o tipo C e D serão constantes e cada um tem seu calculo, olha um exemplo que peguei daqui:

exemplo:

public enum Cargo implements Comissao {
 
    ATENDENTE {
         @Override
         public double calculaComissao(double valor) {
              return valor * 0.1;
         }
    },
    VENDEDOR {
         @Override
         public double calculaComissao(double valor) {
              return valor * 0.15 + 5;
         }
    };
 
}

ai por exemplo no lugar de ATENDENTE vc colocaria C e assim por diante.
e na sua classe que representa esses dados, de acordo com o exemplo que estou dando:

public class Funcionario {
 
     private String nome;
     private double salario;
     //este é o enum do exemplo
     private Cargo cargo;
 
     //métodos
 
}

Ai seria usado da seguinte maneira:

public class Venda {
 
     private final Funcionario funcionario;
     private final double valor;
 
     public Venda(Funcionario funcionario, double valor) {
          this.funcionario = funcionario;
          this.valor = valor;
     }
 
     public double calculaComissao() {
 
          double comissao = 0.0;
 
          Cargo cargo = this.funcionario.getCargo();
          //veja que o próprio enum já tem o calculaComissao proprio.
          comissao = cargo.calculaComissao(valor);
 
          return comissao;
 
     }
 
}

Este é só uma ideia @alexpassos acessa o link e ver se tu consegue implementar no seu código. #Dica

Beleza vou ver o link e pesquisar sobre o enum

Retorno com o resultado

Blz alex pesquisa ai, se quiser posso te dar um exemplo já no seu modelo. Mas eu não entendi isso aqui:

o que é esse C
o D eu entendi como deposito é isso?
Mas pq o 500 não aumento, mas quando foi 1000 aumento para 1500

É um extrato bancário então:

C - Crédito
D- Débito

No caso do 500 foi o primeiro lançamento então:

0 + 500 = 500
500 + 1000 = 1500
1500 - 450,00 = 1050
1050 + 3000 = 4050

O que não estou conseguindo é fazer esse saldo acumulativo

1 curtida

Jeanderson_Silva

Não consegui achar nenhum exemplo que o enum guarde um valor anterior para calcular com o próximo.

No exemplo do link ele calcula a comissão e retorna o resultado mas não aguarda o valor.

1 curtida

Entendi mano, vou fazer um exemplo rápido aqui para te mostrar e ver se vc consegue tirar alguma ideia para usar no seu blz?

@alexpassos fiz um exemplo para vc no netbeans, aqui vai o projeto:
exemplo_enum.zip (22,0 KB)
Lembrando que é só um exemplo vc teria q adaptar de acordo com o dado q vem do banco de dados que vc usa, mas executando o main:

public static void main(String[] args) {
        Extrato extrato = new Extrato();
        //vamos fazer as operações., Veja q informamos qual o enum utilizado.
        extrato.calcularSaldo(Operacao.CREDITO, 500, "teste crédito");
        System.out.println("Historico: " + extrato.getHistorico() + "| Valor: " + extrato.getSaldoAnterior() + " |Saldo: " + extrato.getSaldoAtual());
        extrato.calcularSaldo(Operacao.CREDITO, 1000, "crédito 2");
        System.out.println("Historico: " + extrato.getHistorico() + "| Valor: " + extrato.getSaldoAnterior() + " |Saldo: " + extrato.getSaldoAtual());
        //agora operação de debito.
        extrato.calcularSaldo(Operacao.DEBITO, 450, "Débito Teste");
        System.out.println("Historico: " + extrato.getHistorico() + "| Valor: " + extrato.getSaldoAnterior() + " |Saldo: " + extrato.getSaldoAtual());
        
        //crédito dnv
        extrato.calcularSaldo(Operacao.CREDITO, 3000, "Crédito");
        System.out.println("Historico: " + extrato.getHistorico() + "| Valor: " + extrato.getSaldoAnterior() + " |Saldo: " + extrato.getSaldoAtual());
    }

Teremos como resultado:

Historico: teste crédito| Valor: 0.0 |Saldo: 500.0
Historico: crédito 2| Valor: 500.0 |Saldo: 1500.0
Historico: Débito Teste| Valor: 1500.0 |Saldo: 1050.0
Historico: Crédito| Valor: 1050.0 |Saldo: 4050.0
1 curtida

Cara não funcionou ficou do mesmo jeito que eu tinha feito antes.

Olhe a imagem

Esta repetindo o o valor no saldo com a diferença de negativo e positivo.

Lembrando que estou usando PrimeFaces + Hibernate (Java Web)

Fiz as classes assim:

INTERFACES

public interface Saldo {

public BigDecimal CalcularSaldo(BigDecimal valorAnterior, BigDecimal valorAtual);

}//fim interface

ENUM

public enum CalculaSaldo implements Saldo {

CREDITO{

  @Override
  public BigDecimal CalcularSaldo(BigDecimal valorAnterior, BigDecimal valorAtual){
  	return valorAnterior.add(valorAtual);
  }

},
DEBITO{

  @Override
  public BigDecimal CalcularSaldo(BigDecimal valorAnterior, BigDecimal valorAtual){
  	return valorAnterior.subtract(valorAtual);
  }

};

@Override
public String toString() {
switch (this) {
case CREDITO:
return “C”;

  case DEBITO:
  	return "D";
  default:
  	return null;
  }

}

}//fim enum

Classe Extrato

public class clsExtrato {

private BigDecimal saldoAtual;
private BigDecimal saldoAnterior;
private CalculaSaldo calculaSaldo;

public clsExtrato() {
//saldo inicial com 0
this.saldoAtual = new BigDecimal(“0.00”);
}

public void fnCalculaSaldo(CalculaSaldo operacao, BigDecimal valor){

  //salva o saldo anterior antes de alterar.
  this.saldoAnterior = this.saldoAtual;
  
  //a operação que for passada fará o calculo para nós evitando um monte de if em várias partes do código. Veja no main!
  this.saldoAtual = operacao.CalcularSaldo(this.saldoAtual, valor);
  
  //salvo se caso nós precisar usar.
  this.calculaSaldo = operacao;

}

public BigDecimal getSaldoAtual() {
return saldoAtual;
}

public void setSaldoAtual(BigDecimal saldoAtual) {
this.saldoAtual = saldoAtual;
}

public BigDecimal getSaldoAnterior() {
return saldoAnterior;
}

public void setSaldoAnterior(BigDecimal saldoAnterior) {
this.saldoAnterior = saldoAnterior;
}

public CalculaSaldo getCalculaSaldo() {
return calculaSaldo;
}

public void setCalculaSaldo(CalculaSaldo calculaSaldo) {
this.calculaSaldo = calculaSaldo;
}

}//fim classe

E por fim chamei a assim pelo get que carrega o datatable (ArrayList)

public BigDecimal getSaldo() {

  if (saldo == null){
  	saldo = new BigDecimal("0.00");
  }
  
  clsExtrato cExtrato = new clsExtrato();
  
  if (cd.equals("C")){
  	cExtrato.fnCalculaSaldo(CalculaSaldo.CREDITO, valor);
  } else {
  	cExtrato.fnCalculaSaldo(CalculaSaldo.DEBITO, valor);
  }
  
  saldo = cExtrato.getSaldoAtual();
  
  return saldo;

}

1 curtida

Mano ainda não mexi com Hibernate e nem PrimeFace, logo logo vou chegar neste estudo ai kk mas falando do seu código, onde vc sabe que vai um valor para a coluna Valor e outro vai para a coluna Saldo ?

Como eu acho q esse getSaldo() é chamado várias vezes, não poderia instanciar várias vezes Extrato, já que no caso ele sempre vai resetar. No exemplo que dei
o Extrato só é instanciado uma única vez, somente seus métodos que é executado várias vezes.

Eu percebi isso, esse classe é controler com get e set ela é gira em todas as linhas.

Estou vendo como faço para instância Extrato fora disso e passar por parâmetro.

Pois é mano, queria ajudar mais, só que eu não aprendi primafaces e nem hibernate, ainda vou ver eles. Mas qualquer coisa tenta achar uma maneira melhor mano, só cuidado para o código não virar uma enorme gambiarra kkkk

Valeu pela ajuda

#partiugambiarra #pog -programação orientada a gambiarra

rsrsrs

1 curtida

kkkkkkkkkkkkkk arrochaaaa