Sub relatorio nao faz consulta

33 respostas
K

ola galera, assim como varias pessoas estou com problema em gerar um sub report, ele funciona direito dentro do ireports mas dentro do java tava dando akele erro de :

31/01/2008 15:18:35 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
WARNING: The supplied java.sql.Connection object is null.

vi em alguns site que era so adicionar a conexao no fina, tudo bem ele gerou so que nao esta obedecendo as consultas! o qu eu posso fazer??

segue abaixo meu codigo

public void Relatorios()

{

try

{
con = Conexao.getConnection();
                  stm = con.createStatement();  
        JasperPrint rel, rel2;
        JasperPrint relat;

        String osql = "select * from clientes where codigo='mbs'";
        rs = stm.executeQuery(osql);
     //   ResultSet rs2 = stm.executeQuery("select * from tab_mbs");
        JRResultSetDataSource jrsdt = new JRResultSetDataSource(rs);
   //     JRResultSetDataSource jrsdt2 = new JRResultSetDataSource(rs2);
       HashMap map = new HashMap();
  //     HashMap map2 = new HashMap();
        String arquivojasper = ".//src/relatorios/Relatorio_Clientes.jasper";
   //     String arquivojasper2 = ".//src/relatorios/relatorio_produtos_clientes.jasper";
        rel = JasperFillManager.fillReport(arquivojasper, map, jrsdt);
   //     rel2 = JasperFillManager.fillReport(arquivojasper2, map, jrsdt2);
        JasperViewer visu = new JasperViewer(rel, false);
   //     JasperViewer visu2 = new JasperViewer(rel2, false);
        Mascaras mask = new Mascaras();
        mask.DataForm();
        visu.setTitle("Relatorio de clientes - "+mask.DataForm());
        visu.setVisible(true);
     //   visu2.setVisible(true);
    }
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null,"erro de relatorios");
    }
}

alguemtem algum codigo pront para me enviar??
abraço

33 Respostas

feltraco

assim com ojá disse pra várias pessoas… rs rs rs
de uma olhada nesse tutorial, pra vc poder melhorar o relatorio
caso se interesse…

http://blog.apollo-ti.com/?p=8

como assim nao esta obedecendo a consulta ?

K

ele nao obedece no sentindo de tenho um select * from clientes where codigo=‘mbs’; ele nao mostra so mbs ele mostra tudo, mas vc tem algum exemplo pronto, vc ja conseguiu fazer isso??

feltraco

kikokiller:
ele nao obedece no sentindo de tenho um select * from clientes where codigo=‘mbs’; ele nao mostra so mbs ele mostra tudo, mas vc tem algum exemplo pronto, vc ja conseguiu fazer isso??

tenho sim… no link que te passei tem…

http://blog.apollo-ti.com/?p=8

so que em vez de passar sql, eu deixo a
função de resgatar os dados para aplicação
(EJB, HIBERNATE, etc…)

e posso passar objetos, e listas pro jasper…

qq duvida so chamar…

RenataFA

Amigo, eu faço isso direto.

Dá uma pesquisada, só aqui no GUJ eu já respondi vários tópicos como o seu.
Normalmente existe algum problema na hora de passar a instrução SQL, ou algum parâmetro do relatório principal pro sub-relatório.

Verifique direitinho se vc está mandando tudo do seu .java, pro relatório principal e depois do relatório principal pro sub-relatório.

K

cara eu ainda sou novo em java, mas tem como vc consertar este codigo meu, ou dizer o que ta faltando??
por favor!

feltraco

cara coloca o dodigo dentro da tag

[code]

fica ruim ler assim...

vc já debugou pra ver em que linha da o erro
ou nem complila...??

RenataFA

Amigo, eu não modifiquei seu código em nada (ainda), mesmo pq, só tendo ele aqui, sem seu BD, sem seus .jrxml, seus fontes, não tem como eu exatamente adivinhar onde estaria o problema. Mas vamos te ajudar a encontrar o problema. Eu não modifiquei seu código, apenas organizei ele pra que fique mais fácil de entender, tirei as coisas q não precisava, enfim, ele está abaixo. Observe que coloquei alguns comentários. Leia meus comentários.

