Como agrupar no Ireport (Add Report Group)

Criando relatórios para o meu sistema me deparei com o seguinte problema :

Como agrupar no Ireport usando objetos?

  1. 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.
  2. Add Report Group (Adicionar Grupo no Relatório)
  3. Group Name (Nome do grupo)
  4. Selecione: Group by the following report object (Agrupar por algum campo do relatório) ou Group by the following expression (Agrupar por expressão).
  5. Pronto o agrupamento no iReport está pronto.
  6. 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

19 comentários sobre “Como agrupar no Ireport (Add Report Group)

  1. 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.

  2. 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?

  3. 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.

  4. 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.

Deixe um comentário