(Resolvido)Duplo click acessando dados não correspondentes

31 respostas Resolvido
vaadinjavaprogramação
R

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á!!

31 Respostas

Lucas_Camara

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.

R

@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

Lucas_Camara

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.

R

@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
RoinujNosde

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(); 
    }
}
Lucas_Camara

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?

R

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

R

@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

Lucas_Camara

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?

R

@Lucas_Camara

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

RoinujNosde

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

R

@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?

Lucas_Camara

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
RoinujNosde

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

R

@Lucas_Camara e @RoinujNosde





RoinujNosde

Você apagou a variável? :thinking:

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

R

@RoinujNosde

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

listaVendidosModal = venda.getProdutos();

RoinujNosde

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

Lucas_Camara

@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

R

@Lucas_Camara

Bom dia, li toda a documentação, tentei quase tudo que estava la, embora só tenha feito(na documentação) apenas um referencia para getItem()

grid.setSelectionMode(SelectionMode.MULTI);
grid.addItemDoubleClickListener(event ->
        copy(grid.getSelectedItems()));

tentei utilizar ele aqui…mas não deu certo, não da erro nenhum, mas ou não busca nenhum produto, ou busca todos os produtos, (se deixarlistaVendidosModal = venda.getProdutos();) NÃO BUSCA NENHUM ou se deixar assim: (listaVendidosModal = produtoVendidoService.read();)BUSCA TODOS

Lucas_Camara

Vamos por partes. Qual o valor que é retornado de event.getItem() no evento de duplo clique?

R

@Lucas_Camara

Lucas_Camara

Ótimo! O event.getItem() está retornando uma Venda (mas isso já era o esperado como dito pelo @RoinujNosde).

Essa venda está com os dados preenchidos? Veja se a lista de produtos está preenchida e, mais importante, se está com o ID preenchido também.

Faça assim:

venda = event.getItem();
R

onde vc quer que eu faça isso?

Lucas_Camara

Dentro do evento de duplo clique:

grdVenda.addItemDoubleClickListener(event -> { 
	venda = event.getItem();
	binderVenda.readBean(venda); 
	dlgJanela.open(); 
});

Mas veja se as propriedades da venda retornada pelo event.getItem() estão preenchidos (especialmente o ID e a lista de produtos).

R

pelo que vi, tudo está preenchido correntamente, então coloquei este código que vc passou:

grdVenda.addItemDoubleClickListener(event -> { 
	venda = event.getItem();
	binderVenda.readBean(venda); 
	dlgJanela.open(); 
});

mas não retorna nenhum produto…não da erro nenhum

Lucas_Camara

Ah sim, para preencher a tabela de produtos, vc deve pegar esses produtos da classe venda.


Vi aqui que vc está usando o método populaGridVendidosModal para popular a grid de produtos vendidos:

private void populaGridVendidosModal() {
	listaVendidosModal = produtoVendidoService.read();
	atualizaGridModal();
}

Vc deve mudá-lo para ficar assim:

private void populaGridVendidosModal() {
	listaVendidosModal = venda.getProdutos();
	atualizaGridModal();
}
R

aqui eu ja havia mudado, acho que não fiz o push para git

R
grdVenda.addItemDoubleClickListener(event -> { 
		venda = event.getItem();
		binderVenda.readBean((Venda) venda.getProdutos()); 
		dlgJanela.open(); 
	});

Tentei assim, mas não da certo, da um stack

Lucas_Camara
Solucao aceita

Vc nao pode fazer esse cast, pois uma lista de produtos não é uma venda. O certo é da forma como passei mesmo.

E vendo aqui, acho que está faltando apenas vc chamar o método que popula a grid de produtos vendidos:

grdVenda.addItemDoubleClickListener(event -> { 
	venda = event.getItem();
	binderVenda.readBean(venda); 
	populaGridVendidosModal();
	dlgJanela.open(); 
});

E deixa o método populaGridVendidosModal assim mesmo:

private void populaGridVendidosModal() {
	listaVendidosModal = venda.getProdutos();
	atualizaGridModal();
}
R

Nossa cara, deu certo, mas a vontade que da é de xingar …algo tão simples(que eu não pensei nem por 1 segundo) e quando aprende, não da nem para acreditar…rs

Muito obg meu amigo, aprendendo muito com vc!!!

@RoinujNosde obg a vc tbm, sempre aprendendo contigo

Criado 27 de maio de 2021
Ultima resposta 28 de mai. de 2021
Respostas 31
Participantes 3