public void Relatorios(){
	try	{
		con = Conexao.getConnection();
		stm = con.createStatement();
			
		String osql = "select * from clientes where codigo='mbs'";
			
		rs = stm.executeQuery(osql); // AQUI
			
		JRResultSetDataSource jrsdt = new JRResultSetDataSource(rs);
			
		HashMap map = new HashMap();
			
		String arquivojasper = ".//src/relatorios/Relatorio_Clientes.jasper";
		JasperPrint rel = JasperFillManager.fillReport(arquivojasper, map, jrsdt);
			
		JasperViewer visu = new JasperViewer(rel, false);
			
		Mascaras mask = new Mascaras();
		mask.DataForm();
		
		visu.setTitle("Relatorio de clientes - "+mask.DataForm());
		visu.setVisible(true);
			
	}catch(Exception e){
		JOptionPane.showMessageDialog(null,"erro de relatorios");
		e.printStackTrace(); // para ele imprimir o erro no console para que vc veja
	}
}

Bem, pelo que entendi, vc cria uma conexão e executa o seu SQL ainda no .java. Vc está chamando o relatório e já enviando pra ele os dados selecionados. Alguns (eu por ex) costumam fazer diferente, costumam passar a instrução SQL pro relatório, para que ela seja executada lá dentro. Ok,,, tanto faz a forma, as duas estão corretas, depende do caso.

No seu caso, vc está executando o select antes de enviar pro relatório. Ali onde eu comentei como AQUI vc deve estar carregando um ResultSet com o conteúdo selecionado. Bem, se vc disse que ele não obedece a seleção, já ai ele não deve estar obedecendo a seleção, ou seja, não tem nada haver com o relatório. Então debug seu fonte e veja no AQUI o que é jogado na sua variável rs, veja se está o conteúdo correto ou se ele está trazendo todos os registros como vc disse.

Faça esse teste que estou pedindo e nos mande a resposta. Então te ajudamos a continuar.

feltraco

isso ai Renata…

ajudou msm eim… parabens…
vamos esperar o retorno dele…

:wink:

K

ola, a todos!
continua dando a mensagem:
01/02/2008 08:30:58 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
WARNING: The supplied java.sql.Connection object is null.
e o sub relatorio nao aparece

renata: como vc perguntou no topico anterior meu sub report chama-se: relatorio_produtos_clientes.jasper
e meu banco de dados do sub report chama-se: tab_mbs

como falei ele continua dando o erro acima!

feltraco

qual o datasource do seu sub-relatorio ?

K

to chamando de rssub!

RenataFA

kikokiller:
ola, a todos!
continua dando a mensagem:
01/02/2008 08:30:58 net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
WARNING: The supplied java.sql.Connection object is null.
e o sub relatorio nao aparece

renata: como vc perguntou no topico anterior meu sub report chama-se: relatorio_produtos_clientes.jasper
e meu banco de dados do sub report chama-se: tab_mbs

como falei ele continua dando o erro acima!

Amigo, eu não perguntei o nome do seu subrelatório e nem do BD. Eu falei que sem eles não tem como testarmos, só isso.

Vc debugou onde eu pedi? Qual foi o resultado?

Se vc está passando o DataSource direto pro seu relatório, então dentro do relatório não deve ter nenhuma instrução SQL. Verifique isso, vai ver vc deixou a instrução SQL dentro do seu subrelatório e do relatório e por isso ele tá tentando executá-la e não acha a conexão (que é o erro que está dando).

feltraco

não ajudou muito…

vc deve setar como dataSource para o seu Sub relatorio,
um atributo que esta sendo passado para o relatorio principal
que dever estar dentro do jrsdt

no link que te passei acima mostra como se faz…

qq coisa volta ai…

FLwS

K

realmente ele tinha um codigo dentro dele eu tirei, so que o subrelatorio continua nao aparecendo, o relatorio ta aparecendo o sub nao!, eu tirei o sql de dentro do relatorio e do sub

feltraco

pro relatorio não estar aparecendo

ou vc nao esta setando um DataSource para o SubRelatorio
ou o DataSource que vc esta setando esta vazio

da uma checada

K

naquele link que vc passou eu nao consegui entender! ja eu nao sei como fazer para o datasource do subrelatorio funcionar! o relatorio vai direito o sub é que nao aparece!
nao sei como setar do data source do sub relatorio!

feltraco

que parte que vc naum conseguiu entender…

no relatorio principal, clica com o botao direito no
sub relarorio, -> propriedades -> aba SubRelatorio ->selecione usar um dataSource -> e seleciona da onde vai vir os
dados, normalmente é um field que vc utiliza no relatorio principal…

Estamos ai…

