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…
Date dataAnt = new SimpleDateFormat("dd/MM/yyyy").parse(tfPeriodo.getText());
Date dataPost = new SimpleDateFormat("dd/MM/yyyy").parse(tfAte.getText());
String dataBdAnt = new SimpleDateFormat("yyyy-MM-dd").format(dataAnt);
String dataBdPost = new SimpleDateFormat("yyyy-MM-dd").format(dataPost);
ResultSet rs = stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");
if(rs.next()){
Map hsMap = new HashMap();
JRResultSetDataSource jrRs = new JRResultSetDataSource(rs);
JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper", hsMap, jrRs);
JasperViewer jasperView = new JasperViewer(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.
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
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.
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();
}
ResultSet rs = stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");
if (rs.first()){
JRResultSetDataSource jrRs = new JRResultSetDataSource(rs);
Map hsMap = new HashMap();
JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper", hsMap, jrRs);
JasperViewer jasperView = new JasperViewer(jasperPrint, false);
jasperView.show();
}else{
JOptionPane.showMessageDialog(null, "Não há registros para essa data");
}
[quote=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[/quote]
É, 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”.
Qualquer coisa quando ele entrar no if faça o cursor voltar com beforeFirst() e pronto.
ResultSet rs = stmt.executeQuery("select * from horario where data between '"+dataBdAnt+"' and '"+dataBdPost+"' order by nome");
if (rs.first()){
rs.beforeFirst();
JRResultSetDataSource jrRs = new JRResultSetDataSource(rs);
Map hsMap = new HashMap();
JasperPrint jasperPrint = JasperFillManager.fillReport("c:\\Projetos\\relogiodeponto\\relat.jasper", hsMap, jrRs);
JasperViewer jasperView = new JasperViewer(jasperPrint, false);
jasperView.show();
}else{
JOptionPane.showMessageDialog(null, "Não há registros para essa data");
}
[quote=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!!![/quote]
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.