(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

L

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

L

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
R

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

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

L

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

R

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?

L

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
R

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





R

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

R

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

L

@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

L

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

R

@Lucas_Camara

L

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

L

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

L

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

L
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