K

como o link que vc passou eu nao consegui resolver! ta esquizito, eu queria saber como faço para fazer o datasource para o sub relatorio!

K

fiz exatamente como ta la, mas dentro do ireport da erro

cant not Strind JRDataSource

K

tem mais alguma coisa para fazer??

feltraco

provavelmente vc colocou o JRDatasource (no java), como string
no jasper

tem que ser do tipo Object

K

como eu faço para mudar??

feltraco

vai no field referente, botao direito -> edit

K

fui com o botao direito no ${codigo}, propriedades, campo texto, la tem qualquer coisa menos java.lang.object

tem alguma outra forma, tentei fazer um patamentro mesmo de defini como object, mas mesmo assim so aparece o formulario quando tento executar no java, o sub formulario nao aparece de jeito nenhum!

feltraco

kikokiller:
fui com o botao direito no ${codigo}, propriedades, campo texto, la tem qualquer coisa menos java.lang.object

tem alguma outra forma, tentei fazer um patamentro mesmo de defini como object, mas mesmo assim so aparece o formulario quando tento executar no java, o sub formulario nao aparece de jeito nenhum!

codigo(no jasper) = JRDataSource (java) ?

${codigo} ?

vai em Visualizar-> Campos do Relatorio -> seleciona o campo referente -> Modificar -> Tipo Classe do Campo -> seleciona Object

K
la no ireports , parou o agora no java ta aparecendo uma mensagem de erro assim:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to net.sf.jasperreports.engine.JRDataSource

at Relatorio_Clientes_1201872137968_716139.evaluate(Relatorio_Clientes_1201872137968_716139:252)

at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:186)

o que sera agora??

K

a renata tinha razao nao precisa de sql dentro ireports
as mensagem de erro acabaram, mas eu gostaria de saber como faço para executar o sql do subreport
vejam como esta o meu codigo: alguem sabe me dizer o que esta faltando??

public void Relatorios(){   
   try {   
        con = Conexao.getConnection();  
        Map map = new HashMap(); 
        Map mapsub = new HashMap();
        
        String arquivojasper = ".//src/relatorios/Relatorio_Clientes.jasper";
        String arquivojasper2 = ".//src/relatorios/relatorio_produtos_clientes.jasper";
        stm = con.createStatement();   
        Statement stmsub = con.createStatement();       
        String osql = "select * from clientes where codigo='mbs'";   
        String osqlsub = "select * from tab_mbs"; 
        rs = stm.executeQuery(osql); 
        ResultSet rssub = stmsub.executeQuery(osqlsub);
        JRResultSetDataSource jrsdtsub = new JRResultSetDataSource(rssub);
                  
        JRResultSetDataSource jrsdt = new JRResultSetDataSource(rs);   
        JasperPrint rel2 = JasperFillManager.fillReport(arquivojasper2, mapsub, jrsdtsub);

        JasperPrint rel = JasperFillManager.fillReport(arquivojasper, map,jrsdt );   
               
        JasperViewer visu = new JasperViewer(rel, false);   
         JasperViewer visusub = new JasperViewer(rel2, false);       
        Mascaras mask = new Mascaras();   
        mask.DataForm();   
           
        visu.setTitle("Relatorio de clientes - "+mask.DataForm());   
        visu.setVisible(true);
        visusub.setVisible(true);
               
    }catch(Exception e){   
        JOptionPane.showMessageDialog(null,"erro de relatorios");   
        e.printStackTrace(); // para ele imprimir o erro no console para que vc veja   
    }   

}

so que ele ta executando os 2 separados

feltraco

cara seguinte…

declara um field no relatorio principal do jasper do tipo Object que vai receber

esse seu DS (rssub)

ai vc adiciona ele como dataSource, do subRelatorio, como te expliquei acima…
no sub-relatorio vc cria os fields que contenham nesse dataSource, e distribui eles

mt simples…

K

eu to fazendo isso mas fica dando erro!
tem algum e-mail q possa me passar para eu mandar os arquivos do ireport e do java??

feltraco

pode mandar nesse do gmail ai da minha assinatura…

K

acabei de enviar para sua caixa de email! valeu!

K

la esta o banco de dados que se chama pelorca, os reports e codigo em java, se precisar e ja enviei tb a conexao

feltraco

ok assim que possivel entro em contato

Criado 31 de janeiro de 2008
Ultima resposta 1 de fev. de 2008
Respostas 33
Participantes 3