[RESOLVIDO]Multiplicação de Valores Unitários e Soma de Valores

Boa tarde pessoal

Tenho esta tela de vendas com o campo Produto, Quantidade, Valor Unitário e Valor Total do Item e na parte inferior Valor Total Compra

na imagem acima, tudo está correto, mas vejam esta próxima imagem:

vejam o campo Valor Total Compra em vez de R$ 2.000,00 está R$ 3.000,00

e agora vejam o que ocorre quando volto para 1 em quantidade:

o valor total da compra salta para 4.000,00

o que fiz de errado neste código para gerar este resultado?

Código:

    txtQuantidade.addValueChangeListener(event -> { //dispara o evento ao mudar a quantidade

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
			double valorTotal = 0; //formata o numero para moeda local

			try {
				valorTotal = formatter.parse(txtValorUnitario.getValue()).doubleValue() * txtQuantidade.getValue(); //faz a multiplicação de unitarios e quantidade
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			txtValorTotalItem.setValue(formatter.format(valorTotal)); //seta o valor de quantidade x unitario no campo Valor total Item

			somaValores += valorTotal;
			campoSomaValores.setValue(formatter.format(somaValores)); //campo valor total da compra

		});

Parece que você só soma.
Não importa se aumentou, zerou, diminuiu a quantidade; a cada ação vc soma o valor.

De alguma forma vc poderia pegar o valor total de cada item e somá-los a cada alteração na quantidade.

@RoinujNosde…sim, eu havia pensado em algo parecido, vou ver se consigo codificar…muito obg!!

galera tentei de tudo aqui, nada deu certo…alguém tem mais dicas para dar?

Quando você criar um novo objeto pra valor total de item, coloque esse objeto numa lista.
Se remover um produto da lista, remova esse objeto da lista.

No evento de quantidade alterada, itere pela lista e vá somando os valores. Aí sete no valor total.

@RoinujNosde

+/- assim:

    private void adicionaProduto() {

		ComboBox<Produto> txtProdutos = new ComboBox<>();

		NumberField txtQuantidade = new NumberField("Quantidade");

		TextField txtValorUnitario = new TextField("Valor Unitário");

		TextField txtValorTotalItem = new TextField("Valor Total Item");

		txtProdutos.setWidth("370px");
		txtProdutos.setLabel("Produtos");
		List<Produto> listaDeProdutos = produtoRepository.findAll();
		txtProdutos.setItemLabelGenerator(Produto::getNome);
		txtProdutos.setItems(listaDeProdutos);
		txtProdutos.addValueChangeListener(event -> {

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
			try {

				txtValorUnitario.setValue(formatter.format(event.getValue().getValor()));

			} catch (Exception e) {
				e.printStackTrace();
			}

		});

//==========================================================================================================================
		
		txtQuantidade.setHasControls(true);
		txtQuantidade.setValue(null);
		txtQuantidade.setMin(1);
		
		
		txtQuantidade.addValueChangeListener(event -> {

			NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
			double valorTotal = 0;

			try {
				valorTotal = formatter.parse(txtValorUnitario.getValue()).doubleValue() * txtQuantidade.getValue();
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			txtValorTotalItem.setValue(formatter.format(valorTotal));

			somaValores += valorTotal;
			campoSomaValores.setValue(formatter.format(somaValores));

		});
		
		HorizontalLayout linhaNova = new HorizontalLayout();
		linhaNova.add(txtProdutos, txtQuantidade, txtValorUnitario, txtValorTotalItem);

		venderDiv.add(linhaNova);

	}

Você tem um método removeProduto()?

@RoinujNosde…bom dia, tenho sim…segue:

	private void excluirClick() {

		if (venda != null) {
			listaVendas.remove(venda);
			vendaService.delete(venda);
			atualizaGrdVenda();
		}
	}

Esse seria para excluir a venda, não?
Não tem um para remover produto?

@RoinujNosde, não…para remover o produto não

Coloque seus txtValorTotalItem numa lista e a cada vez que uma quantidade for alterada, itere por essa lista somando os valores e definindo o resultado no total geral da compra.

@RoinujNosde

então, primeiro passo seria criar isso, dentro do metodo adicionaProduto:

List listaValores;

certo?

A criação da lista tem que ser fora do adicionaProduto.
Só o método add que fica dentro.

@RoinujNosde

certo entendi…o parametro que passo para esta lista

List String
List Venda
List Produto

qual parametro?

O tipo disso aqui

@RoinujNosde

Muito obrigado por sua ajuda, mas realmente eu não sei como implementar sua ideia(eu entendo ela, mas não consigo aplica-la). Você foi o cara que mais me ensinou aqui no GUJ, sou grato a vc, mas sei que já deve estar cansado…kkk…e eu ainda tenho muito o que aprender…obg por toda ajuda

1 curtida

Qual parte exatamente vc tá com dúvida?

@RoinujNosde

em tudo na vdd

É como te falei, entendo o que vc quer dizer, mas não consigo colocar em pratica, fico em duvida por exemplo, onde criar a lista? Como sou novo em programação e em Vaadin, tudo o que eu aprendo é observando os códigos, então por exemplo eu vejo lá system.out.print, se for a primeira vez que vejo isso, ai fico boiando no que este código significa e faz…ai depois alguém me explica, que esse código é para mostrar o resultado no console, então aprendo que sempre que precisar mostrar algo no console, basta chamar sysout.

Neste caso em particular, como eu nunca fiz uma operação matematica desta natureza, estou perdido…

é diferente de vc fazer

double valor1 = 10;
double valor2 = 10;
double soma = valor1 + valor2

pra mim é muito mais complexo

aqui vc pediu para criar uma lista do mesmo tipo que que txtValorTotalItem(TextField)

Logo seria uma lista igual essa:

private List < String > valores;

correto?

caso aqui esteja certo, então criei a lista aqui:

no começo de tudo, fora de qualquer metodo

Linha 110