(Resolvido)Duplo click acessando dados não correspondentes

Bom dia pessoal, segue meu problema

Após realizar 5 vendas, elas são exibidas na grid:

agora eu quero visualizar os produto que foram vendidos em cada uma dessas vendas, para isto, criei um duplo click na grid, segue o código apenas do duplo click:

grdVenda.addItemDoubleClickListener(event -> {
			if (venda != null) {

				binderVenda.readBean(venda);
				dlgJanela.open();

			}

Então só para vcs estarem informados, segue a quantidade de itens de cada venda:

ID: 7 = 2 Produtos
ID:10 = 2 Produtos
ID:19 = 2 Produtos
ID: 22 = 1 Produto
ID: 24 = 1 Produto

Então quero visualizar o produtos do ID 7 por exemplo, quando clico 2x sobre esta venda, abre-se a janela com o conteúdo vendido, porém, vejam que ele busca todos os produtos de todas as vendas:

duplo click id7:

Aqui deveria aparecer apenas os produtos referentes ao id7, mas todos estão aparecendo, isso ocorre em todos os IDs.

Alguma idéia de onde está o erro?

Grato desde já!!

Esse evento está esquisito.

Quem está preenchendo a variável venda quando o evento do duplo clique é acionado? Ela devia está sendo recuperada (de alguma forma) do evento do duplo clique.

1 curtida

@Lucas_Camara

a variavel venda, ja deveria vir preenchida, no momento em que eu salvo a venda, a variavel venda é criada:

private void salvarClick() {

		venda = binderVenda.getBean();

		boolean adicionarLista = venda.getId() == null ? true : false;

		vendaService.create(venda);

		if (adicionarLista) {
			listaVendas.add(venda);

		}
		atualizaGrdVenda();
		novaVenda();
		txtNomeCliente.focus();

		binderVenda.setBean(venda);
		listaVendidosModal.clear();

		if (adicionarLista) {

			dlgJanela.close();
		}
	} 

no evento de duplo click, apenas deveria ler esta variável

Mas na lista de vendas, não tem pq a venda está preenchida, afinal, é soh a listagem das vendas. E ela deveria ser preenchida de acordo com o elemento que recebeu o duplo click.

1 curtida

@Lucas_Camara

então, estou trabalhando com 2 listas

private List<Venda> listaVendas; //recebe as vendas
private List<ProdutoVendido> listaVendidosModal = new ArrayList<>();//recebe os produtos

Tenta assim:

grdVenda.addItemDoubleClickListener(event -> { 
        //getItem retornaria o item clicado no Grid, como é Grid de Vendas, deve retornar uma Venda
        binderVenda.readBean(event.getItem()); 
        dlgJanela.open(); 
    }
}
2 curtidas

Essa lista tá ok.

Essa vc não precisaria ter, pois vc já tem uma lista de produtos vendidos dentro da venda.


Sobre o evento de duplo clique, como vc está identificando qual venda recebeu o duplo clique?

1 curtida

@RoinujNosde não deu certo este código que vc passou :frowning:

@Lucas_Camara

então creio que esse é problema, a falta de identificar qual venda deve ser exibida, então tentei fazer alguma modificações no code, tentei:

    grdVenda.addItemDoubleClickListener(event -> { 
		    if (venda != null) { 
		        binderVenda.readBean(venda.getId()); //aqui do readBean da erro de compilação
		        dlgJanela.open(); 
		    }
		}); 

tentei tbm:

    grdVenda.addItemDoubleClickListener(event -> { 
		    if (venda.getId() != null) { 
		        binderVenda.readBean(venda); 
		        dlgJanela.open(); 
		    }
		});

mas este tbm não deu certo, apesar de não apresentar nenhum erro

Vc deve recuperar a venda através do evento de duplo clique (como sugerido pelo @RoinujNosde). Porém, vc disse que não deu certo, mas não disse o pq não deu certo. Deu algum erro ou event.getItem() está retornando NULL?

1 curtida

@Lucas_Camara

não deu erro nenhum, nem compilação, nem de execução…simplesmente não funcionou…continuou buscando todos os produtos

Pode ser também que esteja recuperando TODOS os produtos do db, sem pegar diretamente do objeto Venda.

1 curtida

@RoinujNosde

não sei se estarei falando bobeira, me corrija se estiver errado, mas com este código passando o id, mesmo que buscando no banco, ele não deveria estar “filtrando” essa informação?

Lembrando que vc não precisar ter outra lista de produtos vendidos na sua view:

private List<ProdutoVendido> listaVendidosModal = new ArrayList<>();

Vc deve recuperar os produtos vendidos da Venda para montar a tela:

venda = // recupera a venda do banco
List<ProdutoVendido> produtosVendidos = venda.getProdutos();
// monta a tabela de produtos a partir da lista recuperada da venda
1 curtida

Complementando o que o @Lucas_Camara disse:
Na linha acima você está pegando todos os produtos do banco. Deveria pegar baseado na venda.

2 curtidas

@Lucas_Camara e @RoinujNosde





Você apagou a variável? :thinking:

Acho que mudando de produtosService.read() para venda.getProdutos() resolveria, com a venda do click event.

1 curtida

@RoinujNosde

fazendo esta alteração que vc sugeriu, agora ao clicar 2x NENHUM produto é exibido

listaVendidosModal = venda.getProdutos();

Esse “venda” tem que vir do evento.
event.getItem() seria sua Venda

1 curtida

@rafaspara2017 faça como o @RoinujNosde disse, que é o caminho certo.

Veja na documentação do vaadin o uso do event.getItem(): https://vaadin.com/docs/v14/flow/components/tutorial-flow-grid/#handling-item-click-events

2 curtidas