[RESOLVIDO]Query do JasperReport

13 respostas
D

Bom Dia a Todos

Bom eu sei que existem N topicos para este problema aqui no GUJ, entre outros foruns, acreditem estou a 5 dias procurando soluções para os meus problemas, e realmente encontrei para vários outros que tive, e não estaria criando este tópico, se realmente não estivesse precisando

bom eu estou aprendendo a utilizar o jasperreports, depois de muitos tutorias e tals consegui fazer um relatorio no ireports, bem simples, só para teste, ele tem um label de titulo, um de coluna, e um text field que pega o nome do usuario no banco só, ainda usando um select * from.....

no ireport funciona que é uma blz, mas quando chamo na aplicação, ele dá dois erros, se passo o JRResult ele fala

[color=red]
net.sf.jasperreports.engine.JRException: Unable to get next record.
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:95)
at net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource(JRFillDataset.java:864)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:782)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1482)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:126)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:540)
at br.casa.view.rascunhos.Relatorios.(Relatorios.java:54)
at br.casa.view.principal.JanelaPrincipal$8.actionPerformed(JanelaPrincipal.java:166)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7145)
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:91)
... 49 more

[/color]

[size=18]Se eu passo a conexão da este erro, na query que eu fiz no report [/size]

[color=red]net.sf.jasperreports.engine.JRException: Error preparing statement for executing the report query :

select * from usuarios

at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:266)
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:157)
at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:684)
at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:605)
at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1281)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:901)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)
at br.casa.view.rascunhos.Relatorios.(Relatorios.java:54)
at br.casa.view.principal.JanelaPrincipal$8.actionPerformed(JanelaPrincipal.java:166)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1193)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1180)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4137)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4103)
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:196)
... 49 more
[/color]

Eu já utilizei está query com ; e sem e deu o mesmo resultado, não consigo pensar em nada mais simples que isso, vi que este erro é muito comum em
formatação com data, mas neste caso é só o nome mesmo, tambem já fui no ireport e fiz o relatorio novamente escolhendo a linguagem para java, eu vi em outro tópico que o nativo dele é groovy, nos dois casas deu problema. já importei as libs da pasta do ireport, baixei de outros sites recomendados, e da mesma forma deu estes problemas, já não sei mais o que fazer este é o código que eu estou usando, tbm já estei vários outros mas estes foram os erros que dão em qualquer forma de código que utilizo, no caso no MAP do paramns estou passando ele null, mas tbm já passei sentando um valor qualquer e dão os mesmos erros

public Relatorios(String nada){
		
		
		 JasperPrint jasperPrint;  
		    JasperViewer jasperViewer;  
		    JRResultSetDataSource dataSource = null;  
		      
		    Map params = null;
		    //params.put(1, "teste");
		     try {
		    	 ResultSet dados =  new UsuarioDAO().listar2();
		    	 dados.next();
				dataSource =  new JRResultSetDataSource(dados );
				
				

		        jasperPrint = JasperFillManager.fillReport("C:/LojaX/javaReport.jasper", params, new ConexaoDAO().getInstance());  
		      
		       
		            jasperViewer = new JasperViewer(jasperPrint, false);  
		            jasperViewer.setZoomRatio(0.75F);  
		            jasperViewer.setLocationRelativeTo(null);  
		            jasperViewer.setVisible(true);  
		         
		        
		            JasperPrintManager.printReport(jasperPrint, true);  
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}   catch(JRException exception){  
		      exception.printStackTrace();
		    }
		     
		   
		   
		
		
	}

eu deixei o dataSource ali que uso para testar com a conexão ou com o JRResult.

Bom mais uma vez, só criei este tópico porque não achei nada que resolvesse meu problema, estou para entrar no 4º semestre da facul, e como estamos de férias não consigo encontrar meu prof para ele tirar minhas duvidas... mas sei que existem muitos tópicos com problemas semelhantes
as libs que uso são estão na imagem anexada, coloquei todas por que não sei se pode ser conflito com algum outro, como as do JFreeChart

se quiserem tbm coloco o código do JRXML, esta está sendo a primeira vez que uso um relatorio, deve ser por isso que estou tendo tantos problemas..rsrsrs

Desde já agradeço a ajuda, principalmente de muitos outros tópicos, que já me esclareceram N duvidas, desde abril que uso esta comunidade, e está é a primeira vez que tenho que criar algum tópico por não ter encontrado nada antes...
VLW

PS: Primeiro Post :oops:

13 Respostas

D

Faltou a imagem com as libs não consegui colocar a imagem…rsrs
Bom de qualquer forma, vou postar todas as que estou usando

commons-beanutils-1.8.2.jar
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-digester-1.7.jar
commons-discovery-0.4.jar
commons-el.jar
commons-fileupload-1.1.1.jar
commons-io-1.3.2.jar
commons-javaflow-20060411.jar
commons-lang-2.4.jar
commons-logging-1.1.jar
commons-math-1.0.jar
commons-pool-1.3.jar
commons-vfs-1.0.jar
gnujaxp.jar
iText-2.1.7.jar
jasperreports-4.0.2.jar
jasperreports-applet.jar
jasperreports-fonts-4.0.2.jar
jcommon-1.0.16.jar
jdt-compiler-3.1.1.jar
jfreechart-1.0.13.jar
mysql-connector-java-5.1.13-bin.jar
poi-3.6.jar
xstream-1.3.1.jar

