Dúvida com iReport

Fala galera,

Estou construindo um relatório pela primeira vez no iReport, utilizei o tutorial disponível aqui mesmo no guj, e pesquisei em vários tópicos relacionados no fórum.

Consegui montá-lo mas com alguns problemas:

-> Não entendi a função das bandas;
-> No caso a aplicação está gerando uma ordem de serviço que apresentará apenas um registro trazendo os dados através do código da Ordem de Serviço, mas meu relatório está trazendo todos os registro existentes no banco de dados listando-os um abaixo do outro;
-> Utilizei uma query usando 3 tabelas, em que os dados serão capturados através do código de uma delas, como farei para a query receber um código específico na hora em que a aplicação gerar o relatório? (Isso será um problema futuro, pois ainda estou construindo o modelo no iReport).

Estou meio perdido nesse assunto como vocês poderam perceber hehehe

Se alguém poder me ajudar com essas dúvidas eu agradeço.

Falow 8)

Luciano,

dê uma olhada nesses artigos que com certeza serão de muita ajuda, inclusive sobre a importância de cada banda…tá aí a minha contribuição:

http://www.webly.com.br/colunista.php?user=513

Abraço e espero ter ajudado um pouco.

As bandas são os espaços onde vc vai construir seu relatorio. Cada banda tem uma função especifica:

pageHeader: cabecalho da pagina, aqui o conteudo e impresso em cada pagina nova.

columnHeader: cabecalho da tabela vai ser impressa, para cada grupo de dados esta banda eh impressa uma vez.

detail: aqui seua dados retornados da query vao ser impressos.

columnFooter e pageFooter: o mesmo que os de cima, mas na parte de baixo do relatorio.

lastPageFootter: aqui vai imprimir o conteudo somente na ultima pagina do relatorio.

Não compreendi muito bem qual eh eh a sua duvida, mas acho que deve ser a sua query que esta retornando varios registros, e se os fields estiverem na banda detail, vao ser impressos todos os registros retornados da query.

Quando vc passar a executar o relatorio atraves da aplicação, vc vai usar a biblioteca do jasperReport para passar os parametros para serem executados no relatorio. Os parametros voce configura no relatoiro, e passa eles para a query.

[quote=rmxsantiago]Luciano,

dê uma olhada nesses artigos que com certeza serão de muita ajuda, inclusive sobre a importância de cada banda…tá aí a minha contribuição:

http://www.webly.com.br/colunista.php?user=513

Abraço e espero ter ajudado um pouco.[/quote]

Cara, muito bom o tutorial sobre iReports do site que você me passou, resolveu todos os meus problemas (parcialmente) :lol:

[/quote]

Cara a minha dúvida acho que só irei compreender quando voltar pro código java, mas vou tentar explicar melhor. Essa é a minha query:

SELECT os.cod, os.Tecnico_cod, tecnico.tec_nome, tecnico.tec_telefone, os.Cliente_cod, cliente.cli_nome, cliente.cli_telefone, cliente.cli_endereco, os.equipamento, os.defeito, os.comentarios, os.data FROM os JOIN tecnico ON os.Tecnico_cod = tecnico.cod JOIN cliente ON os.Cliente_cod = cliente.cod

Como irei passar o código para a query trazer apenas os resultados referentes ao código passado?

Acredito que irei realizar essa tarefa quando for usar a biblioteca JasperReport utilizando os parametros como você falou.

Valeu pela atenção galera!

