Veja o que acontece
Uai, mas a venda não possui apenas um produto vendido. Uma venda pode ter mais de um produto vendido, certo?
Na classe venda, se vc tiver alguma propriedade ProdutoVendido
, remova ele, e deixe apenas a lista List<ProdutoVendido> produtosVendidos
.
Sim uma venda pode ter vários produtos vendidos
package br.com.fjsistemas.backend;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
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;
//@ManyToOne
//private ProdutoVendido produtoVendido; REMOVIDO
@OneToMany(cascade = CascadeType.PERSIST)
private List<ProdutoVendido> produtos = new ArrayList<>();
public void addProduto(Produto produto) {
ProdutoVendido produtoVenda = new ProdutoVendido();
produtos.add(produtoVenda);
}
private String valorTotalVenda;
}
Agora está certo a classe Venda?
public void addProduto(Produto produto) {
ProdutoVendido produtoVenda = new ProdutoVendido();
produtos.add(produtoVenda);
}
Essa parte ainda está errada. Você esta ignorando o parâmetro produto.
O objetivo do método addProduto, é vincular o produto à venda. E isso é feito pela classe ProdutoVendido. Ou seja, vc deve criar um produto vendido a partir do cliente e a venda, e depois adicionar na lista. Assim:
public void addProduto(Produto produto) {
ProdutoVendido produtoVenda = new ProdutoVendido(this, produto); // repare que aqui é chamado um construtor que recebe a venda e o produto
produtos.add(produtoVenda);
}
E na classe ProdutoVendido
public class ProdutoVendido {
private Venda venda;
private Produto produto;
// Aqui é o construtor que irá criar o produto vendido a partir da venda e do produto
// essa classe é responsável por vincular o produto à venda
public ProdutoVendido(Venda venda, Produto produto) {
this.venda = venda;
this.produto = produto;
}
// getters and setters
}
obs: Na classe ProdutoVendido não coloquei as anotações do mapeamento, mas vc deve colocar para ficar correto.
Correto agora?
Classe Venda:
package br.com.fjsistemas.backend;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
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;
/*
* @ManyToOne private ProdutoVendido produtoVendido; //REMOVIDO
*/
@OneToMany(cascade = CascadeType.PERSIST)
private List<ProdutoVendido> produtos = new ArrayList<>();
public void addProduto(Produto produto) {
ProdutoVendido produtoVenda = new ProdutoVendido(this, produto);
produtos.add(produtoVenda);
}
private String valorTotalVenda;
}
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) {
this.venda = venda;
this.produto = produto;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
private Venda venda;
@ManyToOne
private Produto produto;
}
Deixei assim as classes:
Classe Venda:
package br.com.fjsistemas.backend;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@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(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<ProdutoVendido> produtos = new ArrayList<>();
public void addProduto(Produto produto) {
ProdutoVendido produtoVenda = new ProdutoVendido(this, produto);
produtos.add(produtoVenda);
}
private String valorTotalVenda;
}
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.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@Data
@Entity
public class ProdutoVendido {
public ProdutoVendido(Venda venda, Produto produto) {
this.venda = venda;
this.produto = produto;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
private Venda venda;
@ManyToOne
private Produto produto;
}
Classe VendaView(apenas o metodo adicionaProduto, metodo Alterar e montarListaProdutos)
private void alterarClick() {
if (venda != null) {
binderVenda.setBean(venda);
montarListaProdutos(venda.getProdutos());
dlgJanela.open();
}
}
private void montarListaProdutos(List<ProdutoVendido> produtos) {
for (ProdutoVendido pv : produtos) {
Produto produto = pv.getProduto();
venda.addProduto(produto);
}
}
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));
double soma = 0;
for (TextField tf : valores) {
try {
soma += formatter.parse(tf.getValue()).doubleValue();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
campoSomaValores.setValue(formatter.format(soma));
});
feito desta forma, fui tentar rodar a aplicação para ver se dava certo, mas da este stack
java.util.ConcurrentModificationException: null
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1009) ~[na:na]
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:963) ~[na:na]
at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:883) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at br.com.fjsistemas.compraVendaView.VendaView.montarListaProdutos(VendaView.java:412) ~[classes/:na]
at br.com.fjsistemas.compraVendaView.VendaView.alterarClick(VendaView.java:405) ~[classes/:na]
at br.com.fjsistemas.compraVendaView.VendaView.lambda$1(VendaView.java:160) ~[classes/:na]
at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:205) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.component.ComponentEventBus.handleDomEvent(ComponentEventBus.java:373) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.component.ComponentEventBus.lambda$addDomTrigger$dd1b7957$1(ComponentEventBus.java:264) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.internal.nodefeature.ElementListenerMap.lambda$fireEvent$2(ElementListenerMap.java:441) ~[flow-server-2.4.6.jar:2.4.6]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507) ~[na:na]
at com.vaadin.flow.internal.nodefeature.ElementListenerMap.fireEvent(ElementListenerMap.java:441) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.communication.rpc.EventRpcHandler.handleNode(EventRpcHandler.java:59) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:64) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:409) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$1(ServerRpcHandler.java:390) ~[flow-server-2.4.6.jar:2.4.6]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1507) ~[na:na]
at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:390) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:317) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:89) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1547) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:247) ~[flow-server-2.4.6.jar:2.4.6]
at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:111) ~[vaadin-spring-12.3.2.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:352) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:141) ~[spring-webmvc-5.3.3.jar:5.3.3]
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) ~[spring-webmvc-5.3.3.jar:5.3.3]
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) ~[spring-webmvc-5.3.3.jar:5.3.3]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.3.jar:5.3.3]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.3.jar:5.3.3]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.3.jar:5.3.3]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.3.jar:5.3.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.41.jar:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.3.jar:5.3.3]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.3.jar:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.3.jar:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.3.jar:5.3.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.3.jar:5.3.3]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at java.base/java.lang.Thread.run(Thread.java:830) ~[na:na]
Essa parte está errada ainda:
private void montarListaProdutos(List<ProdutoVendido> produtos) {
for (ProdutoVendido pv : produtos) {
Produto produto = pv.getProduto();
venda.addProduto(produto);
}
}
Vc está recebendo a lista de produtos da venda e adicionando na venda novamente.
Nessa parte vc deveria montar a view dos produtos vinculados à venda. Que imagino que seja aqui:
txtProdutos.setItems(produtos);
Se vc estiver usando java versão 8 ou superior, tu pode fazer o método para ficar assim:
private void montarListaProdutos(List<ProdutoVendido> produtosVendidos) {
List<Produto> produtos = produtosVendidos.stream()
.map(pv -> pv.getProduto())
.collect(Collectors.toList());
txtProdutos.setItems(produtos);
}
Acontece que essa variavel txtProdutos, é uma variavel declarada dentro do metodo adicionaProduto(linha 422)
tentei declarar ela fora, la no começo do código, porém ao declarar ela fora, não consigo adicionar 2 ou mais produtos na venda…consigo add apenas 1 produto por venda
Ah, essa txtProduto é a combobox, entendi. Vacilo meu.
Qual o elemento que apresenta os produtos da venda? É uma tabela?
os produtos para venda são listados nesta comboBox, nesta combo estão todos os produtos disponíveis para venda
O que tava querendo dizer é algo assim:
private void montarListaProdutos(List<ProdutoVendido> produtosVendidos) {
HorizontalLayout adicionarProdutos = new HorizontalLayout();
for (ProdutoVendido pv : produtosVendidos) {
Produto p = pv.getProduto();
adicionarProdutos.add(p.getDescricao(), pv.getQuantidade(), p.getValorUnitario(), p.getValorTotalItem());
}
centro.add(adicionarProdutos);
}
A partir dos produtos vendidos vinculados à venda, vc vai motar o layout que irá apresentar os dados desses produtos.
obs.: Tem que corrigir os parâmetros do método add
obs2: E esse nome adicionarProdutos não seria menos confuso se fosse layoutProdutosVenda (ou algo semelhante)?
Ah sim. Esses códigos usando os elementos do Vaadin que to colocando, é mais como forma de passar a ideia do que fazer, mas eu não sei como fazer pois nunca usei esse Vaadin, blz.
Com isso, para pegar cada produto e colocar na tela usando os componentes do Vaadin, tu tem que usar o elemento de acordo com o que tu jah conhece desse framework.
blz, vou ver se consigo deixar td certinho…muito obg por tudo!!! Foi de grande ajuda!!!
acho que estou chegando perto, veja o que acontece aqui:
Classe Venda:
package br.com.fjsistemas.backend;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@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(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private List<ProdutoVendido> produtos = new ArrayList<>();
public void addProduto(Produto produto) {
ProdutoVendido produtoVenda = new ProdutoVendido(id, this, produto, 0, null, null);
produtos.add(produtoVenda);
}
private String valorTotalVenda;
}
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.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Getter
@Setter
@Entity
public class ProdutoVendido {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
private Venda venda;
@ManyToOne
private Produto produto;
private int quantidade;
private Double valorUnitario;
private Double valorTotalItem;
}
Classe VendaView(apenas metodo montarLista):
private void montarListaProdutos(List<ProdutoVendido> produtosVendidos) {
HorizontalLayout adicionarProdutos = new HorizontalLayout();
for (ProdutoVendido pv : produtosVendidos) {
Produto p = pv.getProduto();
adicionarProdutos.add(pv.getProduto(), pv.getQuantidade(), pv.getValorUnitario(), pv.getValorTotalItem());
}
centro.add(adicionarProdutos);
}
Imagem do metodo montarListaProdutos:
Como resolver este erro:?
Está no caminho. Esse método add, imagino que seja para adicionar algum elemento de tela, como um textfield, por exemplo.
Se vc for adicionar a descrição do produto, imagino que vc tenha que adicionar um textfield com a descricao do produto como valor.
No seu caso, vc terá que criar elementos de tela para dada informação que deverá aparecer nesse HorizontalLayout.
Isso, o metodo add, irá adicionar as informações (nome do produto, quantidade vendida, valor unitário e valor total do item) dentro de uma Div(centro), que será exibida quando o usuario quiser visualizar ou alterar uma venda.
Se eu entendi corretamente, o certo agora é um declarar um TextField lá no começo do código e depois setar o valor nesta nova textfield…é isso?
tu não pode declarar no comeco do codigo, pq podem ser vários produtos. Se tu usar o mesmo textfield qdo for mais de um produto, o valor de um produto pode sobrescrever o outro.
Pensa assim: Se tu for apresentar 2 produtos nesse HorizontalLayout, onde para cada produto, serão apresentados 4 dados, vc terá 8 elementos na tela para isso.
Essas informações da tela serão apenas para apresentar os dados, ou o usuário poderá editar também?
Bão, fica mais fácil. Basta ir adicionando os textfields dentro do loop mesmo.
Algo mais ou menos assim:
for (ProdutoVendido pv : produtosVendidos) {
layoutProdutos.add(new Textfield(pv.getProduto().getDescricao());
}
obs.: Nao sei como se cria textfield no vaadin