Onde está o erro?

Bom dia pessoal, estou montando um relatório com JasperStudio, e após finalizar ele me retorna “Document is Empty”…eu tenho 99,9% certeza que a query que passei deve ter algum erro, mas sinceramente não sei onde.

Query:

SELECT fjsistemas.venda.id,
	fjsistemas.venda.data_venda,
	fjsistemas.venda.valor_total_venda,
	fjsistemas.cliente.nome,
	fjsistemas.forma_de_pagamento.forma_de_pagamento,
	fjsistemas.produto_vendido.valor_total_do_item,
	fjsistemas.produto_vendido.quantidade,
	fjsistemas.produto_vendido.id,
	fjsistemas.produto.nome,
	fjsistemas.produto.valor
FROM fjsistemas.venda
	INNER JOIN fjsistemas.cliente ON 
	 fjsistemas.cliente.nome = fjsistemas.venda.cliente_id 
	INNER JOIN fjsistemas.forma_de_pagamento ON 
	 fjsistemas.forma_de_pagamento.forma_de_pagamento = fjsistemas.venda.forma_de_pagamento_id 
	INNER JOIN fjsistemas.produto_vendido ON 
	 fjsistemas.produto_vendido.venda_id = fjsistemas.venda.id 
	INNER JOIN fjsistemas.produto ON 
	 fjsistemas.produto.id = fjsistemas.produto_vendido.id

Diagrama:

O resultado que eu esperava com a query/diagrama acima, eu consigo obter fazendo desta forma:

Diagrama

Query:

SELECT fjsistemas.venda.id,
	fjsistemas.venda.data_venda,
	fjsistemas.venda.valor_total_venda,
	fjsistemas.cliente.nome,
	fjsistemas.forma_de_pagamento.forma_de_pagamento,
	fjsistemas.produto.nome,
	fjsistemas.produto.valor,
	fjsistemas.produto_vendido.quantidade,
	fjsistemas.produto_vendido.valor_total_do_item
FROM fjsistemas.cliente,
	fjsistemas.forma_de_pagamento,
	fjsistemas.produto,
	fjsistemas.produto_vendido,
	fjsistemas.venda

Resultado Obtido:

Obs: O problema aqui é que sem o INNER JOIN as vendas estão se repetindo no relatório, aqui deveriam aparecer apenas 3 vendas(IDs: 6 / 9 / 12)

Sua consulta está errada. Vc não está fazendo os devidos relacionamentos nas tabelas, com isso, o sql irá retornar todas as combinações possíveis dos registros.

Por exemplo, se vc quiser retornar todas as venda de um determinado cliente, vc teria que relacionar a tabela venda com a tabela cliente:

SELECT v.*
FROM fjsistemas.venda v
INNER JOIN fjsistemas.cliente c ON c.id = v.cliente_id
WHERE c.id = 123
1 curtida

@Lucas_Camara Bom mano, blz?

Então deixa eu tirar uma duvida contigo, no exemplo que vc passou, eu usaria caso fosse consultar um venda especifica, certo? No exemplo que vc passou, seria fazer uma consulta pelo ID.

Mas no momento eu ainda não estou querendo passar uma consulta especifica, quero apenas exibir todas as vendas com todos os produtos, todas quantidades e assim por diante.

Então agora estou neste ponto:

(vou usar Excel para demonstrar, acho que fica mais claro)

O que eu percebi é que, as vendas com os ids 6.9.12 cada uma delas tem 2 produtos, a venda id 15 tem apenas um produto

Eu gostaria que ficasse desta forma:

A minha duvida agora é…o erro está na query? Ou No momento em que criei o relatório eu deveria ter usado opção de agrupamento que o JasperStudio fornece para o usuario?

Minha query atual é esta:

SELECT fjsistemas.cliente.nome,
	fjsistemas.forma_de_pagamento.forma_de_pagamento,
	fjsistemas.produto.nome,
	fjsistemas.produto.valor,
	fjsistemas.produto_vendido.quantidade,
	fjsistemas.produto_vendido.valor_total_do_item,
	fjsistemas.produto_vendido.produto_id,
	fjsistemas.venda.id,
	fjsistemas.venda.data_venda,
	fjsistemas.venda.valor_total_venda
FROM fjsistemas.venda
	INNER JOIN fjsistemas.cliente ON 
	 fjsistemas.cliente.id = fjsistemas.venda.cliente_id 
	INNER JOIN fjsistemas.forma_de_pagamento ON 
	 fjsistemas.forma_de_pagamento.id = fjsistemas.venda.forma_de_pagamento_id 
	INNER JOIN fjsistemas.produto_vendido ON 
	 fjsistemas.produto_vendido.venda_id = fjsistemas.venda.id 
	INNER JOIN fjsistemas.produto ON 
	 fjsistemas.produto.id = fjsistemas.produto_vendido.produto_id

Se a consulta estiver retornando conforme o primeiro print (com as vendas 6, 9 e 12 repetindo 2 vezes pelo fato delas terem 2 produtos cada), a consulta está correta.

Ao executar uma consulta para recuperar os dados de uma venda e dos produtos dessa venda, e a venda tiver 5 produtos, por exemplo, a consulta irá retornar a venda repetida 5 vezes (para cada produto). Isso pq o SQL funciona dessa forma, as tabelas relacionadas terão os dados de cada relação diferente numa linha diferente.

Venda
-----
V1
V2
V3

Produto
-------
P1
P2
P3

VendaProduto (tabela que relaciona as vendas aos produtos vendidos)
------------
V1 - P1
V1 - P2
V2 - P2
V3 - P1
V3 - P2
V3 - P3

Ao consulta a venda V3 junto com todos seus produtos, o resultado será 3 linhas do banco:

V3 - P1
V3 - P2
V3 - P3

Se vc quiser agrupar assim:

   -> P1
V3 -> P2
   -> P3

vc terá que fazer esse controle na tela onde os dados serão apresentados (geralmente usando um rowspan numa tabela html, por exemplo) ou, no seu caso que é um relatório, usar algum recurso do JasperReports para isso (acredito que seja algo semelhante ao rowspan de uma tabela html.

1 curtida

blz mano, vou dar uma pesquisada…caso encontre alguma coisa, posto aqui…mas pelo menos ja sei que a consulta está certa…vlw por enquanto!!

@rafaspara2017 dei uma pesquisada aqui e vi que a galera costuma usar subrelatório no jasperreports para fazer esse esquema que vc está tentando fazer também. Já é uma parada mais avançada de fazer no jasper.

@Lucas_Camara, e ai mano, blz? Então tbm vi isso, e confesso que estou lendo sobre sub-relatórios, mas aqui no fórum encontrei uma solução “parcial”, veja como está o relatório:

para fazer desta forma, bastou clicar com o botão direito do mouse em cima da coluna que deseja alterar selecionar show properties e desmarcar a opção Print Repeated Values

Mas isso é parcial…realmente a melhor saída seria sub relatório, que eu estou estudando no momento

1 curtida

Massa mano! Essa solução ficou boa.

1 curtida