Ultimo problema para finalizar meu primeiro Sistema

@RoinujNosde

o que eu não entendo é

adicionarProdutos = new HorizontalLayout();
		adicionarProdutos.add(txtProdutos, txtQuantidade, txtValorUnitario, txtValorTotalItem);
		
		//venda.addProduto();

as variaveis txtProdutos, txtQuantidade, txtValorUnitario, txtValorTotalitem…elas são as responsaveis por definir o produto a ser vendido, a quantidade, o valor unitario do produto definido e o valor total da venda respctivamente.

Então como faço para passar essas variaveis, que estão armazenando os valores, produtos e quantidade para o metodo addProduto() da classe Venda? Não entendo quando vc me fala pra passar 1 argumento de produto vendido…

Na classe ProdutoVendido

package br.com.fjsistemas.backend;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class ProdutoVendido {
	
	

	public ProdutoVendido(Venda venda, Produto produto) {
		super();
		this.venda = venda;
		this.produto = produto;
	}
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	@ManyToOne
	private Venda venda;
	
	@ManyToOne
	private Produto produto;

}

Na Classe Venda:

package br.com.fjsistemas.backend;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Venda {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	private LocalDate dataVenda = LocalDate.now();

	@ManyToOne
	private Cliente cliente;

	@ManyToOne
	private FormaDePagamento formaDePagamento;

	@OneToMany
	private List<ProdutoVendido> produtos = new ArrayList<>();

	public void addProduto() {
		ProdutoVendido produtoVenda = new ProdutoVendido();
		produtos.add(produtoVenda);
	}

	private String valorTotalVenda;

}

Vc tem razão, mas há umas coisas estranhas:

  • O produto está definido como um txtProdutos. Nesse caso, o produto deveria ser o ID que referencia o produto no banco, ou a propria entidade Produto carregada do banco.
1 curtida

@Lucas_Camara

Eu sei que vc não gosta que poste imagens, mas não tem outra forma para te mostrar…rs

Veja meu banco

Produto:

Cliente:

FormaDePagamento:

Venda:

Tranquilo man. Digo mais quando é código. E não é soh por mim (de forma geral, o pessoal acha melhor o texto também). Para ler o código, e até mesmo testar qdo é possível, as imagens não ajudam muito.

1 curtida

@Lucas_Camara e @RoinujNosde

Como vcs me orientam para resolver este problema?

Nessa parte:

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

Qual o valor que vem na variável txtProdutos?

1 curtida

@Lucas_Camara

Nesta variavel, vem o nome/descrição do produto

veja se fica mais claro

tela de vendas, vou fazer uma venda do ZERO

Abro a tela, clico em preencho cliente e forma de pagamento agora vou add produtos para serem vendidos, clico em “+ item”

ao clicar em “+item”, aparece 4 campos Produtos(txtProdutos), Quantidade(txtQuantidade), Valor Unitario(txtValorUnitario) e Valor Total Item(txtValorTotalItem)…preencho o produto:

ao selecionar o produto, ja recebo seu valor unitario

defino a quantidade e ja recebo o valor total daquele item:

se houver mais de um item na venda, basta repetir todo o processo:

ao lado dos botoes tenho um campo que recebe a soma de todos os itens

Vc deveria está sempre com, ou o ID do produto ou com o instancia de objeto referente ao produto, qdo for adicionar. Pois o que a base de dados precisa para vincular o produto à venda é do produto propriamente dito, e vc consegue o produto é pelo ID dele.

No nomento em que o produto é adicionado, tu seleciona ele numa combobox. Essa combobox deveria te fornecer, no mínimo, o ID do produto selecionado.

Com isso, vc conseguiria recuperar o produto do banco e adicionar na lista de produtos da venda.

1 curtida

Nota: aqui não é onde ele tem o erro, isso é código de view.

Ele tá com erro na classe Venda. (Entidade)
Quer adicionar produtos nela.

1 curtida

@RoinujNosde

exato

@Lucas_Camara, entendi…mas como resolver o problema?
o que devo fazer?

@Lucas_Camara

aquele comboBox busca o produto nesta tabela…veja que o produto tem o ID gerado…

Sim, pq na view ele não tem os valores no formato que a venda espera. Ele está passando tudo como string basicamente. E o txtProdutos é somente a descrição do, o que soh serve para mostrar na tela.

1 curtida

@RoinujNosde e @Lucas_Camara

tentei isso tbm na classe VendaView, dentro do metodo adicionaProduto()

venda.addProduto(txtProdutos.getValue().getId());

mas da erro:

The method addProduto() in the type Venda is not applicable for the arguments (Long)

Ele tem um ComboBox<Produto>, chamando o getValue() nele retorna um objeto Produto. Daí deve conseguir pegar id, etc.

1 curtida

Vc teria que fazer algo assim:

Long idProduto = txtProdutos.getValue().getId()
Produto produto = produtoRepository.findById(idProduto);
venda.addProduto(produto);
1 curtida

@Lucas_Camara

isso na classe Venda? Devo fazer isso

Long idProduto = txtProdutos.getValue().getId()
Produto produto = produtoRepository.findById(idProduto);
venda.addProduto(produto);

substituir isso:

    public void addProduto() {
		ProdutoVendido produtoVenda = new ProdutoVendido();
		produtos.add(produtoVenda);
	}

Correto?

Isso na tela msm, qdo o produto fosse adicionado. O melhor, é a venda não conhecer nenhum elemento de tela.

1 curtida

@Lucas_Camara

então isso:

Long idProduto = txtProdutos.getValue().getId()
Produto produto = produtoRepository.findById(idProduto);
venda.addProduto(produto);

na VendaView(que é a tela de vendas)

1 curtida

@Lucas_Camara

tentei o código que vc passou, mas da um erro

este trecho do código está sublinhado em vermelho:

produtoRepository.findById(idProduto);

com essa msg:

Type mismatch: cannot convert from Optional to Produto

change type of ‘produto’ to ‘Optional’