A

Campeão!!!
coloca as outras classes aqui por favor.

E

pelo que eu vi no seu erro:

Caused by: java.sql.SQLException: Operation not allowed after ResultSet closed
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

Observe se vc não está fechando o seu ResultSet antes do relatório ser gerado.

D

Essa é aparte do código que chama aquela tela de relatorios

itemRelatorios.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new Relatorios("C:/LojaX/javaReport.jasper");
				}
				});

E aqui é a classe de conexão com o banco, uso a classe estaticos, pois gero um arquivo XML com os dados de conexão como o usuario, senha porta e tals, e carrego eles quando o programa inicia

public ConexaoDAO() throws SQLException{
	        inicializa( Estaticos.getConexaoDTO().getDriver(),Estaticos.getConexaoDTO().getUrl(),Estaticos.getConexaoDTO().getUsuario(),Estaticos.getConexaoDTO().getSenha());
	    }


	    private void inicializa(String driver, String url, String usuario, String senha) throws SQLException{
	        setUsuario( usuario);
	        setSenha(senha);
	        setUrlInterna(url);
	        setDriver("com.mysql.jdbc.Driver");
	        try {
	            // carrega o driver do banco de dados
	            Class.forName(getDriver());
	            
	        } catch (ClassNotFoundException ex) {
	            ex.printStackTrace();
	        }
	        abreConexao();
	       
	    }



		public Connection getInstance() throws SQLException {
	        abreConexao();
	        return getConexao();
	    }

	    public void abreConexao() throws SQLException{
	            if ( getConexao() == null ){
	                setConexao( DriverManager.getConnection(getUrlInterna(), getUsuario(), getSenha()) );
	            }

	    }

Acho que é só isso ou precisa de mais alguma informação?

D

Esse é aquele metodo lista2 de usuarioDAO, é o que falta que está lá, mas não fecho a conexão em momento algum, pois se eu dou um system.ou.print ele aparece os dados normalmente

a não ser que eu tenha que eu tenha que abrir o JRResult

public ResultSet listar2() throws SQLException {

      String sql = "select id_usuario, nome, login, senha, ativo from usuarios";
      
      // objeto com dados dos registros da tabela usuarios
      Statement stmt = getInstance().createStatement();
      ResultSet dados = stmt.executeQuery(sql);
      
      return dados;//retorna a lista
  }
A

não estou vendo voce dar o Set no seu "dataSource ";
Acho que foi isso que a #eliangela está querendo dizer.

D

try { ResultSet dados = new UsuarioDAO().listar2(); dados.next(); dataSource = new JRResultSetDataSource(dados );

Não é nesta parte que estou setando os valores?
rsrsr

B

Oi danielpump.

Quando comecei a trabalhar com o jasper, também passava as informações por ResultSet para o relatório. Mas, à medida que os relatórios vão ficando mais complexos, como por exemplo, relatórios com subReports e até subReports que possuem subReports, essa opção deixa a desejar, por isso que agora eu passo para os relatórios um ArrayList de objetos.

No iReport você cria os fields manualmente, com os mesmo nomes das variáveis de um bean que receberá os dados.
Com o ResultSet você cria um ArrayList, e passa para o report da seguinte forma:

ArrayList<CargoBean> cargos =  repController.getResultSetCargos(con);

if(cargos != null){

	JRBeanCollectionDataSource ds	= new	JRBeanCollectionDataSource(cargos);
	
	/* Gero o ResultSet que será enviado a partir da conexão aberta */
	//JRResultSetDataSource jrsds = new JRResultSetDataSource(rs); 
				
	/* Mando o jasper gerar o relatório */
	JasperPrint print = JasperFillManager.fillReport(pathJasper	+ "ReportCargos.jasper", parametros, ds);
	
	/* Exporta para PDF */
	 JasperExportManager.exportReportToPdfFile(print, path + reportName.toString()); 
				
	/* Redireciona para o pdf gerado */
	response.sendRedirect(reportName.toString());

Espero ter ajudado!
Valeu!
Bjinho :smiley:

A

Parabéns #bruninhatp !!!

B

*Brigaaada!! :wink:

D

Muito Obrigado pela dica Bruna, mas não consegui implementar esse código…rsrs
Até porque não consegui entender bem a explicação, de como ele funciona com um Bean…rsrs
mas realmente agradeço, então se alguem puder me explicar principalmente a parte sobre eu estar fechando a conexão, tem alguma forma de verificar se ela está aberta? se sim como?

D

Vlw mesmo galera, realmente estou fechando a conexão do banco só não descobri onde ainda, mas pra testar tirei o metodo fechaConexao do ConexaoDAO e funcionou perfeito o relatorio, agradeço a todos por me ajudarem, foi falta de atenção mesmo, mas como to aprendendo acontece…rsrsrs

VLW msm
Pode por resolvido no POST né?

A

Valew campeão!!! é sempre bom ver resultados, continue assim, não tenha vergonha de perguntar, pois assim se chega a algum lugar.

Abraços à todos!!!

OBS: POST como RESOLVIDO, por favor.

Criado 25 de julho de 2011
Ultima resposta 25 de jul. de 2011
Respostas 13
Participantes 4