Ajuda com relatório iReport [RESOLVIDO]

11 respostas
S

Pessoal eu estou precisando de uma ajudinha com iReport. Eu não sei quase nada sobre isso mas eu preciso muito colocar essa função no meu TCC. Só falta isso pra finalmente terminar. O que eu quero fazer: fazer uma consulta no banco e exibir os dados na jTable (isso já está fazendo). Então eu quero selecionar um registro na tabela e exibir um relatório desse registro selecionado. Com esse código aqui exibe o relatório de todo o conteúdo do banco, de todos os registros. Mas eu preciso que exiba o relatório apenas do registro que eu selecionar na tabela.

private void imprimeRelatorio() {
		try{
			Connection c = (Connection) conexao.conectar();
			
			String jasperFile = "../Relatorios/Cliente.jasper";
			
			HashMap <String, String> parametro = new HashMap<String, String>();

			parametro.put("","");

			JasperPrint print = JasperFillManager.fillReport(jasperFile, parametro,c);
			
			JasperViewer viewer = new JasperViewer(print , true);  

			viewer.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);  	
			
			 if (print .getPages().size() != 0) {  
			             viewer.setExtendedState(JasperViewer.MAXIMIZED_BOTH);
			             viewer.setTitle("Relatório de Clientes");  
			             viewer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			             viewer.setVisible(true);  
			 }  
			               
			     
			               
			       }catch(Exception ex){     
			          ex.printStackTrace();     
			       }     
			            
			            
			    }

E dentro de um evento do botão "Listar":

jButtonListar.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
			      
					linha = jTable.getSelectedRow();
					
					if(linha == -1){
						 JOptionPane.showMessageDialog(null, "Selecione um registro por favor!");	
														
						}else{

					imprimeRelatorio();
			      
				}


			}}

O arquivo "Cliente.jasper" eu criei com o uso da ferramenta iReport 3.5.2. E a query do meu banco fica dentro desse arquivo. O que me falaram que tem que fazer: pra poder filtrar assim o resultado, eu tenho que criar um parâmetro dentro dessa ferramenta e depois passar esse parâmetro no método parametro.put("","");. Eu tentei mas não consegui.

A minha query é essa:

SELECT
     cliente.`IDCliente` AS cliente_IDCliente,
     cliente.`Cliente` AS cliente_Cliente,
     cliente.`EstadoCivil` AS cliente_EstadoCivil,
     cliente.`Sexo` AS cliente_Sexo,
     cliente.`DataNasc` AS cliente_DataNasc,
     cliente.`RG` AS cliente_RG,
     cliente.`CPF` AS cliente_CPF,
     cliente.`Telefone` AS cliente_Telefone,
     cliente.`Endereco` AS cliente_Endereco,
     cliente.`Bairro` AS cliente_Bairro,
     cliente.`Cidade` AS cliente_Cidade,
     cliente.`Estado` AS cliente_Estado,
     cliente.`Cep` AS cliente_Cep,
     cliente.`Data` AS cliente_Data
FROM
     `cliente` cliente

Me falaram que eu tenho que adicionar no final dessa query essa linha: WHERE cliente.`IDCliente` = $P{identificacao} onde "identificação" é o nome do parâmetro que eu devo criar. Eu já criei esse parâmetro dentro dessa ferramenta, só que quando eu mando rodar o relatório (dentro da ferramenta mesmo), aparece essa telinha pedindo pra setar um valor:

[img]http://img22.imageshack.us/img22/8929/imagemmh.jpg[/img]

Só que o problema é que eu não sei que valor que eu tenho que colocar aqui. Aí quando eu coloco qualquer valor ou deixo em branco e dou OK, aparece a mensagem que o documento está em branco. Não mostra nada no relatório. Isso só acontece quando eu adicino no final da minha query aquele "Where..." com o nome do parâmetro.

E após a criação desse parâmetro, eu sei que eu tenho que passar o nome desse parâmetro no método put, qu ficaria assim:

//mudo de String para Integer pra depois o método put aceitar um parâmetro do tipo int, pois nas propriedades do parâmetro eu deixei esse parâmetro do tipo Integer.
HashMap <String, Integer> parametro = new HashMap<String, Integer>();

parametro.put("identificacao",linha); //linha é aquela variavel que fica  no método dentro do botão que é onde vai armazenar a linha clicada.

Então eu gostaria da ajuda de vocês pra me falar o que eu estou fazendo de errado com esse parâmetro e como eu devo proceder da maneira correta?

Aguardo a ajuda de vocês, obrigado.

11 Respostas

maiconramones

Colega não conheço muito de swing mas…

No addMouseListener que é onde você verifica se foi selecionado pelo menos um registro. Você precisa recuperar o objeto associado a registro selecionado, acredito que esse objeto deva ter um atributo que represente o id do cliente. Recuperado o atributo do id basta você passar esse atributo como parâmetro para o método imprimeRelatorio, ficando mais ou menos assim: imprimeRelatorio(idCliente) e depois colocar parametro.put(“identificacao”,idCliente);

