[iReport] Como trazer dados tratados?!

Pessoal, estou com um sério problema, comece a usar o iReport recentemente, consegui fazer uns relatórios genéricos com ele, porém o que eu preciso mesmo é de um termo de responsabilidade que virá com os dados (nome, cpf, itens, etc) já preenchidos e é ai que está o problema. Como eu trago esses dados tratados (no caso Sql’s com where’s onde as condicionais estão ligadas ao que o usuário vai fazer) para dentro do meu “relatório” ? Exemplo, o usuário vai selecionar um cliente, e o relatório vai trazer os dados somente daquele cliente, me disseram para usar HashMap, fiz isso dentro do meu sistema (Java, utilizando netbeans) mas como jogo essas informações pra dentro do iReport que estou com dúvida! Se alguém puder me ajudar por favor!

Boa tarde meu caro.

dê uma olhada neste tópico antigo, nele tem algumas respostas

Relatório Ireports usando objetos

Este também ajuda:

Como chamar relatório Ireports no Netbeans

Boa tarde amigo,

muito obrigado por ter tirado um tempinho pra me dar uma moral, dei uma olhada nos 2 artigos e eles realmente me tiraram algumas dúvidas, porém não a principal que é a parte do iReport. Ambos me explicam bem o que fazer e como fazer quando se trata da classe no IDE (no meu caso NetBeans) mas não em como fazer a parte no próprio iReport, que é minha principal dúvida, e é algo que não estou achando em local algum.

Eu já até fiz no meu sistema a parte que teoricamente envia os dados para o relatório, usando Hashmap que foi o que eu mais vi o pessoal usando, mas não ví em local algum como vou fazer dentro do meu relatório para que ele receba as informações.

No ireport você ciará parâmetros e esses irão receber os dados a partir de sua aplicação, ex:

no Ireport
Parâmetro: COD_CLIENTE tipo java.lang.Integer

Query:
Deve ser usado a chave do parâmetro para filtrar os dados de acordo com o valor recebido

SELECT * from cliente WHERE id = $P{COD_CLIENTE}

No Java
Deve ser passado o valor para o parâmetro do relatório utilizando seu nome

Map<String, String> params = new HashMap();
params.put("COD_CLIENTE", idCliente.toString);
jasperPrint = JasperFillManager.fillReport("meuRelatorio.jasper",params,connection);

É basicamente isso, recomendo dar uma pesquisada sobre parâmetros no Jasper Reports.

Da forma como o @Andrauss instruiu, ainda deverá haver query dentro do Ireports.

Pelo que percebo você quer passar uma lista de objetos com os dados prontos para o Ireport, e ele renderizar isso no formato do relatório.

A dica é bem parecida com com que ele disse, mas o que você irá criar neste caso, são fields.

você deve criar as fields com os nomes EXATAMENTE iguais aos do seu objeto no java.

Digamos que você tem um objeto de uma classe chamada Pessoa.

sua classe:

Public class Pessoa {

  private Integer idPessoa;
  private String nomePessoa;

  (getters e setters ..)
}

Dentro do seu report você vai seguir os seguintes passos:

1 - crie o field com o nome igual ao do seu objeto de pessoa:

Botão direito, new field

2 - Insira na tela um elemento “textfield” e dê um duplo clique pra escolher o field

3 - Depois de escolhido, o campo aparece na tela, e quando vc imprimir o relatório ele traz o valor.

Guys, mil perdões, eu devo ser mesmo bastante burro…

Fiz como dito no exemplo, porém fica dando erro de que o relatório não gerou nenhuma página… Segue:

Dentro do iReport:

Minha Classe:

Botão para gerar o Relatório:

Quando vc usa essa forma que lhe mostrei, daí você não usa HashMap.

você faz como neste exemplo aqui, que está no link que mandei no meu primeiro post:

Substitua a lista de livros, por uma lista de Cliente.

public class Inicio {
public void exibirRelatorio() {
	// Caminho onde está o  arquivo .jasper	
	String caminhoRelJasper = "C:"+File.separator+"develop"+
	File.separator+"code"+File.separator+"report-gi"+File.separator+
	"webapp"+File.separator+"WEB-INF"+File.separator+"jasper"+
	File.separator+"Boleto.jasper";
	// Armazena em uma lista os dados que vc irá imprimir
	List listaLivros = getLivros();
	// Stream com o .jasper
	InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);
	// O datasource
	JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(listaLivros);
	// Parametros do relatorios
	Map parametros = new HashMap();
	JasperPrint impressao = new JasperPrint();
	try {
		impressao = JasperFillManager.fillReport(caminhoRelJasper ,parametros, ds);
		JasperViewer viewer = new JasperViewer(impressao, true);
		viewer.setVisible(true);
                                            //Nome e diretorio onde vai ser gerado o PDF
		String destFileName  ="C:\geraPDF.pdf";
		JasperExportManager.exportReportToPdfFile(impressao,destFileName);
		JasperExportManager.exportReportToHtmlFile(impressao,destFileNameHTML);		
	} catch (JRException e) {
		System.out.println(e.getMessage());
		System.out.println("PRINTSTACKTRACE = ");
		e.printStackTrace();
	}
}

Meio que consegui fazer aqui, meu código ficou assim:




        //JasperPrint jasperPrint = null;
         destFileName = "D:"+File.separator+"Dev";
         String caminhoRelJasper = "report1.jasper";
         ArrayList listaClientes = new ArrayList(listaCliente);
       
        HashMap parametros = new HashMap();
        InputStream relJasper = getClass().getResourceAsStream(caminhoRelJasper);
        try {
            // compile do jrxml
            JasperReport jasperReportTermoResponsabilidade =
					JasperCompileManager.compileReport(caminhoRelJasper);
            
        JasperPrint relTermoJasper = JasperFillManager.fillReport(jasperReportTermoResponsabilidade, parametros, new JRBeanCollectionDataSource(listaClientes));
        JasperViewer viewer = new JasperViewer(relTermoJasper, true);
		viewer.setVisible(true);
		JasperExportManager.exportReportToPdfFile(relTermoJasper,destFileName);
  
        } catch (JRException e) {
            
            System.out.println("Erro"+ e);
        }


porém ainda dá o erro:

Erronet.sf.jasperreports.engine.JRException: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Byte inválido 1 da sequência UTF-8 do byte 1.