Criando relatórios para o meu sistema me deparei com o seguinte problema :
Como agrupar no Ireport usando objetos?
- Primeiramente na aba REPORT INSPECTOR, clique com o botão direito no icone que representa o relatório, no caso ele apresenta-se com o nome do relatório.
- Add Report Group (Adicionar Grupo no Relatório)
- Group Name (Nome do grupo)
- Selecione: Group by the following report object (Agrupar por algum campo do relatório) ou Group by the following expression (Agrupar por expressão).
- Pronto o agrupamento no iReport está pronto.
- O Próximo passo é na query da sua consulta que trará o objeto ela tera que ter um ORDER BY (Organizar Por) para agrupar de forma correta os registros.
Ex: Select pessoa from Pessoa pessoa order by pessoa.tipoPessoa
Caraca, sua dica foi fantástica. O ‘ORDER BY’ era o que faltava para o relatório ficar perfeito. Fez toda diferença no agrupamento.
Então.. precisando estamos aqui. obrigado
Yo también tenía problemas con el agrupamiento, no lo estaba haciendo correctamente y era por el ORDER BY!
Que bom…
Ótimo, quebrou uma árvore
Precisando, Estamos aqui!
A dica do ORDER BY Salvou minha vida!! Vlw!!
Por nada, precisando! Só falar.
Cara tô apanhando, sou novo em relatórios, estou utilizando o JasperReport e ele não possui essas opções que você passou passou dá pra me ajudar?
Olha minha consulta:
SELECT
o.nome AS “Organizacao”,
ROUND(AVG(u_r.resposta_avaliado_id), 0) AS “Avaliado”,
ROUND(AVG(u_r.resposta_avaliador_id), 0) AS “Avaliador”,
gr.nome AS “Grupo”
FROM usuario_respostas u_r
INNER JOIN usuario_avaliacoes u_av ON u_av.id = u_r.usuario_avaliacao_id
INNER JOIN usuarios u ON u.id = u_av.avaliado_id
INNER JOIN cargos c ON c.id = u.cargo_id
INNER JOIN classes cl ON cl.id = u.classe_id
INNER JOIN organizacoes o ON o.id = u.organizacao_id
INNER JOIN perguntas p ON p.id = u_r.pergunta_id
INNER JOIN grupos gr ON gr.id = p.grupo_id
WHERE o.id::TEXT LIKE $P{Organizacao_id} AND c.id::TEXT LIKE $P{Cargo_id} AND cl.id::TEXT LIKE $P{Classe_id}
–AND u_r.resposta_avaliado_id 0
–AND u_r.resposta_avaliador_id 0
GROUP BY o.id, gr.nome, gr.id
ORDER BY o.id ASC
No Postgres funciona e no Jasper também, só traz bem mais registros que na execução da query, creio que deva ser devido ao uso de grupos.
Qual a versão do jasperreport que vce está utilizando? O que ocorre no jasper quando voce passa esta query para ele?
Versão 5.6.1 na hora de trazer os dados(data preview) ele traz certinho, só as as organizações que possuem usuários com avaliações respondidas, e traz a média geral delas(organizações), são 50 linhas o que daria .
Mas na hora de exibir ele tá trazendo bem mais do que deveria.
Dataset1
SELECT
o.nome AS “Organizacao”,
u.nome AS “Avaliado”,
c.nome AS “Cargo”,
cl.nome AS “Classe”,
(SELECT u.nome FROM usuarios u WHERE u.id=8) AS “Usuario_nome”
FROM organizacoes o
INNER JOIN usuarios u ON u.organizacao_id = o.id
INNER JOIN usuario_avaliacoes u_a ON u_a.avaliado_id = u.id
INNER JOIN cargos c ON c.id = u.cargo_id
INNER JOIN classes cl ON cl.id = u.classe_id
WHERE o.id::text LIKE $P{Organizacao_id} AND c.id::text LIKE $P{Cargo_id} AND cl.id::text LIKE $P{Classe_id}
Dataset2
SELECT
o.nome AS “Organizacao”,
ROUND(AVG(u_r.resposta_avaliado_id), 0) AS “Avaliado”,
ROUND(AVG(u_r.resposta_avaliador_id), 0) AS “Avaliador”,
gr.nome AS “Grupo”
FROM usuario_respostas u_r
INNER JOIN usuario_avaliacoes u_av ON u_av.id = u_r.usuario_avaliacao_id
INNER JOIN usuarios u ON u.id = u_av.avaliado_id
INNER JOIN cargos c ON c.id = u.cargo_id
INNER JOIN classes cl ON cl.id = u.classe_id
INNER JOIN organizacoes o ON o.id = u.organizacao_id
INNER JOIN perguntas p ON p.id = u_r.pergunta_id
INNER JOIN grupos gr ON gr.id = p.grupo_id
WHERE o.id::text LIKE $P{Organizacao_id} AND c.id::text LIKE $P{Cargo_id} AND cl.id::text LIKE $P{Classe_id}
–AND u_r.resposta_avaliado_id 0
–AND u_r.resposta_avaliador_id 0
GROUP BY o.nome, gr.id
ORDER BY o.nome ASC
Bom pelo que vi voce está trabalhando com sql nativa.
Voce já tentou usar um distinct ? Ou group by? A query está sendo executada dentro do ireport?
Como voce está chamando este ireport? Voce utiliza hibernate no seu projeto?
Estou executando apenas dentro do JasperReport e utilizando group by, distinct não.
SELECT
o.nome AS “Organizacao”,
u.nome AS “Nome”,
ROUND(AVG(u_r.resposta_avaliado_id), 0) AS “Avaliado”,
ROUND(AVG(u_r.resposta_avaliador_id), 0) AS “Avaliador”,
c.nome AS “Cargo”,
cl.nome AS “Classe”,
gr.nome AS “Grupo”
FROM usuario_respostas u_r
INNER JOIN usuario_avaliacoes u_av ON u_av.id = u_r.usuario_avaliacao_id
INNER JOIN usuarios u ON u.id = u_av.avaliado_id
INNER JOIN cargos c ON c.id = u.cargo_id
INNER JOIN classes cl ON cl.id = u.classe_id
INNER JOIN organizacoes o ON o.id = u.organizacao_id
INNER JOIN perguntas p ON p.id = u_r.pergunta_id
INNER JOIN grupos gr ON gr.id = p.grupo_id
WHERE o.id::text LIKE $P{Organizacao_id} AND c.id::text LIKE $P{Cargo_id} AND cl.id::text LIKE $P{Classe_id}
–AND u_r.resposta_avaliado_id 0
AND u_r.resposta_avaliador_id 0
GROUP BY o.nome, gr.id, c.nome, cl.nome, u.nome
ORDER BY o.nome, c.nome, cl.nome ASC
Minha query atual
Ele está repetindo os dados, ou seja, deveria trazer apenas 7 páginas e traz outras repetindo os valores, uma 7 vezes.
Pode ser que tenha algum relacionamento errado neste sql, única explicação para tal.
Já tentou trabalhar com objetos no Ireport? Por que desta forma você consegue tratar toda a complexidade do seu relatório via java, ou seja você não precisa se preocupar como o Ireport trabalha, apenas passa uma coleção de dados para ele e ele se encarrega de mostrar os dados.
Segue um link para te auxiliar caso queira trabalhar com objetos no Ireport, este post apenas ensina de forma básica.
https://viniciussousa88.wordpress.com/2014/11/08/configurar-ireport-para-trabalhar-com-objetos-das-classes-java/
Qualquer dúvida estou a disposição!
Otima sua dica, só que alem de ordenar meu relatorio em grupo, eu preciso filtrar os dados:
ex: è um relatorio de produção, vou agrupar por codigo (funcionario) e filtrar por data. como faço isso?
quantas peças cada funcionario fez, em determinado mês(este mês quero a produção diaria).
Cida,
Para da maneira que a Sra. me expos, entendi que:
Voce quer realizar 2 agrupamentos, um por funcionário e outro por data certo?
Se sim, voce pode criar 2 grupos no iReport sendo o primeiro o funcionário e o segundo a data, daí você pode realizar os sumários nos rodapés de cada grupo, daí voce terá a produção diária de cada funcionário com a quantidade.
Obrigada pela resposta, já fiz, não deu certo, o oque eu quero mesmo é selecionar selecionar a produção(esta produção é lancada diariamente) dentro de um periodo(ex: mes de outubro) só que eu preciso que seja agrupado por funcionario. no rodape terá a soma de toda a produção do periodo para cada funcionario, eu agrupei por cod, e filtrei por data, no relatorio eles sai agrupados, mas na mesma pagina, e a soma não está vindo por grupo. Só funciona a soma por grupo se eu tirar o filtro da data. eu estou usando o Ireport 4.0.2
Cida,
Então é da maneira que falei mesmo, o agrupamento para totalizar por data da maneira como voce deseja, deve-se criar as sumarização por grupo ou seja, voce vai criar os valores totais por grupo da data, na seção FOOTER do grupo da data que irá conter estes campos, daí o ireport irá conseguir totalizar por data, e o primeiro grupo continuará sendo o grupo do funcionário, e neste não precisa colocar os totais.