Espero ter ajudado

S

maiconramones:
Colega não conheço muito de swing mas…

No addMouseListener que é onde você verifica se foi selecionado pelo menos um registro. Você precisa recuperar o objeto associado a registro selecionado, acredito que esse objeto deva ter um atributo que represente o id do cliente. Recuperado o atributo do id basta você passar esse atributo como parâmetro para o método imprimeRelatorio, ficando mais ou menos assim: imprimeRelatorio(idCliente) e depois colocar parametro.put(“identificacao”,idCliente);

Espero ter ajudado

Entendi. Mas como eu faço lá no parâmetro? Eu coloco essa linha na query? WHERE cliente.IDCliente = $P{identificacao}

E que valor eu coloco aqui?

S

Mais alguém pode me dar uma ajuda?

S

Agora to começando a entender. Aqui onde eu tenho que setar o valor do parâmetro:

[img]http://img22.imageshack.us/img22/8929/imagemmh.jpg[/img]

Eu tenho que colocar o valor do IDCliente só pra filtrar a busca. Isso é só pra testar no iReport mesmo. Por exemplo, o ID do primeiro cliente da tabela é 75, então eu coloquei esse valor ali mostrou apenas o cliente do ID que é 75. É assim que eu quero mostrar lá no Java.

Só que eu queria saber como isso vai ficar no Java?

HashMap <String,  Integer> parametro = new HashMap<String, Integer>();

int IDCliente = 0;
			
parametro.put("identificacao",IDCliente);

E quando eu mando exibir o relatório mostra essa exceção:

net.sf.jasperreports.engine.JRException: Incompatible java.lang.Integer value assigned to parameter identificacao in the Cliente dataset.
	at net.sf.jasperreports.engine.fill.JRFillDataset.setParameter(JRFillDataset.java:904)
	at net.sf.jasperreports.engine.fill.JRFillDataset.setFillParameterValues(JRFillDataset.java:643)
	at net.sf.jasperreports.engine.fill.JRFillDataset.setParameterValues(JRFillDataset.java:585)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1234)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:865)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:814)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:421)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:251)
	at cliente.CadastroCliente.imprimeRelatorio(CadastroCliente.java:1292)
	at cliente.CadastroCliente.access$19(CadastroCliente.java:1278)
	at cliente.CadastroCliente$7.mouseClicked(CadastroCliente.java:968)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)

O que será que eu fiz de errado? O parâmetro eu já deixei do tipo Integer lá no iReport.

willricardo

Me parece que o erro é simplesmente por isso.

Deixar como integer no relatório, pois acredito que esta passando uma string como parâmetro para o relatório.

deixa como text mesmo no ireport que ira funfar!!

Abraços!

S

willricardo:
Me parece que o erro é simplesmente por isso.

Deixar como integer no relatório, pois acredito que esta passando uma string como parâmetro para o relatório.

deixa como text mesmo no ireport que ira funfar!!

Abraços!

Só mudei para String no relatório e ainda gera a mesma exceção.

willricardo

Cara tira tambem o generics do HashMap, pois o mesmo não precisa para enviar parametros!!

HashMap parametro = new HashMap();

Manda assim que rola, pois é o que eu faço quando preciso mandar parametros!!

Abraços!!

S

willricardo:
Cara tira tambem o generics do HashMap, pois o mesmo não precisa para enviar parametros!!

HashMap parametro = new HashMap();

Manda assim que rola, pois é o que eu faço quando preciso mandar parametros!!

Abraços!!

Tirei o generics e quando eu mando gerar o relatório aparece a mensagem que o documento não contém páginas. Mas aparece a mensagem que tem que ter o generics. Não é uma mensagem de erro mas indicou que precisa:

Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to
generic type HashMap<K,V> should be parameterized

Essa parte aqui está certo mesmo?

int IDCliente = 0;

Esse IDCliente é referente ao ID que está lá no banco que é o ID do cliente que eu quero filtrar a consulta.

S

Já consegui resolver o problema. Meu professor me ajudou hoje na aula. :smiley:

willricardo

Cara posta a solução!!

pode ser duvidas as outras pessoas!!

E para complementar coloque um [RESOLVIDO] no assunto do seu primeiro post!!

Abraços!

S
A solução é essa: tem que declarar uma variável no parâmetro do método e depois a variável IDCliente vai receber essa variável e passar no parâmetro do método put.
private void imprimeRelatorio(int cod) {

int IDCliente = cod;
			
parametro.put("identificacao",IDCliente);

E na chamada do método faz assim:

jButtonListar.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
			      
					linha = jTable.getSelectedRow();
					
					if(linha == -1){
						 JOptionPane.showMessageDialog(null, "Selecione um registro por favor!");	
							
							
						}else{
					
					
										
							imprimeRelatorio((Integer) jTable.getValueAt(linha, 0));
			      
				}


			}}

Não sei explicar certinho isso mas é essa a solução.

Criado 1 de novembro de 2009
Ultima resposta 5 de nov. de 2009
Respostas 11
Participantes 3