Gerar relatório por período com jasperreports + ireport + mysql
21 respostas
DiegoSDias
Então pessoal, me dá uma mão se possível…
estou conseguindo gerar o relatório só que tem um pequeno problema…
no meu caso é um relógio de ponto. tenho a tabela horario. Nesta tabela tenho vários registro inseridos, quero um relatorio de pontos que foram batidos em determinados períodos.
segue a parte do código…
DatedataAnt=newSimpleDateFormat("dd/MM/yyyy").parse(tfPeriodo.getText());DatedataPost=newSimpleDateFormat("dd/MM/yyyy").parse(tfAte.getText());StringdataBdAnt=newSimpleDateFormat("yyyy-MM-dd").format(dataAnt);StringdataBdPost=newSimpleDateFormat("yyyy-MM-dd").format(dataPost);ResultSetrs=stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");if(rs.next()){MaphsMap=newHashMap();JRResultSetDataSourcejrRs=newJRResultSetDataSource(rs);JasperPrintjasperPrint=JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper",hsMap,jrRs);JasperViewerjasperView=newJasperViewer(jasperPrint,false);jasperView.show();}
O problema é o seguinte, até agora tenho 6 registros de horario, só para testes… quando o relatório é gerado ele não mostra o primeiro registro. Ele mostra todos os outros menos o primeiro registro. Mostra apenas 5 dos seis registros. Entenderam?
Alguém tem alguma dica!?
Simples, quando você chama rs.next() o ResultSet avança o primeiro registro, assim, o engine do JasperReports vai preencher o relatório a partir do segundo registro.
DiegoSDias
Me recomenda oq kra? Deu certinho, era o resultset… tirei, mas ainda preciso tratar…
valew a ajuda!
DiegoSDias
Consegui com dois ResultSets, só assim…
Se alguém tiver outra solução melhor!!!
valew ae
TheKill
Tratar oque??
Qual o problema encontrado??
Não entendi oque vc quer fazer…
Att. Jonas
emmanuelrock
Vc quer testar se o ResulSet nao esta vazio, é isso??
DiegoSDias
vc entendeu a minha pergunta?!?
DiegoSDias
então emmanuelrock, o problema é que se eu fizer assim meu primeiro item do relatório não aparece…
por causa do rs.next()
ele começa pegando o segundo registro
aí o meu primeiro item não aparece entendeu!
a única solução para tratar o problema foi usar dois resultset
assim
um para quando não encontrar o período dar a mensagem de data não encontrada
e outro para mostrar os registros durante o período que eu passei como parametro no sql
assim não funciona, ele não gera o relatorio. Dá erro pq ele não consegue encontrar os proximos registros!
emmanuelrock
Entao quando o relatório nao for gerado é que sua consulta nao esta retornando nada. Por que o metodo first() retorna true se houver pelo menos uma linha no resultSet.
DiegoSDias
olha o que eu to fazendo…
ResultSet rs = stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");
if(!rs.next()){
JOptionPane.showMessageDialog(null, "Não há registros para essa data");
}else{
ResultSet rs2 = stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");
JRResultSetDataSource jrRs = new JRResultSetDataSource(rs2);
Map hsMap = new HashMap();
JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper", hsMap, jrRs);
JasperViewer jasperView = new JasperViewer(jasperPrint, false);
jasperView.show();
}
Assim funcionou legal…
emmanuelrock
ResultSetrs=stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");if(rs.first()){JRResultSetDataSourcejrRs=newJRResultSetDataSource(rs);MaphsMap=newHashMap();JasperPrintjasperPrint=JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper",hsMap,jrRs);JasperViewerjasperView=newJasperViewer(jasperPrint,false);jasperView.show();}else{JOptionPane.showMessageDialog(null,"Não há registros para essa data");}
Teoricamente isso deveria funcionar.
mjmendes
DiegoSDias:
então emmanuelrock, o problema é que se eu fizer assim meu primeiro item do relatório não aparece…
por causa do rs.next()
ele começa pegando o segundo registro
aí o meu primeiro item não aparece entendeu!
a única solução para tratar o problema foi usar dois resultset
assim
um para quando não encontrar o período dar a mensagem de data não encontrada
e outro para mostrar os registros durante o período que eu passei como parametro no sql
É, do jeito que está feito, é isso mesmo, tem que rodar uma vez, ver se tem dados, caso tenha rodar de novo e mandar pro jasper.
Pra não ficar tão feio, você pode 1o. rodar uma query com count(1) para ver se tem registros, caso o count seja maior que zero manda rodar esse rs, caso seja 0 mostra a mensagem de “sem dados”.
[]´s
DiegoSDias
agora o relatório gerou mas com o mesmo problema, não aparece o primeiro registro…
complicado… :?
vou deixar assim mesmo, tá funcionando ta bom!!!
emmanuelrock
Qualquer coisa quando ele entrar no if faça o cursor voltar com beforeFirst() e pronto.
ResultSetrs=stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");if(rs.first()){rs.beforeFirst();JRResultSetDataSourcejrRs=newJRResultSetDataSource(rs);MaphsMap=newHashMap();JasperPrintjasperPrint=JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper",hsMap,jrRs);JasperViewerjasperView=newJasperViewer(jasperPrint,false);jasperView.show();}else{JOptionPane.showMessageDialog(null,"Não há registros para essa data");}
mjmendes
DiegoSDias:
agora o relatório gerou mas com o mesmo problema, não aparece o primeiro registro…
complicado… :?
vou deixar assim mesmo, tá funcionando ta bom!!!
O problema é que o comando if(!rs.next()) move o ponteiro do resultset, sendo verdadeiro ou falso, não tem jeito, aí vc tem que fazer a query duas vezes mesmo.
O .fisrt() só funciona se o tipo do resultset for scrollable, ou seja, permite navegar pela lista de retorno, mas não é todo JDBC que tem essa opção.
[]´s
DiegoSDias
emmanuelrock:
Qualquer coisa quando ele entrar no if faça o cursor voltar com beforeFirst() e pronto.
ResultSetrs=stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");if(rs.first()){rs.beforeFirst();JRResultSetDataSourcejrRs=newJRResultSetDataSource(rs);MaphsMap=newHashMap();JasperPrintjasperPrint=JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper",hsMap,jrRs);JasperViewerjasperView=newJasperViewer(jasperPrint,false);jasperView.show();}else{JOptionPane.showMessageDialog(null,"Não há registros para essa data");}
Funcionou kra... direitinho! com rs.beforeFirst() eu posso usar então (rs.next()), como eu queria antes... hehehehe
emmanuelrock
Te aconselho a usar o first() mesmo.
DiegoSDias
porque usar o first(), qual a diferença!? O next() usa mais memória?
rmendes08
Particularmente, eu faço esse tipo de verificação no próprio relatório. Se eu não me engano, o Jasper te oferece 3 opções de comportamento quando a query não retorna resultados: página em branco, sem páginas, e no-data-section. Você pode colocar a mensagem no no-data-section e evita todo esse malabarismo com result set.
DiegoSDias
Entendi, mas o problema que eu nunca fiz essas verificações, ainda mais no próprio relatório!
Por enquanto vou deixar assim, quando tiver um tempo, vou procurar saber sobre no-data-section