Gerar relatório por período com jasperreports + ireport + mysql

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…

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!?

Valew

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.

Me recomenda oq kra? Deu certinho, era o resultset… tirei, mas ainda preciso tratar…
valew a ajuda!

Consegui com dois ResultSets, só assim…
Se alguém tiver outra solução melhor!!!

valew ae

Tratar oque??

Qual o problema encontrado??
Não entendi oque vc quer fazer…

Att. Jonas

Vc quer testar se o ResulSet nao esta vazio, é isso??

vc entendeu a minha pergunta?!?

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

Já tentou usar

if resultSet.first(){...} ?

Ex…

 if(rs.first()){  
        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();   
     
  }else{
//... lalalaal
}  

assim não funciona, ele não gera o relatorio. Dá erro pq ele não consegue encontrar os proximos registros!

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.

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…

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");
}

Teoricamente isso deveria funcionar.

[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”.

[]´s

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!!!

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.

[]´s

[quote=emmanuelrock]Qualquer coisa quando ele entrar no if faça o cursor voltar com beforeFirst() e pronto.

[code]
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”);
}
[/code][/quote]

Funcionou kra… direitinho! com rs.beforeFirst() eu posso usar então (rs.next()), como eu queria antes… hehehehe

Te aconselho a usar o first() mesmo.

porque usar o first(), qual a diferença!? O next() usa mais memória?