[Resolvido] Agrupar dados JasperReports

Sem%20t%C3%ADtulo

Jasper Reports

Galera, como eu agrupo os dois dados em um só?
Eu fiz um grupo para agrupar a finaldiade dos gastos, exemplo: Pessoal: airsoft…

meu sql ta assim: select from financas

Eu queria deixar o airsoft em um campo só, pq são gastos mensais, eu posso ir 300 vezes no airsoft, mas só mantem uma linha de airsoft, motivo disso: eu vou colocar os valores do lado, pra controlar os meus gastos

Deixa eu adivinhar, está fazendo o SQL direto pelo ireport?

Então, eu costumo fazer o SQL dentro pra fazer o teste…

Aí se dá tudo certo eu mando pro netbeans fazer o esquema

Bom, você vai precisar mais que uma simples query para resolver esse problema aí.
Ou, evitar este transtorno, jogando a responsabilidade de montar toda a estrutura pro java.

1 curtida

Então, o meu grande problema ta na query…

Eu consegui isso, mas ele joga os dois “Airsoft” pro pessoal

try {
    conecta.executaSQL ("SELECT DISTINCT observacao,valor,grupo FROM financas");
    JRResultSetDataSource relatResul = new JRResultSetDataSource(conecta.rs);
    JasperPrint jpPrint = JasperFillManager.fillReport("C:/Users/abner/JaspersoftWorkspace/MyReports/GastosFixos.jasper", new HashMap(), relatResul);
    JasperViewer jv = new JasperViewer(jpPrint,false);
    jv.setVisible(true);
    jv.toFront();
} catch (JRException e) {
    JOptionPane.showMessageDialog(rootPane, "Erro ao gerar arquivo"+e);
   }
    conecta.executaSQL ("select distinct observacao,valor,grupo from financas where grupo ilike '%"+campoobs1.getText()+"%' ");

Sinto que estou próximo…

Você vai precisar fazer um group by na query mesmo.
Mas, isso talvez não consiga trazer o que você realmente precisa.

1 curtida

Tu quer q o “Airsoft” apareça em uma linha só com os valores somados?

Tem um esquema pra fazer direto no Ireport… vou procurar aqui! Já usei 1x.

aqui, ve se te ajuda!

1 curtida

E aí cara, tudo bem? Eu cheguei a dar uma olhada nesse site antes… mas ele só mostra como fazer o grupo, igual o que eu fiz, que é:

Pessoal
Airsoft

Utilidades
Água e luz

só que no meu caso ta mostrando campos “duplicados”

Darlan, eu coloquei o group by, mas eu nao posso trabalhar com os valores… só vai se eu fizer:
select observacao from financas group by observacao

O que acontece é que você precisa de uma query mais estruturada, talvez uma procedure ou function.
Dependendo do teu nível de conhecimento de SQL, isso é uma dor de cabeça.
Se você já ouviu falar sobre MVC, deve entender que a ideia é manter cada responsabilidade com a camada específica, logo, mesmo para testes, não é interessante usar o SQL executado direto pelo relatório.
Qual a minha dica? Usar bean datasource e deixar a lógica toda no java, enviando, então, apenas os dados consolidados ao relatório, que só precisará identificar cada field e posicioná-lo.

1 curtida

Darlan, consegui… Eu fiz assim:

SELECT observacao, grupo, SUM(valor) AS valor
FROM financas
GROUP BY observacao, grupo
HAVING SUM(valor) > 0.1 //aqui ele faz a soma dos valores maiores que 0.1

Sem%20t%C3%ADtulo

Para dar um help pra a galera do futuro que for precisar dessa informação:

Minha tabela: Finanças
Minhas colunas selecionadas: Observação, Grupo, Mês e Ano.

Seguinte: eu fiz isso aqui no iReport (eu tentei fazer uma query normal “select * from tabela”), mas quando eu chamava pelo NetBeans, dava erro, ele queria procurar tudo da tabela.

Então fiz assim:

SELECT observacao, grupo, mes, ano, //Esses parâmetros são os que serão selecionados na tabela
SUM(valor) AS valor FROM financas // Aqui é a soma do meu valor, que "joga" os dados pro valor e depois chama a tabela
GROUP BY observacao, grupo, mes, ano // Aqui acontece o agrupamento
HAVING SUM(valor) > 0 // E aqui é mais pra quem precisa somar valores maiores que "200" por exemplo, é só definir o seu próprio valor onde está o '0'

Ok, com isso feito, eu parti pro Netbeans, criei duas comboBox (mas você pode usar o jTextField normalmente) e um botão.

Meu botão é para o Mês e o Ano.

Ficou assim:

try {
    conecta.executaSQL ("SELECT observacao, grupo, mes, ano, SUM(valor) AS valor FROM financas WHERE mes ilike '%"+campomes.getSelectedItem()+"%' and ano ilike '%"+campoano.getSelectedItem()+"%' GROUP BY observacao, grupo, mes, ano HAVING SUM(valor) > 0.001 order by observacao"); //aqui é quase igual a query do iReport, eu só adicionei o "where" pra o usuário selecionar uma data que ele quiser.
    JRResultSetDataSource relatResul = new JRResultSetDataSource(conecta.rs);
    JasperPrint jpPrint = JasperFillManager.fillReport("C:/Users/abner/JaspersoftWorkspace/MyReports/GastosFixos.jasper", new HashMap(), relatResul);
    JasperViewer jv = new JasperViewer(jpPrint,false);
    jv.setVisible(true);
    jv.toFront();
} catch (JRException e) {
    JOptionPane.showMessageDialog(rootPane, "Não há relatórios para esta data!");
   }

Se você quiser ficar somente com o mês ou somente o ano, lembre-se que ele irá puxar muitos dados, ou seja, se você escolher Janeiro: o ireport vai puxar janeiro de todos os anos, e se escolher 2017: o ireport vai puxar todos os mesês de 2017.

Para fazer assim, basta excluir o “and”, ficará assim:

try {
    conecta.executaSQL ("SELECT observacao, grupo, mes, ano, SUM(valor) AS valor FROM financas WHERE mes ilike '%"+campomes.getSelectedItem()+"%' GROUP BY observacao, grupo, mes, ano HAVING SUM(valor) > 0.001 order by observacao"); //aqui é quase igual a query do iReport, eu só adicionei o "where" pra o usuário selecionar uma data que ele quiser.
    JRResultSetDataSource relatResul = new JRResultSetDataSource(conecta.rs);
    JasperPrint jpPrint = JasperFillManager.fillReport("C:/Users/abner/JaspersoftWorkspace/MyReports/GastosFixos.jasper", new HashMap(), relatResul);
    JasperViewer jv = new JasperViewer(jpPrint,false);
    jv.setVisible(true);
    jv.toFront();
} catch (JRException e) {
    JOptionPane.showMessageDialog(rootPane, "Não há relatórios para esta data!");
   }

Sem%20t%C3%ADtuloSem%20t%C3%ADtulo1

Se você for no airsoft 60 vezes em um mês só vai aparecer uma vez, e só aparecerá de novo no próximo mês! Flw rapazeada! (e de nada) ) :black_heart: