[RESOLVIDO]IReport só exibe pagina em branco

13 respostas
D

RESOLVI USANDO A VERSÃO 3.7 DO IREPORT, ESTAVA USANDO A VERSÃO 4.6
ESSA VERSÃO 4.6 ESTAVA GERANDO UM COMPONENTE "UUID" DENTRO DO XML E NÃO DEIXAVA O PROJETO SER COMPILADO.
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

Bem galera, seguindo alguns tutoriais tentei criar um relatorio e exibi-lo pelo java, mas estou tendo o problema dele só exibir os relatorio em branco .. vou postar o código aqui ..

public class ChamaReport {  
  
    private static Connection getConnection() throws  
        ClassNotFoundException, SQLException {  
        String driver = "com.mysql.jdbc.Driver";  
        String url = "jdbc:mysql://localhost:3306/meuprojeto";  
        String user = "root";  
        String password = "teste";  
  
        Class.forName(driver);  
        Connection con = DriverManager.getConnection(url, user, password);  
        return con;  
    }  
  
    public static void main(String[] args) throws JRException, Exception {  
        new ChamaReport().geraRelatorio();  
    }  
  
    @SuppressWarnings("unchecked")
	private void geraRelatorio() throws JRException, SQLException, ClassNotFoundException {
    	Connection conn =  ChamaReport.getConnection();
    	Statement stat = conn.createStatement();
    	String SQL = "Select * From tb_Produtos";//
		ResultSet rs = stat.executeQuery(SQL);
    	
    	HashMap map = new HashMap();
    	
    	while(rs.next()){
    		map.put("cod", 		 Integer.valueOf(rs.getInt("cod")));
    		map.put("descricao", rs.getString("descricao"));
    		map.put("preco", 	 Double.valueOf(rs.getDouble("preco")));
    		
    		System.out.println("Cod:" +map.get("cod"));
    		System.out.println("Des:" +map.get("descricao"));
    		System.out.println("Pre:" +map.get("preco"));
    	}	
    	
    	JRResultSetDataSource jrRS = new JRResultSetDataSource(rs); 

        JasperReport report = (JasperReport) JRLoader.loadObject("MeuProjeto.jasper"); 
        JasperPrint relatorio = JasperFillManager.fillReport(report, map,jrRS); 
        JasperViewer viewer = new JasperViewer(relatorio,false); 
        viewer.setVisible(true); 
        viewer.show();   
    }  
  
}

13 Respostas

B

Faça o seguinte, como é um exemplo simples, separe as coisas pra descobrir se o erro está no código ou no desenho do relatório.

Crie um datasource sql no iReport e faça o seu “MeuProjeto.jasper” apontar pra ele.
Nesse datasource coloca o select que ta no código.

Depois roda o relatório, pelo iReport mesmo. Se funcionar, não há nenhum problema no seu arquivo jasper.

Esqueci de perguntar antes, acontece alguma exception?
Você chegou a depurar o código pra ver se os registros estão sendo retornardos do banco?

D

Então cara, alterei o seguinte e deu o seguinte erro:

JasperPrint relatorio = JasperFillManager.fillReport(report, map,jrRS); //TIREI O MAP E PASSEI A CONEXÃO JasperPrint relatorio = JasperFillManager.fillReport(report, null,conn);

Veio esse erro:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'tb_produtos.descicao' in 'field list'

Então, se eu rodar direto no IReport roda de boa …

D

A disfarça … e já havia percebido esse erro, eu havia criado o campo com o nome errado, mas já arrumei no relatório, porém ele continua dando esse erro quando chamo pela aplicação …

D

Engraçado, agora esta dando NullPointerException, a problema era que eu havia mudado o nome do filed porém na consulta dentro do XML do IReport estava com o campo antigo …:

Exception in thread "main" java.lang.NullPointerException at java.lang.Class.isAssignableFrom(Native Method) at net.sf.jasperreports.engine.fill.JRFillTextField.getFormat(JRFillTextField.java:706) at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:394) at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java:368) at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:258) at net.sf.jasperreports.engine.fill.JRFillFrame.evaluate(JRFillFrame.java:147) at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:258) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:499) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillTitle(JRVerticalFiller.java:326) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:262) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946) 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 novoteste.ChamaReport.geraRelatorio(ChamaReport.java:57) at novoteste.ChamaReport.main(ChamaReport.java:32)

R

voce ja debugou e viu se esta vindo os valores respectivo de cada um?

D

Não, mas só uma dúvida, para que serve o Parametro Map ?

B

Eu fiquei meio confuso, criando o datasource no iReport e rodando o relatório por lá, funcionou na boa?
Como já disse o RiQuInHo_$_$, você já debugou o código pra ver se todos os valores estão vindo corretamente?

Outra coisa, passa o jrRs e não a conexão. Pois se tua intenção é rodar o relatório a partir da aplicação com os dados prontos, você tem que mandar o jrRs pois ele já tem o resultSet dentro dele.

Pra você não ter que passar parametro por parametro para o seu relatório. Dessa forma o jasper pode pegar o key do seu map e “linkar” com o nome do campo que você definiu no jasper.

D

Ainda não debuguei …
Então, se eu passar o Map quer dizer que eu não preciso passar o jrRs pois os dados já estarão no Map certo ?

B

Diego Adriano:
Ainda não debuguei …
Então, se eu passar o Map quer dizer que eu não preciso passar o jrRs pois os dados já estarão no Map certo ?

Faz o teste, em teoria, funciona. Não tenho como testar aqui.

R

Diego Adriano:
Ainda não debuguei …
Então, se eu passar o Map quer dizer que eu não preciso passar o jrRs pois os dados já estarão no Map certo ?

1º voce criou algum parametro no relatorio para ficar usando esse cara?

tipo uma imagem

private static URL IMAGE_PATH = null;
parametro.put("PATH_LOGO", IMAGE_PATH);

no relatorio:

$P{PATH_LOGO}

dando um exemplo de imagem…

D

Bem, no relatório eu tenho isso:

$F{cod} $F{descricao} $F{preco}
no Map

map.put("cod", Integer.valueOf(rs.getInt("cod"))); map.put("descricao", rs.getString("descricao")); map.put("preco", Double.valueOf(rs.getDouble("preco")));

Pelo que li em vários tutoriais o map estaria passando os dados preenchidos ao relatório, certo?

R

mas pq voce não uso fields em vez de fazer esses caras como parametro?

exemplo:

to:

RelatorioClienteTO relatorioClienteTO = new RelatorioClienteTO();

aqui:

if(rs.next()) { relatorioClienteTO.setCodigoImprCliente(rs.getString("codigoImprCliente"));

D

Como assim não uso Fields ? Uso sim … da uma olhada no print …
e o que teria nessa classe “TO” ai?

Seria como eu ter uma classe Produto e armazenar a consulta nela e passar ela como parametro ??


Criado 2 de julho de 2012
Ultima resposta 2 de jul. de 2012
Respostas 13
Participantes 3