Essa é uma classe que criei pra criar os reports
você pode adaptar para o seu caso.
(Desculpe o fato de não ter um JavaDoc adequado nem comentarios.

package com.jasper;

import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public final class ReportMaker {
	private JasperPrint jp;

	public ReportMaker(Connection connection, String filePath)
			throws JRException {
		this(connection, filePath, new HashMap<String, String>());
	}

	public ReportMaker(Connection connection, String filePath,
			HashMap<String, String> parameters) throws JRException {
		try {
			if (!filePath.endsWith(".jrxml"))
				filePath += ".jrxml";
			JasperReport jr = (JasperReport) JRLoader.loadObject(filePath);
			jp = JasperFillManager.fillReport(jr, parameters, connection);
		} catch (JRException e) {
			throw e;
		}
	}

	public ReportMaker(Connection connection, String filePath, String sql)
			throws SQLException, JRException {
		this(connection, filePath, new HashMap<String, String>(), sql);
	}

	public ReportMaker(Connection connection, String filePath,
			HashMap<String, String> parameters, String sql)
			throws SQLException, JRException {
		try {
			if (!filePath.endsWith(".jrxml"))
				filePath += ".jrxml";
			JasperReport jr = (JasperReport) JRLoader.loadObject(filePath);
			ResultSet rs = connection.createStatement().executeQuery(sql);
			JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
			jp = JasperFillManager.fillReport(jr, parameters, jrRS);
		} catch (JRException e) {
			throw e;
		} catch (SQLException e) {
			throw e;
		}
	}

	public ReportMaker(Connection connection, InputStream fileStream,
			HashMap<String, String> parameters) throws JRException {
		try {
			JasperReport jr = (JasperReport) JasperCompileManager
					.compileReport(fileStream);
			jp = JasperFillManager.fillReport(jr, parameters, connection);
		} catch (JRException e) {
			throw e;
		}
	}

	public ReportMaker(Connection connection, InputStream fileStream)
			throws SQLException, JRException {
		this(connection, fileStream, new HashMap<String, String>());
	}

	public ReportMaker(Connection connection, InputStream fileStream,
			HashMap<String, String> parameters, String sql)
			throws SQLException, JRException {
		try {
			JasperReport jr = (JasperReport) JasperCompileManager
					.compileReport(fileStream);
			ResultSet rs = connection.createStatement().executeQuery(sql);
			JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
			jp = JasperFillManager.fillReport(jr, parameters, jrRS);
		} catch (JRException e) {
			throw e;
		} catch (SQLException e) {
			throw e;
		}
	}

	public ReportMaker(Connection connection, InputStream fileStream, String sql)
			throws SQLException, JRException {
		this(connection, fileStream, new HashMap<String, String>(), sql);
	}

	public void exportToHTML(String local) throws JRException {
		JasperExportManager.exportReportToHtmlFile(jp, local);
	}

	public void exportToPdf(String local) throws JRException {
		JasperExportManager.exportReportToPdfFile(jp, local);
	}

	public void viewReport() {
		JasperViewer.viewReport(jp, false);
	}

	public void exportToPdfStream(OutputStream os) throws JRException {
		JasperExportManager.exportReportToPdfStream(jp, os);
	}

	public void print(boolean prompt) throws JRException {
		JasperPrintManager.printReport(jp, prompt);
	}
}

Eh bem simples passar os parametros.

Se vc vai deixar a sua query montada no relatorio, voce faz assim na query:

SELECT os.cod, os.Tecnico_cod, tecnico.tec_nome, tecnico.tec_telefone, os.Cliente_cod,  
cliente.cli_nome, cliente.cli_telefone, cliente.cli_endereco, os.equipamento, os.defeito,  
os.comentarios, os.data FROM os  
JOIN tecnico ON os.Tecnico_cod = tecnico.cod  
JOIN cliente ON os.Cliente_cod = cliente.cod
WHERE os.Cliente_cod = $P{CLIENTE_COD}

No Java vc coloca o parametro dentro de um Map, pega um dos exemplo do Mark_Ameba:

...
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("CLIENTE_COD", codigo do seu cliente);
...

Ou então vc pode passar direto um dataSource, ai os parametros e a query vc faz tudo no java mesmo.

...
String sql = sua query

ResultSet rs = connection.createStatement().executeQuery(sql);  
JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);  
jp = JasperFillManager.fillReport(jr, parameters, jrRS);
...

:wink:

Isso mesmo que eu tava precisando marcos.

Muito obrigado :smiley:

[]'s