<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>/davidbuzatto</title>
	<atom:link href="http://davidbuzatto.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>http://davidbuzatto.com.br</link>
	<description>Tecnologia, programação e afins</description>
	<lastBuildDate>Thu, 16 Feb 2012 21:08:26 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='davidbuzatto.com.br' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/356c50045ec6b2bed9431d432aa31598?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>/davidbuzatto</title>
		<link>http://davidbuzatto.com.br</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://davidbuzatto.com.br/osd.xml" title="/davidbuzatto" />
	<atom:link rel='hub' href='http://davidbuzatto.com.br/?pushpress=hub'/>
		<item>
		<title>E começa mais um ano</title>
		<link>http://davidbuzatto.com.br/2012/01/06/e-comeca-mais-um-ano/</link>
		<comments>http://davidbuzatto.com.br/2012/01/06/e-comeca-mais-um-ano/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 21:57:11 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://davidbuzatto.com.br/?p=670</guid>
		<description><![CDATA[Olá pessoal! Depois de um pouco mais de um ano, estou voltando a postar. Tenho recebido diversos comentários diariamente sobre os artigos do blog e fico feliz em constatar que muitas pessoas tem conseguido aprender com o que escrevi. Agradeço a todos pelos elogios! Muito obrigado! O blog tem tido em média 200 visitas diárias, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=670&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>Depois de um pouco mais de um ano, estou voltando a postar. Tenho recebido diversos comentários diariamente sobre os artigos do blog e fico feliz em constatar que muitas pessoas tem conseguido aprender com o que escrevi. Agradeço a todos pelos elogios! Muito obrigado! O blog tem tido em média 200 visitas diárias, atingindo picos de quase 400 visitas! Ainda sobre os comentários, muitos leiores postam dúvidas, mas infelizmente não tenho tempo para respondê-las, sendo assim, acabo não aprovando tais comentários, apesar de ler todos. Quem tiver dúvidas, poste no <a href="www.guj.com.br" target="_blank">GUJ</a> que vai ter muita gente para ajudar.</p>
<p>Nesse um ano que passou me dediquei quase que exclusivamente ao meu trabalho, não tendo tempo para publicar nada. Escrevi uma apostila de introdução a desenvolvimento Web em Java e minha ideia era publicá-la aqui no blog, mas infelizmente não pude. A apostila, apesar de ser de minha propriedade intelectual, também tem como dono o governo brasileiro (sistema e-tec Brasil). Agora em 2012 pretendo voltar a postar sobre temas mais gerais ao invés de tutoriais muito específicos, pois como sou um pouco chato com os detalhes, quando eu começo a escrever um tutorial eu quero que ele fique o mais explicado possível e isso acaba tomando muito tempo.</p>
<p>No final do ano passado, um pouco antes do natal, comecei a resolver alguns desafios de programação do <a title="UVA" href="http://uva.onlinejudge.org/" target="_blank">UVA Online Judge</a> e acho que &#8220;viciei&#8221;. Já foram mais de 40 em poucos dias. Vejam minhas estatísticas <a href="http://uhunt.felix-halim.net/id/55158" target="_blank">aqui</a>. Por enquanto estou focado nos que tem solução ad hoc. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Nos próximos dias pretendo começar a escrever uma série de artigos sobre estruturas de dados, pois vou aproveitar as aulas que irei preparar para esse semestre (sou professor do IFSP) para a turma de graduação que darei aula. Estou lendo alguns livros e tenho percebido como eles são fracos em alguns pontos. Comprei <a href="http://pearson.com.br/produtos_detalhes.asp?id_p=0&amp;livro_cod=9788576058816&amp;pag_id=1&amp;area_pai=21" target="_blank">um</a> semana passada e me decepcionei com os códigos das autoras. O conteúdo que li até agora é razoável, mas apesar das autoras se proporem a fazer um trabalho detalhado em alguns pontos, acabam deixando um pouco a desejar, como por exemplo na seção de complexidade de algoritmos. Acho que quando a gente se propõe a escrever algum livro e vamos falar sobre algum assunto, ainda mais em um livro didático / livro texto, precisamos ser mais detalhistas e nos esforçarmos para dissecar o assunto de uma forma fácil de entender.</p>
<p>Outra obra que comprei no final do ano foi a <a href="http://www.amazon.com/Computer-Programming-Volumes-1-4A-Boxed/dp/0321751043/ref=sr_1_sc_1?ie=UTF8&amp;qid=1325886403&amp;sr=8-1-spell" target="_blank">The Art of Computer Programming</a>. Eu tinha vontade de ter esses livros já faz um bom tempo e agora deu para comprar, ainda mais que em 2011 a primeira metade do volume 4 (4A) foi finalizada. Comecei a leitura do volume 1 hoje. Tenho certeza que não irei me arrepender. Essa é uma obra para ser lida com muita calma. Sabiam que é considerada pela <a href="http://www.americanscientist.org/bookshelf/pub/100-or-so-books-that-shaped-a-century-of-science" target="_blank">American Scientist</a> uma das 20 obras científicas mais importantes do século passado? Vejam mais detalhes <a href="http://www-cs-staff.stanford.edu/~uno/taocp.html" target="_blank">aqui</a> e <a href="http://en.wikipedia.org/wiki/The_Art_of_Computer_Programming" target="_blank">aqui</a>.</p>
<p>Enfim pessoal, logo irei começar os artigos sobre estruturas de dados!</p>
<p>Grande abraço a todos!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/670/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/670/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/670/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/670/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/670/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/670/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/670/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/670/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=670&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2012/01/06/e-comeca-mais-um-ano/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>
	</item>
		<item>
		<title>Feliz Ano Novo!</title>
		<link>http://davidbuzatto.com.br/2010/12/31/feliz-ano-novo/</link>
		<comments>http://davidbuzatto.com.br/2010/12/31/feliz-ano-novo/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 22:58:38 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://davidbuzatto.com.br/?p=646</guid>
		<description><![CDATA[Caros leitores, Desejo a todos um feliz ano novo, cheio de realizações, saúde, paz e prosperidade! Ano que vem, assim que eu tiver um tempinho, voltarei a postar no Blog Obrigado por prestigiarem o Blog! Um grande abraço a todos!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=646&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Caros leitores,</p>
<p>Desejo a todos um feliz ano novo, cheio de realizações, saúde, paz e prosperidade! Ano que vem, assim que eu tiver um tempinho, voltarei a postar no Blog <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Obrigado por prestigiarem o Blog! Um grande abraço a todos!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/646/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/646/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/646/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/646/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/646/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/646/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/646/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/646/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=646&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/12/31/feliz-ano-novo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>
	</item>
		<item>
		<title>JasperReports e Ant: Automatizando a Compilação de Relatórios</title>
		<link>http://davidbuzatto.com.br/2010/11/23/jasperreports-e-ant-automatizando-a-compilacao-de-relatorios/</link>
		<comments>http://davidbuzatto.com.br/2010/11/23/jasperreports-e-ant-automatizando-a-compilacao-de-relatorios/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 14:35:40 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Relatórios]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[build.xml]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[relatórios]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://davidbuzatto.com.br/?p=637</guid>
		<description><![CDATA[Olá pessoal. Sempre quando começo um novo projeto que tenho que usar relatórios, eu procuro sempre automatizar o processo de compilação dos mesmos. Para quem não sabe, o NetBeans utiliza o Apache Ant (parecido com o make do C/C++) para executar o build do projeto, ou seja, é o Ant que faz a mágica de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=637&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Sempre quando começo um novo projeto que tenho que usar relatórios, eu procuro sempre automatizar o processo de compilação dos mesmos. Para quem não sabe, o NetBeans utiliza o <a title="Apache Ant" href="http://ant.apache.org/" target="_blank">Apache Ant</a> (parecido com o make do C/C++) para executar o build do projeto, ou seja, é o Ant que faz a mágica de compilar os arquivos .java, copiar determinados arquivos para algum diretório, criar o pacote de distribuição e assim por diante. Além do comportamento padrão do Ant para cada tipo de projeto, podemos inserir trechos de código no arquivo de build para que tarefas personalizadas possam ser executadas durante o processo de build.</p>
<p>Sendo assim, hoje vou ensinar como personalizar esse arquivo de build de forma a fazer com que sempre que nosso projeto for executado, sejam compilados os arquivos de código fonte dos relatórios (.jrxml), fazendo com que nosso projeto SEMPRE contenha a versão compilada que corresponde a última versão da definição dos relatórios. Com isso, evitamos ter que ficar compilando manualmente os relatórios a cada vez que alterarmos um arquivo.</p>
<p>Vou usar como base o projeto finalizado na <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> do tutorial sobre relatórios. <a title="Download do projeto da parte 4 do tutorial" href="http://www.4shared.com/file/ajA7qc6D/TutorialRelatorios_-_parte_4.html" target="_blank">Clique aqui</a> para fazer o download do projeto. Como nosso projeto é desktop, vou abordar com mais detalhes a personalização do arquivo de build para esse tipo de projeto, mas no final do tutorial eu vou postar o trecho de código para o arquivo de build de um projeto Web. Então vamos lá!</p>
<p>Primeiramente, abra o projeto no NetBeans. Ao abri-lo, verifique que por padrão a aba &#8220;Projects&#8221; tomará o foco. Ao lado desta aba, existe a aba &#8220;Files&#8221;. Nessa aba é mostrada a estrutura real do projeto, ou seja, a estrutura de diretórios e arquivos que ficam armazenada no seu computador, enquanto na aba &#8220;Projects&#8221; é mostrada uma estrutura abstrata do projeto que esconde os detalhes da estrutura real. Veja a Figura abaixo.</p>
<div id="attachment_639" class="wp-caption aligncenter" style="width: 401px"><a href="http://davidbuzatto.files.wordpress.com/2010/11/figura11.png"><img class="size-full wp-image-639" title="Figura 1" src="http://davidbuzatto.files.wordpress.com/2010/11/figura11.png?w=640" alt="Figura 1"   /></a><p class="wp-caption-text">Estrutura real do projeto</p></div>
<p>Note que destaquei dois arquivos na estrutura. O arquivo build-impl.xml é gerado automaticamente pela IDE, então mesmo que você o altere ela vai regerá-lo sempre. Sendo assim, <strong>nunca</strong> mexa nesse arquivo. Use-o para ver como o início do processo de build padrão funciona. O outro arquivo destacado, o build.xml, é o arquivo que podemos alterar para inserir nossas tarefas de build personalizadas. Durante o processo de build, o Ant copia os targets configurados no build-impl.xml para o build.xml, para então executar o arquivo de build.</p>
<p>Recomendo que vocês leiam todos os comentários que são criados dentro do build.xml. Neles vocês terão uma ideia de como o processo funciona. Notem que logo no início, são listados vários targets que podemos personalizar: -pre-init, -post-init, -pre-compile, etc. O nome de cada target é auto-explicativo, além é claro de ter o comentário explicando quanto eles são executados. Falei dos targets várias vezes, mas ainda não expliquei o que eles são. Um target é como se fosse um &#8220;passo&#8221; no processo de build. Você pode ter um ou vários passos durante o processo de build e cada passo pode depender de um ou vários passos que foram executados anteriormente. Por exemplo, um target que faz o empacotamento do projeto em um .jar, depende do target que faz a compilação dos arquivos .java.</p>
<p>No nosso arquivo de build, nós vamos inserir tarefas dentro do target &#8220;-post-compile&#8221;, ou seja, o target que é executado depois que os arquivos .java do projeto são compilados. Segue o código do build.xml comentado.</p>
<blockquote><p><span style="color:#ff9900;"><strong>build.xml</strong></span></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!-- Documentação (omitida) --&gt;
&lt;project name=&quot;TutorialRelatorios&quot; default=&quot;default&quot; basedir=&quot;.&quot;&gt;
    &lt;description&gt;Builds, tests, and runs the project TutorialRelatorios.&lt;/description&gt;
    &lt;import file=&quot;nbproject/build-impl.xml&quot;/&gt;
    &lt;!--

        Documentação (omitida)

    --&gt;

    &lt;!-- configurando o target -post-compile, que é executado depois
         da compilação dos arquivos .java do projeto--&gt;
    &lt;target name=&quot;-post-compile&quot;&gt;

        &lt;!-- Compilação das definições dos relatórios --&gt;
        &lt;!-- a tarefa &quot;echo&quot; do Ant mostra uma mensagem na saída --&gt;
        &lt;echo&gt;Iniciando compilação das definições de relatórios...&lt;/echo&gt;

        &lt;!-- Define o classpath usado para a compilação dos relatórios --&gt;

        &lt;!-- A tarefa &quot;path&quot; do Ant define um caminho com id de &quot;jrc.classpath&quot;
             que indica um conjunto de arquivos (fileset) que correspondem
             a todos os .jars (que serão usados na compilação) localizados no
             diretório ${build.dir}/../lib/JasperReports-3.7.5.

             Quando o build for executado, a propriedade ${build.dir} será
             substituida por C:\&lt;caminho&gt;\TutorialRelatorios\build,
             sendo assim estamos acessando o diretório
             C:\&lt;caminho&gt;\TutorialRelatorios\lib\JasperReports-3.7.5, que no nosso
             projeto armazena todos os .jars utilizados pelo JasperReports.

             Para entender o que está acontecendo, sempre verifique a estrutura
             do projeto (na aba File). --&gt;
        &lt;path id=&quot;jrc.classpath&quot;&gt;
            &lt;fileset dir=&quot;${build.dir}/../lib/JasperReports-3.7.5&quot;
                     includes=&quot;*.jar&quot;/&gt;
        &lt;/path&gt;

        &lt;!-- Definimos então uma tarefa customizada do Ant, chamada &quot;jrc&quot;,
             que é implementada na classe net.sf.jasperreports.ant.JRAntCompileTask,
             que por sua vez é usada para compilar arquivos .jrxml

             Note que é necessário configurar o classpath para o Ant
             saber onde a classe está definida, além das possíveis dependências
             que ela utiliza. O classpath vem da tarefa &quot;path&quot; que configuramos
             anteriormente, ou seja, todos os .jars do diretório
             C:\&lt;caminho&gt;\TutorialRelatorios\lib\JasperReports-3.7.5 --&gt;
        &lt;taskdef name=&quot;jrc&quot;
                 classname=&quot;net.sf.jasperreports.ant.JRAntCompileTask&quot;&gt;
            &lt;classpath refid=&quot;jrc.classpath&quot;/&gt;
        &lt;/taskdef&gt;

        &lt;!-- Quando testamos nossos relatórios, eles são compilados, gerando
             arquivos .jasper. O problema é as vezes nós alteramos o arquivo fonte
             e esquecemos de compilar. Sendo assim, caso existam definições de
             relatórios compiladas (que podem corresponder à versões antigas dos .jrxml's),
             a tarefa &quot;delete&quot; do Ant (definida abaixo) apaga todos os arquivos .jasper do diretório
             ${build.classes.dir} (C:\&lt;caminho&gt;\TutorialRelatorios\build\classes), ou seja,
             onde os arquivos .jasper são copiados durante o processo de build normal.
             --&gt;
        &lt;delete&gt;
            &lt;fileset dir=&quot;${build.classes.dir}&quot; includes=&quot;*.jasper&quot;/&gt;
        &lt;/delete&gt;

        &lt;!-- Por fim, compilamos as definições de relatórios (.jrxmls contidos no diretório
             &quot;relatorios&quot;) do nosso projeto, sendo que os arquivos compilados (.jasper)
             são gerados no diretório ${build.classes.dir}, ou seja, em
             C:\&lt;caminho&gt;\TutorialRelatorios\build\classes. Note que usamos a tarefa &quot;jrc&quot; que definimos
             acima e precisamos passar novamente o classpath definido na tarefa &quot;path&quot;. --&gt;
        &lt;jrc srcdir=&quot;relatorios&quot;
             destdir=&quot;${build.classes.dir}&quot;&gt;
            &lt;classpath
                refid=&quot;jrc.classpath&quot;/&gt;
            &lt;include
                name=&quot;*.jrxml&quot;/&gt;
        &lt;/jrc&gt;

        &lt;!-- Legal, terminou o processo, definições compiladas --&gt;
        &lt;echo&gt;Compilação das definições de relatórios finalizada!&lt;/echo&gt;

    &lt;/target&gt;

&lt;/project&gt;</pre></p>
<p>Sendo assim, copie o target listado acima para dentro do seu build.xml e salve o arquivo. Dê um &#8220;Clean and Build&#8221; no projeto (volte para a aba &#8220;Projects&#8221;, botão direito no projeto, &#8220;Clean and Build&#8221;), ou então clique no botão com um martelo e uma vassoura na barra de tarefas. Se tudo deu certo, a saída do NetBeans vai ser essa aqui:</p>
<pre>init:
deps-clean:
Updating property file: C:\&lt;caminho&gt;\TutorialRelatorios\build\built-clean.properties
Deleting directory C:\&lt;caminho&gt;\TutorialRelatorios\build
clean:
init:
deps-jar:
Created dir: C:\&lt;caminho&gt;\TutorialRelatorios\build
Updating property file: C:\&lt;caminho&gt;\TutorialRelatorios\build\built-jar.properties
Created dir: C:\&lt;caminho&gt;\TutorialRelatorios\build\classes
Created dir: C:\&lt;caminho&gt;\TutorialRelatorios\build\empty
Compiling 4 source files to C:\&lt;caminho&gt;\TutorialRelatorios\build\classes
Copying 5 files to C:\&lt;caminho&gt;\TutorialRelatorios\build\classes
Iniciando compilação das definições de relatórios...
Compiling 5 report design files.
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
log4j:WARN Please initialize the log4j system properly.
File : C:\&lt;caminho&gt;\TutorialRelatorios\relatorios\ClientesPorNome.jrxml ... OK.
File : C:\&lt;caminho&gt;\TutorialRelatorios\relatorios\ClientesCollectionDS.jrxml ... OK.
File : C:\&lt;caminho&gt;\TutorialRelatorios\relatorios\LocacoesPorClientes_Locacoes.jrxml ... OK.
File : C:\&lt;caminho&gt;\TutorialRelatorios\relatorios\LocacoesPorClientes.jrxml ... OK.
File : C:\&lt;caminho&gt;\TutorialRelatorios\relatorios\Clientes.jrxml ... OK.
Compilação das definições de relatórios finalizada!
compile:
Created dir: C:\&lt;caminho&gt;\TutorialRelatorios\dist
Copy libraries to C:\&lt;caminho&gt;\TutorialRelatorios\dist\lib.
Building jar: C:\&lt;caminho&gt;\TutorialRelatorios\dist\TutorialRelatorios.jar
To run this application from the command line without Ant, try:
java -jar "C:\&lt;caminho&gt;\TutorialRelatorios\dist\TutorialRelatorios.jar"
jar:
BUILD SUCCESSFUL (total time: 7 seconds)</pre>
<p>Ou seja, ao executar o build no projeto, os arquivos .java são compilados e então cada arquivo .jrxml é compilado, gerando um .jasper em &#8220;C:\&lt;caminho&gt;\TutorialRelatorios\build\classes&#8221;, que no caso é a raiz do pacote do nosso projeto. Note que desta forma, sempre teremos os arquivos .jasper que correspondem às ultimas versões das definições dos relatórios. A seguir está listado o target que faz o mesmo processo para o nosso projeto Web feito na <a title="Parte 5 do tutorial sobre Relatórios" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a> do tutorial. Caso queira, <a title="Download do projeto da parte 5 do tutorial" href="http://www.4shared.com/file/cUf4yw4F/TutorialRelatoriosWeb_-_parte_.html" target="_blank">clique aqui</a> para fazer o download do projeto.</p>
<blockquote><p><strong><span style="color:#ff9900;">build.xml</span> (projeto Web)</strong></p></blockquote>
<p><pre class="brush: xml;">&lt;target name=&quot;-pre-dist&quot;&gt;

    &lt;!-- Compilação das definições dos relatórios --&gt;
    &lt;echo&gt;Iniciando compilação das definições de relatórios...&lt;/echo&gt;

    &lt;!-- Define o classpath usado para a compilação dos relatórios --&gt;
    &lt;path id=&quot;jrc.classpath&quot;&gt;
        &lt;fileset dir=&quot;${build.classes.dir}/../lib&quot;
                 includes=&quot;*.jar&quot;/&gt;
    &lt;/path&gt;

    &lt;!-- Define a tarefa customizada do Ant que compila
         as definições dos relatórios--&gt;
    &lt;taskdef name=&quot;jrc&quot;
             classname=&quot;net.sf.jasperreports.ant.JRAntCompileTask&quot;&gt;
        &lt;classpath refid=&quot;jrc.classpath&quot;/&gt;
    &lt;/taskdef&gt;

    &lt;!-- Compila as definições .jrxml ==&gt; .jasper --&gt;
    &lt;jrc srcdir=&quot;relatorios&quot;
         destdir=&quot;${build.classes.dir}&quot;&gt;
        &lt;classpath
            refid=&quot;jrc.classpath&quot;/&gt;
        &lt;include
            name=&quot;*.jrxml&quot;/&gt;
    &lt;/jrc&gt;

    &lt;echo&gt;Compilação das definições de relatórios finalizada!&lt;/echo&gt;

&lt;/target&gt;</pre></p>
<p>Note que o target listado acima difere um pouco do primeiro que listei (tipo do target e parte do classpath). Como exercício, tente entender porque o código é diferente e se ele pode ficar igual ou mais parecido ao primeiro target que foi mostrado. Faça mudanças no arquivo para poder entender melhor o que acontece. Os scripts que mostrei são apenas uma sugestão. Se você quiser inserir outras tarefas do Ant no build do seu projeto, dê uma olhada no manual: <a title="Manual Ant" href="http://ant.apache.org/manual/index.html" target="_blank">http://ant.apache.org/manual/index.html</a>. Outro detalhe é que vocês conseguirão adaptar esse script para qualquer projeto, mesmo que a estrutura dele seja diferente dos projetos que criamos no tutorial.</p>
<p>Então é isso pessoal, espero que tenham gostado. No próximo tutorial vamos aprender os primeiros passos para trabalhar com a biblioteca JavaScript jQuery. Abraço!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/637/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/637/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/637/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=637&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/11/23/jasperreports-e-ant-automatizando-a-compilacao-de-relatorios/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/11/figura11.png" medium="image">
			<media:title type="html">Figura 1</media:title>
		</media:content>
	</item>
		<item>
		<title>JasperReports: Trabalhando com Relatórios em Java &#8211; Parte 5 (Relatórios na Web)</title>
		<link>http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/</link>
		<comments>http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 18:50:33 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Relatórios]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[relatório]]></category>
		<category><![CDATA[servlet]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://davidbuzatto.wordpress.com/?p=471</guid>
		<description><![CDATA[Parte 1 &#8211; Parte 2 &#8211; Parte 3 &#8211; Parte 4 &#8211; Parte 5 Olá a todos! Nesta quinta e última parte do nosso tutorial, iremos aprender a como usar os nossos relatórios em um projeto Web. Esse parte do tutorial vai ser rápida, pois já temos praticamente tudo o que precisamos. Primeiro gostaria de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=471&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <strong>Parte 5</strong></p>
<p>Olá a todos! Nesta quinta e última parte do nosso tutorial, iremos aprender a como usar os nossos relatórios em um projeto Web. Esse parte do tutorial vai ser rápida, pois já temos praticamente tudo o que precisamos. Primeiro gostaria de pedir para quem não está acompanhando o tutorial, que baixe o projeto finalizado na <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> <a title="Download do projeto da Parte 4 do turtorial" href="http://www.4shared.com/file/ajA7qc6D/TutorialRelatorios_-_parte_4.html" target="_blank">clicando aqui</a>. Iremos criar um novo projeto no NetBeans, só que agora do tipo Web e vamos configurá-lo com base no que já fizemos no nosso projeto original. Vamos lá então!</p>
<p>No NetBeans, vá em File -&gt; New Project. No assistente de criação de projetos, escolha &#8220;Java Web&#8221; na lista de categorias e na lista de tipos de projetos, escolha &#8220;Web Application&#8221;. Clique em &#8220;Next&#8221;. Em &#8220;Project Name&#8221; dê o nome do projeto. Eu sugiro &#8220;TutorialRelatoriosWeb&#8221; (sem as aspas). Em &#8220;Project Location&#8221; escolha onde o projeto vai ser salvo. Eu vou deixar na mesma pasta do projeto original. Marque a opção &#8220;Use Dedicated Folder for Storing Libraries&#8221; e deixe o valor padrão (.\lib). Se quiser, marque a opção &#8220;Set as Main Project&#8221;. Clique em &#8220;Next&#8221;.</p>
<p>No próximo passo, onde é configurado o servidor que a aplicação vai ser executada, eu vou deixar o Tomcat escolhido. Se vocês preferirem usar outro servidor, não tem problema, basta selecioná-lo na lista. Deixe desmarcada a opção &#8220;Use dedicated library folder for server JAR files&#8221;. Em &#8220;JavaEE version&#8221;, deixe escolhida a versão padrão, pois não precisamos nos preocupar com isso no nosso projeto de testes. No meu caso, ficou selecionado Java EE 5. Em &#8220;Context Path&#8221; deixe o valor sugerido. No meu caso, é &#8220;/TutorialRelatoriosWeb&#8221;. Como não vamos usar nenhum framework MVC, você já pode clicar em &#8220;Next&#8221;. Feito isso, o projeto será criado e será aberto no NetBeans.</p>
<p>Com o projeto criado, acesse suas propriedades clicando com botão direito na raiz do projeto e escolhendo a opção &#8220;Properties&#8221;, que é a última da lista. Em &#8220;Categories&#8221; procure pelo item &#8220;Run&#8221; e selecione-o. Desmarque a opção &#8220;Deploy on Save&#8221; para evitar que seja feito um deploy a cada vez que salvarmos algo do nosso projeto. Já que estamos aqui, vamos aproveitar para configurar as bibiliotecas. Não vou colocar as figuras desse processo, pois já foi explicado nas primeiras partes do tutorial.</p>
<p>Selecione o item &#8220;Libraries&#8221; na lista de categorias e clique no botão &#8220;Add Library&#8221;. Primeiro vamos importar o driver do MySQL que vamos utilizar. Na janela que foi aberta, clique no botão &#8220;Import&#8221;. Procure pela biblioteca &#8220;MySQL JDBC Driver&#8221;, selecione-a e clique no botão &#8220;Import Library&#8221;. A biblioteca vai ser importada e aparecerá na janela anterior, mas ela ainda não foi inserida no projeto. Antes de a inserirmos, vamos criar a biblioteca do JasperReports. Para isso, clique no botão &#8220;Create&#8230;&#8221;. Em &#8220;Library Name&#8221; entre com o valor &#8220;JasperReports-3.7.5&#8243; (sem as aspas) e clique em &#8220;OK&#8221;. Note que eu vou manter a versão do JasperReports utilizado nas partes anteriores do tutorial, sendo assim sua versão pode variar dependendo de quando você estiver seguindo esse tutorial, visto que novas versões do JasperReports são lançadas frequentemente. Se a versão que você estiver usando for mais nova, vamos dizer, 3.7.6, defina um nome da biblioteca que reflita a versão utilizada, ou seja &#8220;JasperReports-3.7.6&#8243;.</p>
<p>Feito isso, a janela &#8220;Customize Library&#8221; será exibida. Clique no botão &#8220;Add JAR/Folder&#8221;. Como já fizemos isso uma vez nas partes anteriores do tutorial, o projeto original já tem essa biblioteca configurada com os JARs necessários. Então vamos usá-los. Procure pela pasta do projeto original (TutorialRelatorios). Dentro dela, entre na pasta &#8220;lib&#8221;. Dentro da pasta &#8220;lib&#8221;, existirá uma pasta chamada &#8220;JasperReports-3.7.5&#8243;. O número da versão pode variar de acordo com a sua versão. Entre nela, selecione todos os JARs e clique no botão &#8220;Add JAR/Folder&#8221;. O NetBeans vai perguntar se você quer criar um diretório com o nome da biblioteca dentro da pasta &#8220;lib&#8221; do projeto atual (TutorialRelatoriosWeb). Diga que sim e os JARs serão listados na janela &#8220;Customize Library&#8221;. Clique em OK.</p>
<p>Novamente a janela &#8220;Add Library&#8221; será exibida, agora contendo a também a biblioteca do JasperReports que acabamos de configurar. Selecione tanto a biblioteca do JasperReports quanto a biblioteca do MySQL e clique no botão &#8220;Add Library&#8221;. Agora as bibliotecas serão adicionadas no projeto.</p>
<p>Ainda na janela de propriedades, procure a categoria &#8220;Sources&#8221; (primeira) e selecione-a. Vamos criar agora o diretório onde guardaremos os nossos fontes do relatório. Na tabela &#8220;Source Package Folders&#8221;, clique no botão &#8220;Add Folder&#8230;&#8221;. Serão exibidas os diretórios contidos no projeto. Crie então uma nova pasta, chamada &#8220;relatorios&#8221; (sem acentos e sem aspas), selecione-a e clique em &#8220;Open&#8221;. A pasta será referenciada na tabela. Clique duas vezes na célula correspondente à coluna &#8220;Label&#8221; da pasta, preencha com &#8220;Relatórios&#8221; (sem as aspas) e tecle &lt;ENTER&gt; para trocar o &#8220;Label&#8221; da pasta. Esse &#8220;Label&#8221; vai ser utilizado para mostrar a pasta de relatórios na árvore do projeto.</p>
<p>Estamos quase lá. Por fim, ainda na janela de propriedades, selecione a categoria &#8220;Packaging&#8221;, dentro da categoria &#8220;Build&#8221;. Em &#8220;Exclude From WAR File&#8221;, adicione uma vírgula e o valor &#8220;**./*.jrxml&#8221; (sem as aspas). Isso fará com que os nossos arquivos fonte de relatórios não sejam empacotados no arquivo WAR. O valor final do campo deve ficar assim: &#8220;**/*.java,**/*.form, **/*.jrxml&#8221; (sem as aspas). Pronto! Clique em OK na janela de propriedades e aguarde o NetBeans escanear as novas configurações do projeto.</p>
<p>Agora, abra o projeto anterior, vá na pasta de &#8220;Relatórios&#8221; dele, copie o arquivo &#8220;ClientesPorNome.jrxml&#8221; e cole na pasta &#8220;Relatórios&#8221; do novo projeto. Ainda não feche o projeto anterior. No projeto atual, abra o relatório que foi copiado e faça um Preview dele para ver se está tudo ok. Lembre-se que o datasource correto (Sakila &#8211; JDBC) tem que estar selecionado lá na barra de ferramentas do NetBeans. Se o relatório for renderizado e os dados aparecerem é porque está tudo ok.</p>
<p>Até agora nenhuma novidade. Criamos e configuramos o novo projeto e copiamos e testamos o arquivo de relatório que já fizemos para o novo projeto. Agora vamos às novidades.</p>
<p>Vamos criar um Servlet que vai ser responsável em pegar os possíveis dados do request que serão usados como parâmetros para os relatórios e invocar o JasperReports para criar o relatório. O funcionamento é parecido com o que fizemos no nosso programa desktop, entretanto agora não iremos mais criar um JFrame para exibir os relatórios, pois estamos usando um navegador não é mesmo? O que o nosso Servlet vai fazer é criar diretamente um arquivo .pdf do relatório e mandar exibir no navegador &#8211; caso haja algum plugin para leitura de PDF instalado &#8211; ou então o navegador vai sugerir que você faça o download do arquivo gerado.</p>
<p>Em &#8220;Source Packages&#8221;, crie três pacotes: &#8220;tutorialrelatoriosweb.jdbc&#8221;, &#8220;tutorialrelatoriosweb.servlets&#8221; e &#8220;tutorialrelatoriosweb.util&#8221; (todos sem as aspas). Vá no projeto anterior, no pacote &#8220;tutorialrelatorios.jdbc&#8221;, copie a classe ConnectionFactory e cole no pacote &#8220;tutorialrelatoriosweb.jdbc&#8221; do novo projeto. Se quiser, feche o projeto anterior. Agora no novo projeto, vá na pasta &#8220;tutorialrelatoriosweb.util&#8221; e crie uma classe com o nome de &#8220;ReportUtils&#8221; (sem as aspas). Ainda não vamos implementar nada nela. Feito isso, clique com o botão direito no pacote &#8220;tutorialrelatoriosweb.servlets&#8221;, vá em New -&gt; Servlet. Se a opção Servlet não estiver sendo exibida, selecione &#8220;Other&#8221; e em &#8220;Categories&#8221; selecione &#8220;Web&#8221; e em &#8220;File Types&#8221; escolha &#8220;Servlet&#8221; e clique em &#8220;Next&#8221;.</p>
<p>O assistente para criar um novo Servlet será exibido. Em &#8220;Class Name&#8221; preencha com &#8220;ReportServlet&#8221; (sem as aspas) e clique em &#8220;Next&#8221;. Tanto &#8220;Servlet Name&#8221; quanto &#8220;URL Pattern&#8221; vão ser deixados da forma que o NetBeans sugeriu, ou seja, &#8220;ReportServlet&#8221; e &#8220;/ReportServlet&#8221; respectivamente. Clique em &#8220;Finish&#8221;.</p>
<p>O NetBeans vai gerar por padrão uma implementação padrão do método processRequest(&#8230;). Faça com que o seu fique assim:</p>
<p><pre class="brush: java;">protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    OutputStream out = null;

    // aqui nós geramos o relatório...

    if ( out != null ) {
        out.close();
    }

}</pre></p>
<p>Note que ainda não implementamos o método processRequest(&#8230;). Da mesma forma que fizemos no projeto anterior, vamos agora criar um método utilitário na classe ReportUtils que vai ser responsável em gerar o relatório. Segue a implementação comentada da classe ReportUtils.</p>
<blockquote><p><strong><span style="color:#ff9900;">tutorialrelatoriosweb.util.</span>ReportUtils.java</strong></p></blockquote>
<p><pre class="brush: java;">package tutorialrelatoriosweb.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;

/**
 * Classe com métodos utilitários para gerar relatórios.
 *
 * @author David Buzatto
 */
public class ReportUtils {

    /**
     * Gera o relatório em PDF.
     *
     * @param inputStream InputStream que contém o relatório.
     * @param parametros Parâmetros utilizados pelo relatório.
     * @param conexao Conexão utilizada para a execução da query.
     * @param response HttpServletResponse que será usado como base para
     * gerar o relatório.
     * @return O OutputStream do HttpServletResponse passado.
     * @throws JRException Caso ocorra algum problema na geração do relatório.
     * @throws IOException Caso ocorra algum problema na obtenção do
     * OutputStream.
     */
    public static OutputStream createPDFReport(
            InputStream inputStream,
            Map&lt;String, Object&gt; parametros,
            Connection conexao,
            HttpServletResponse response ) throws JRException, IOException {

        // configura o content type do response
        response.setContentType( &quot;application/pdf&quot; );

        // obtém o OutputStream para escrever o relatório
        OutputStream out = response.getOutputStream();

        /*
         * Cria um JasperPrint, que é a versão preenchida do relatório,
         * usando uma conexão.
         */
        JasperPrint jasperPrint = JasperFillManager.fillReport(
                inputStream, parametros, conexao );

        // Exporta em PDF, escrevendo os dados no output stream do response.
        JRExporter exporter = new JRPdfExporter();
        exporter.setParameter( JRExporterParameter.JASPER_PRINT,
                jasperPrint );
        exporter.setParameter( JRExporterParameter.OUTPUT_STREAM,
                out );

        // gera o relatório
        exporter.exportReport();

        // retorna o OutputStream
        return out;

    }

}</pre></p>
<p>Como vocês podem perceber, o método createPDFReport(&#8230;) da classe ReportUtils gera um relatório em PDF e o escreve no OutputStream do response do Servlet. Caso vocês queiram outros tipos de exportação, basta mudar o tipo do exportador. <a title="Documentação da Interface JRExporter" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRExporter.html" target="_blank">Clicando aqui</a>, vocês podem ver a documentação da interface JRExporter e de todas as classes que a implementam. Note que ao mudar o exportador, você também precisa alterar o content type do response para refletir o tipo de arquivo gerado.</p>
<p>Vamos agora atualizar o nosso Servlet. O método processRequest(&#8230;) vai ficar assim:</p>
<p><pre class="brush: java;">protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    OutputStream out = null;

    // obtém o relatório compilado
    InputStream inputStream = getClass().getResourceAsStream( &quot;/ClientesPorNome.jasper&quot; );

    // preenche o mapa de parâmetros
    Map&lt;String, Object&gt; parametros = new HashMap&lt;String, Object&gt;();
    parametros.put( &quot;primeiroNome&quot;, &quot;D%&quot; );

    try {

        // gera o relatório e atribui o OutputStream gerado
        out = ReportUtils.createPDFReport( inputStream, parametros,
                ConnectionFactory.getSakilaConnection(), response );

    } catch ( SQLException exc ) {
        exc.printStackTrace();
    } catch ( JRException exc ) {
        exc.printStackTrace();
    } finally {

        // se não aconteceu nenhum problema, fecha o output stream
        if ( out != null ) {
            out.close();
        }

    }

}</pre></p>
<p>Com isso feito, rode a aplicação e aponte o navegador para o endereço &#8220;http://localhost:8084/TutorialRelatoriosWeb/ReportServlet&#8221; (sem as aspas). Por padrão o Tomcat usado em desenvolvimento no NetBeans roda na porta 8084. Certifque-se que o seu está rodando nesta porta e se não estiver, use a porta correta. Se você seguiu corretamente o tutorial até aqui, será gerado então um .pdf com todos os clientes que tenham o primeiro nome iniciando com a letra &#8220;D&#8221; (veja o parâmetro &#8220;primeiroNome&#8221; passado para o relatório).</p>
<p>Note que agora, para passar parâmetros para o relatório, basta você obter os parâmetros pelo request e então adicionar os parâmetros desejados no mapa de parâmetros do relatório. Se quiser outros tipos de exportação, por exemplo, para Excel, basta criar um novo método na classe ReportUtils, que configura o content type apropriado (&#8220;application/ms-excel&#8221;) e o exportador necessário (JRXlsExporter ou JRXlsxExporter). Tanto a passagem de parâmetros quanto a geração de outros tipos de arquivos ficam como exercício para vocês. O Servlet ReportServlet pode ser generalizado também, permitindo que o nome do arquivo do relatório a ser gerao seja passado via request <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Com isso terminamos nosso tutorial sobre relatórios em Java! Espero que tenham gostado! Para baixar o projeto criado nesta parte, <a title="Download do projeto da parte 5 do tutorial" href="http://www.4shared.com/file/cUf4yw4F/TutorialRelatoriosWeb_-_parte_.html" target="_blank">clique aqui</a>. Nos próximos tutoriais iremos aprender a usar a biblioteca JavaScript jQuery, que é extremamente útil e facilita muito a nossa vida.</p>
<p>Então é isso pessoal! Grande abraço a todos! Até a próxima <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <strong>Parte 5</strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/471/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/471/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/471/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/471/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/471/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/471/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/471/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/471/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=471&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>
	</item>
		<item>
		<title>JasperReports: Trabalhando com Relatórios em Java &#8211; Parte 4 (Diferentes tipos de Fontes de Dados &#8211; Datasources)</title>
		<link>http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/</link>
		<comments>http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 14:30:56 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Relatórios]]></category>
		<category><![CDATA[data source]]></category>
		<category><![CDATA[datasource]]></category>
		<category><![CDATA[fontes de dados]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[relatório]]></category>

		<guid isPermaLink="false">http://davidbuzatto.wordpress.com/?p=468</guid>
		<description><![CDATA[Parte 1 &#8211; Parte 2 &#8211; Parte 3 &#8211; Parte 4 &#8211; Parte 5 Olá a todos! Finalmente, depois de um bom tempo sem postar, vamos à quarta parte do tutorial sobre relatórios! Nesta parte iremos aprender a usar outros tipos de datasources para obtermos os dados que serão apresentados nos nossos relatórios. Como de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=468&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <strong>Parte 4</strong> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<p>Olá a todos! Finalmente, depois de um bom tempo sem postar, vamos à quarta parte do tutorial sobre relatórios! Nesta parte iremos aprender a usar outros tipos de datasources para obtermos os dados que serão apresentados nos nossos relatórios. Como de costume, vou explicar como fazer para utilizar a funcionalidade, permitindo que vocês consigam caminhar sozinhos posteriormente.</p>
<p>Nas três partes anteriores, a nossa fonte de dados era uma conexão JDBC que era usada para executar uma query SQL. A partir do resultado da query, o JasperReports preenchia o relatório para nós. Imagine agora a seguinte situação: Eu tenho uma lista de objetos do tipo &#8220;Cliente&#8221; e quero exibir essa lista de clientes em um relatório. Note que eu já tenho a lista, que foi obtida de alguma forma, ou seja, usando um DAO, ou executando uma query pelo Hibernate.</p>
<p>Para conseguir fazer isso, utilizamos outros tipos de datasources. Se você está seguindo o tutorial desde o início, seu projeto do NetBeans deve estar preparado para iniciarmos. Caso não esteja seguindo, faça o download do projeto <a title="Download Parte 3 Tutorial" href="http://www.4shared.com/account/file/ryZOwvOp/TutorialRelatorios_-_parte_3.html" target="_blank">clicando aqui</a>. Abra o projeto, e procure pela classe &#8220;ReportUtils&#8221; no pacote &#8220;tutorialrelatorios.util&#8221;. O código dela deve estar assim:</p>
<blockquote><p><strong><span style="color:#ff9900;">tutorialrelatorios.util.</span>ReportUtils.java</strong></p></blockquote>
<p><pre class="brush: java;">package tutorialrelatorios.util;

import java.awt.BorderLayout;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Map;
import javax.swing.JFrame;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.swing.JRViewer;

/**
 * Classe com métodos utilitários para executar e abrir relatórios.
 *
 * @author David Buzatto
 */
public class ReportUtils {

    /**
     * Abre um relatório usando uma conexão como datasource.
     *
     * @param titulo Título usado na janela do relatório.
     * @param inputStream InputStream que contém o relatório.
     * @param parametros Parâmetros utilizados pelo relatório.
     * @param conexao Conexão utilizada para a execução da query.
     * @throws JRException Caso ocorra algum problema na execução do relatório
     */
    public static void openReport(
            String titulo,
            InputStream inputStream,
            Map parametros,
            Connection conexao ) throws JRException {

        /*
         * Cria um JasperPrint, que é a versão preenchida do relatório,
         * usando uma conexão.
         */
        JasperPrint print = JasperFillManager.fillReport(
                inputStream, parametros, conexao );

        // abre o JasperPrint em um JFrame
        viewReportFrame( titulo, print );

    }

    /**
     * Abre um relatório usando um datasource genérico.
     *
     * @param titulo Título usado na janela do relatório.
     * @param inputStream InputStream que contém o relatório.
     * @param parametros Parâmetros utilizados pelo relatório.
     * @param dataSource Datasource a ser utilizado pelo relatório.
     * @throws JRException Caso ocorra algum problema na execução do relatório
     */
    public static void openReport(
            String titulo,
            InputStream inputStream,
            Map parametros,
            JRDataSource dataSource ) throws JRException {

        /*
         * Cria um JasperPrint, que é a versão preenchida do relatório,
         * usando um datasource genérico.
         */
        JasperPrint print = JasperFillManager.fillReport(
                inputStream, parametros, dataSource );

        // abre o JasperPrint em um JFrame
        viewReportFrame( titulo, print );

    }

    /**
     * Cria um JFrame para exibir o relatório representado pelo JasperPrint.
     *
     * @param titulo Título do JFrame.
     * @param print JasperPrint do relatório.
     */
    private static void viewReportFrame( String titulo, JasperPrint print ) {

        /*
         * Cria um JRViewer para exibir o relatório.
         * Um JRViewer é uma JPanel.
         */
        JRViewer viewer = new JRViewer( print );

        // cria o JFrame
        JFrame frameRelatorio = new JFrame( titulo );

        // adiciona o JRViewer no JFrame
        frameRelatorio.add( viewer, BorderLayout.CENTER );

        // configura o tamanho padrão do JFrame
        frameRelatorio.setSize( 500, 500 );

        // maximiza o JFrame para ocupar a tela toda.
        frameRelatorio.setExtendedState( JFrame.MAXIMIZED_BOTH );

        // configura a operação padrão quando o JFrame for fechado.
        frameRelatorio.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );

        // exibe o JFrame
        frameRelatorio.setVisible( true );

    }

}</pre></p>
<p>Note que nessa classe existem dois métodos chamados &#8220;openReport(&#8230;)&#8221;. O primeiro deles é o que utilizamos até agora, que recebe uma String que vai ser usada como título do JFrame utilizado como container do relatório, um InputStream que vai ser usado para obtermos o arquivo .jasper, um Map que contém os parâmetros passados para o relatório e, por fim, uma Connection para a base de dados que usamos na query do relatório. Note que o segundo método &#8220;openReport(&#8230;)&#8221; tem praticamente a mesma assinatura do primeiro, mudando apenas o último parâmetro, que nessa versão do método é um JRDataSource. A implementação do método é igual ao outro, com a diferença de ser passado o JRDataSource para o JasperFillManager.fillReport(&#8230;) ao invés da Connection.</p>
<p>O JRDataSource é uma interface que define o contrato que os datasources devem seguir para que o JasperReports possa usar os dados contidos neles dentro do relatório. A documentação da interface JRDataSource pode ser vista <a title="Documentação da interface JRDataSource" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDataSource.html" target="_blank">clicando aqui</a>. Ao analisar a documentação, vocês vão ver que existem diversas implementações da interface JRDataSource. Nós vamos focar em duas:</p>
<ul>
<li><strong>JRBeanCollectionDataSource</strong>: Utilizada para usar coleções como fonte de dados, ou seja, qualquer classe que implemente &#8211; ou interface que estenda &#8211; a interface java.util.Collection. Por exemplo, um ArrayList, que implementa a interface List que por sua vez estende a interface Collection. A documentação deste tipo de datasource pode ser vista <a title="Documentação JRBeanCollectionDataSource" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JRBeanCollectionDataSource.html" target="_blank">clicando aqui</a>;</li>
<li><strong>JRBeanArrayCollectionDataSource</strong>: Utilizado para usar arrays de objetos como fonte de dados. A documentação deste tipo de datasource pode ser vista <a title="Documentação JRBeanArrayDataSource" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/data/JRBeanArrayDataSource.html" target="_blank">clicando aqui</a>.</li>
</ul>
<p>Legal não é? Então, além da conexão JDBC, nós podemos utilizar vários outros tipos de datasources. Vou o primeiro deles, e depois a utilização do segundo vai ficar como exercício. Não vou explicar cada um dos tipos existentes, pois o funcionamento deles é sempre muito parecido. Se você precisar de outro tipo de datasource, basta ler a documentação.</p>
<p>A utilização dos datasources não é complicada, bastando você criar um objeto do tipo do datasource desejado e passar o parâmetro que ele espera, entretanto precisamos alterar uma configuração no iReport para indicar ao compilador onde estão as classes que vamos utilizar para instanciar os objetos e enviar no datasource. Antes de fazer isso, vamos criar uma classe no nosso projeto, sendo que essa classe será utilizada como a nossa entidade. Nós vamos instanciar objetos dessa classe manualmente, mas em um caso real, esses objetos virão de algum outro lugar, como uma query do Hibernate como eu já mencionei. Vamos lá então!</p>
<p>Clique com o botão direito no pacote &#8220;tutorialrelatorios&#8221;, escolha New -&gt; Java Package. Se esta opção não estiver sendo exibida, clique em Other, escolha a categoria Java e em File Type escolha Java Package. Com o assistente aberto, insira &#8220;tutorialrelatorios.entidades&#8221; (sem as aspas) em Package Name e clique em Finish. O pacote será criado. Clique com o botão direito neste pacote, escolha New -&gt; Java Class. Preencha o campo Class Name com &#8220;Cliente&#8221; (sem as aspas) e clique em Finish. A classe será gerada e será aberta no editor. Crie os campos id (privado, Long), nome (privado, String) e sobrenome (privado, String). Com os campos criados, gere os gets e os sets. Segue o código da classe Cliente.</p>
<blockquote><p><strong><span style="color:#ff9900;">tutorialrelatorios.entidades.</span>Cliente.java</strong></p></blockquote>
<p><pre class="brush: java;">package tutorialrelatorios.entidades;

/**
 * Representa um Cliente.
 *
 * @author David Buzatto
 */
public class Cliente {

    private Long id;
    private String nome;
    private String sobrenome;

    public Long getId() {
        return id;
    }

    public void setId( Long id ) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome( String nome ) {
        this.nome = nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome( String sobrenome ) {
        this.sobrenome = sobrenome;
    }

}</pre></p>
<p>Agora, antes de partirmos para o nosso relatório, precisamos configurar o iReport para enxergar as classes do nosso projeto, permitindo assim que possamos utilizar nossas entidades no relatório. Antes disso, dê um build no projeto (botão direito no projeto, Build, ou Clean and Build), para que o diretório de build seja gerado, ou seja, o diretório que contém os arquivos compilados no nosso projeto. Com o build feito, entre no menu Tools e vá em Options. Clique no botão do iReport e procure pela guia Classpath. Com a guia aberta, clique no botão Add Folder. Ao clicar no botão, será exibido um diálogo para você procurar a pasta desejada. Nós precisamos encontrar a pasta build/classes do nosso projeto. No meu caso, eu estou salvando o projeto em &#8220;C:\Users\David\Documents\Blog\tutoriais&#8221;, então o build/classes está localizado em &#8220;C:\Users\David\Documents\Blog\tutoriais\TutorialRelatorios\build\classes&#8221;. Procure então pelo o seu build/classes, selecione o diretório e clique em Open. O editor de opções da IDE deve ficar assim:</p>
<div id="attachment_604" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/11/figura1.png"><img class="size-full wp-image-604" title="Figura 1" src="http://davidbuzatto.files.wordpress.com/2010/11/figura1.png?w=640&#038;h=544" alt="Figura 1" width="640" height="544" /></a><p class="wp-caption-text">Editando o Classpath do iReport</p></div>
<p>Com isso feito, o iReport vai conseguir enxergar as classes do nosso projeto, além de permitir que objetos de nossas classes possam ser utilizadas dentro do relatório. Vamos criar nosso relatório então? Clique então com o botão direito no &lt;default package&gt; da nossa pasta de definições de relatórios, escolha New -&gt; Empty Report. Como já temos um relatório chamado Clientes (que usa uma query lembram?), vamos dar o nome nesse relatório de ClientesCollectionDS, pois vamos utilizar o datasource do tipo JRBeanCollectionDataSource. Assim que clicar em Finish no assistente de criação de relatórios, o arquivo ClientesCollectionDS.jrxml será gerado e será aberto no editor. Para simplificar, remova todas as bandas, exceto a Title, a Column Header e a Detail. Na banda Title crie um campo de texto estático e defina o título do relatório. O meu ficou assim:</p>
<div id="attachment_605" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/11/figura2.png"><img class="size-full wp-image-605" title="Figura 2" src="http://davidbuzatto.files.wordpress.com/2010/11/figura2.png?w=640&#038;h=462" alt="Figura 2" width="640" height="462" /></a><p class="wp-caption-text">Layout Inicial do Relatório de Clientes usando Collection DS</p></div>
<p>Agora chegou a parte onde vamos obter os atributos da nossa entidade Cliente. Clique no botão usado para editar a query do relatório e acesse a guia &#8220;JavaBean Datasource&#8221;. Note que <strong>não vamos criar uma query</strong>. Com a aba aberta, preencha o campo &#8220;Class name&#8221; com  &#8220;tutorialrelatorios.entidades.Cliente&#8221; (sem as aspas) e clique no botão Read Attributes. Vão ser lidos 4 atributos: class, id, nome e sobrenome. Selecione todos, exceto o class e clique em  &#8220;Add selected field(s)&#8221;. Ao fazer isso, os campos serão inseridos na tabela de campos do editor. Veja a Figura abaixo.</p>
<div id="attachment_606" class="wp-caption aligncenter" style="width: 471px"><a href="http://davidbuzatto.files.wordpress.com/2010/11/figura3.png"><img class="size-full wp-image-606" title="Figura 3" src="http://davidbuzatto.files.wordpress.com/2010/11/figura3.png?w=640" alt="Figura 3"   /></a><p class="wp-caption-text">Carregando Campos de Uma Classe</p></div>
<p>Perceba que você precisa inserir o nome completo da classe (pacote + nome da classe) para que o iReport encontre a classe e a possa utilizar no relatório. Com isso feito, clique em OK. Os campos serão criados no Report Inspector da mesma forma que seriam criados caso estivéssemos usando uma query tradicional. Agora que os campos estão criados, basta vocês montarem o relatório, arrastando os campos para a banda Detail e editando o título de cada um deles. O meu ficou assim:</p>
<div id="attachment_608" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/11/figura4.png"><img class="size-full wp-image-608" title="Figura 4" src="http://davidbuzatto.files.wordpress.com/2010/11/figura4.png?w=640&#038;h=366" alt="Figura 4" width="640" height="366" /></a><p class="wp-caption-text">Layout Final do Relatório de Clientes usando Collection DS</p></div>
<p>Note que se vocês tentarem dar um &#8220;Preview&#8221; no relatório, vocês serão avisados que o relatório não contém páginas, justamente porque não existem dados para serem exibidos. É possível criar um datasource para ser usado no preview do relatório, mas isso eu vou deixar como exercício para vocês caso vocês queiram descobrir como faz <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Compilem o relatório e vamos agora modificar o método main da classe Main para chamar o relatório criado, passando os dados para o relatório. Abra a classe Main do projeto e copiem o método abrirRelatorioClientes. Mudem o nome do método copiado para abrirRelatorioClientesDS. Agora, como exercício antes de ver o código pronto, tentem chamar o novo relatório, criando um JRBeanCollectionDataSource e passando para o método openReport. Conseguiram? Espero que sim! Segue o código completo da classe Main.</p>
<blockquote><p><strong><span style="color:#ff9900;">tutorialrelatorios.</span>Main.java</strong></p></blockquote>
<p><pre class="brush: java;">package tutorialrelatorios;

import java.io.InputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import tutorialrelatorios.entidades.Cliente;
import tutorialrelatorios.jdbc.ConnectionFactory;
import tutorialrelatorios.util.ReportUtils;

/**
 * Ponto de entrada do projeto.
 *
 * @author David Buzatto
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().abrirRelatorioClientesDS();
    }

    public void abrirRelatorioClientes() {

        InputStream inputStream = getClass().getResourceAsStream( &quot;/LocacoesPorClientes.jasper&quot; );

        Map parametros = new HashMap();
        parametros.put( &quot;nomeCliente&quot;, &quot;F%&quot; );

        try {

            ReportUtils.openReport( &quot;Locações por Clientes&quot;, inputStream, parametros,
                    ConnectionFactory.getSakilaConnection() );

        } catch ( SQLException exc ) {
            exc.printStackTrace();
        } catch ( JRException exc ) {
            exc.printStackTrace();
        }

    }

    public void abrirRelatorioClientesDS() {

        InputStream inputStream = getClass().getResourceAsStream( &quot;/ClientesCollectionDS.jasper&quot; );

        Map parametros = new HashMap();

        // criando os dados que serão passados ao datasource
        List dados = new ArrayList();

        for ( long i = 1; i &lt;= 50; i++ ) {
            Cliente c = new Cliente();
            c.setId( i );
            c.setNome( &quot;Nome Cliente &quot; + i );
            c.setSobrenome( &quot;Sobrenome Cliente &quot; + i );
            dados.add( c );
        }

        // criando o datasource com os dados criados
        JRDataSource ds = new JRBeanCollectionDataSource( dados );

        try {

            // passando o datasource para o método de criação e exibição do relatório
            ReportUtils.openReport( &quot;Clientes - Bean Collection Data Source&quot;, inputStream, parametros,
                    ds );

        } catch ( JRException exc ) {
            exc.printStackTrace();
        }

    }

}</pre></p>
<p>Ao executar a classe Main, o relatório será exibido. O meu ficou assim:</p>
<div id="attachment_609" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/11/figura5.png"><img class="size-full wp-image-609" title="Figura 5" src="http://davidbuzatto.files.wordpress.com/2010/11/figura5.png?w=640&#038;h=386" alt="Figura 5" width="640" height="386" /></a><p class="wp-caption-text">Exibição Final do Relatório Criado</p></div>
<p>Como exercício, reaproveitem o método criado para utilizar um JRBeanArrayDataSource. Lembrem-se que um datasource deste tipo espera um array, não uma coleção.</p>
<p>Com isso finalizamos a quarta parte do tutorial! O projeto com o estado atual do nosso tutorial pode ser baixado <a title="Download projeto parte 4 tutorial" href="http://www.4shared.com/file/ajA7qc6D/TutorialRelatorios_-_parte_4.html" target="_blank">clicando-se aqui.</a> Na próxima parte do tuorial, iremos aprender como utilizar os relatórios em páginas Web, finalizando então o básico que vocês devem saber para poder trabalhar com relatórios. Até mais! Grande abraço!</p>
<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <strong>Parte 4</strong> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/468/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/468/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/468/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/468/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/468/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/468/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/468/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/468/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=468&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/11/figura1.png" medium="image">
			<media:title type="html">Figura 1</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/11/figura2.png" medium="image">
			<media:title type="html">Figura 2</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/11/figura3.png" medium="image">
			<media:title type="html">Figura 3</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/11/figura4.png" medium="image">
			<media:title type="html">Figura 4</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/11/figura5.png" medium="image">
			<media:title type="html">Figura 5</media:title>
		</media:content>
	</item>
		<item>
		<title>Novo Endereço do Blog</title>
		<link>http://davidbuzatto.com.br/2010/10/28/novo-endereco-do-blog/</link>
		<comments>http://davidbuzatto.com.br/2010/10/28/novo-endereco-do-blog/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 19:18:59 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Geral]]></category>

		<guid isPermaLink="false">http://davidbuzatto.com.br/?p=597</guid>
		<description><![CDATA[Olá pessoal, tudo jóia? Estou um pouco sumido ultimamente, mas logo logo eu postarei as duas últimas partes do tutorial sobre relatórios. Hoje estou escrevendo para lhes informar que agora, além do endereço http://davidbuzatto.wordpress.com, vocês podem acessar o blog também pelo endereço http://davidbuzatto.com.br! Legal não é? Decidi registrar um domínio, visto que o blog está [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=597&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal, tudo jóia? Estou um pouco sumido ultimamente, mas logo logo eu postarei as duas últimas partes do tutorial sobre relatórios. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Hoje estou escrevendo para lhes informar que agora, além do endereço <a title="Endereço do blog" href="http://davidbuzatto.wordpress.com" target="_blank">http://davidbuzatto.wordpress.com</a>, vocês podem acessar o blog também pelo endereço <strong><a title="Novo endereço do Blog" href="http://davidbuzatto.com.br" target="_blank">http://davidbuzatto.com.br</a></strong>! Legal não é? Decidi registrar um domínio, visto que o blog está recebendo uma grande quantidade de visitas ultimamente.</p>
<p>Grande abraço a todos e obrigado por lerem meus tutoriais. Fico muito feliz de saber que estou contribuindo de alguma forma para o aprendizado de vocês. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/597/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/597/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/597/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/597/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/597/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/597/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/597/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/597/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=597&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/10/28/novo-endereco-do-blog/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>
	</item>
		<item>
		<title>Reportagem na EPTV &#8211; Trabalhos do Laboratório que Trabalhei Durante o Mestrado</title>
		<link>http://davidbuzatto.com.br/2010/10/15/reportagem-na-eptv-trabalhos-do-laboratorio-que-trabalhei-durante-o-mestrado/</link>
		<comments>http://davidbuzatto.com.br/2010/10/15/reportagem-na-eptv-trabalhos-do-laboratorio-que-trabalhei-durante-o-mestrado/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 18:17:07 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Mestrado]]></category>
		<category><![CDATA[mestrado]]></category>
		<category><![CDATA[omcs]]></category>
		<category><![CDATA[omcs-br]]></category>
		<category><![CDATA[senso comum]]></category>

		<guid isPermaLink="false">http://davidbuzatto.wordpress.com/?p=593</guid>
		<description><![CDATA[Olá pessoal, hoje foi transmitida uma reportagem na EPTV sobre as pesquisas realizadas no laboratório que trabalhei durante o meu mestrado, o LIA &#8211; Laboratório de Interação Avançada. Meus amigos Johana, Marcos e Bruno apareceram falando de seus projetos e no final, a professora Junia, que foi minha orientadora, falou um pouco sobre o projeto [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=593&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal, hoje foi transmitida uma reportagem na EPTV sobre as pesquisas realizadas no laboratório que trabalhei durante o meu mestrado, o <strong><a title="LIA" href="http://lia.dc.ufscar.br/" target="_blank">LIA &#8211; Laboratório de Interação Avançada</a></strong>. Meus amigos Johana, Marcos e Bruno apareceram falando de seus projetos e no final, a professora Junia, que foi minha orientadora, falou um pouco sobre o projeto central do laboratório, o OMCS-Br (Open Mind Common Sense no Brasil) que tem como objetivo coletar senso comum da população brasileira, permitindo então que esse conhecimento cultural possa ser utilizado em aplicações computacionais contextualizadas. Segue o link da reportagem.</p>
<p><a title="Reportagem LIA" href="http://eptv.globo.com/emc/VID,0,1,23911;1,pesquisa+ufscar.aspx" target="_blank">http://eptv.globo.com/emc/VID,0,1,23911;1,pesquisa+ufscar.aspx</a></p>
<p>Um grande abraço aos amigos do LIA!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/593/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/593/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/593/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=593&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/10/15/reportagem-na-eptv-trabalhos-do-laboratorio-que-trabalhei-durante-o-mestrado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>
	</item>
		<item>
		<title>JasperReports: Trabalhando com Relatórios em Java &#8211; Parte 3 (Subrelatórios)</title>
		<link>http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/</link>
		<comments>http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 02:48:34 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Relatórios]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[relatório]]></category>
		<category><![CDATA[subrelatório]]></category>

		<guid isPermaLink="false">http://davidbuzatto.wordpress.com/?p=465</guid>
		<description><![CDATA[Parte 1 &#8211; Parte 2 &#8211; Parte 3 &#8211; Parte 4 &#8211; Parte 5 Olá! Hoje vamos aprender a trabalhar com subrelatórios no JasperReports, mas antes de começar quero explicar algumas coisas. Nos últimos posts, eu tenho tentado formatar os termos em inglês em itálico e colocar logo em seguida a tradução. Eu vou parar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=465&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <strong>Parte 3</strong> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<p>Olá! Hoje vamos aprender a trabalhar com subrelatórios no JasperReports, mas antes de começar quero explicar algumas coisas. Nos últimos posts, eu tenho tentado formatar os termos em inglês em itálico e colocar logo em seguida a tradução. Eu vou parar de fazer isso. Primeiro, pq os termos são simples, e qualquer pessoa que trabalhe com informática tem mais que obrigação de saber. Segundo, gasto muito tempo formatando cada parágrafo, revisando se está tudo ok, etc. Então, para agilizar o processo, estou deixando de lado essa prática. Tenho também tratado os leitores cada hora de um jeito. Uma hora escrevo na primeira pessoa do singular, na outra, escrevo na terceira do plural. Vou tentar manter a mesma narração, mas se eu cometer algum deslize, não se encomodem ok? Então, vamos começar!</p>
<p>Se você já tentou trabalhar com subrelatórios, provavelmente teve algumas frustrações até conseguir fazer funcionar. Se você nunca trabalhou, hoje vai aprender! Trabalhar com subrelatórios não é difícil, o problema é entender como as coisas funcionam, mas antes de falar disso, vamos nos situar no tema. O que é um subrelatório? Como o próprio nome diz é um relatório que fica dentro de um outro relatório, ou seja, é uma parte de um relatório maior, mais geral. Vamos entender por meio de um exemplo. Para isso, abra o diagrama da base de dados sakila <a title="Diagrama da base de dados sakila." href="http://davidbuzatto.files.wordpress.com/2010/10/figura23.png" target="_blank">clicando aqui</a> e imagine a seguinte situação: você precisa criar um relatório, onde serão exibidos os dados de todos os clientes e de todos os filmes que cada um alugou. O layout do relatório teria que ficar mais ou menos assim:</p>
<p>&nbsp;</p>
<div id="attachment_553" class="wp-caption aligncenter" style="width: 536px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura113.png"><img class="size-full wp-image-553" title="Figura 1" src="http://davidbuzatto.files.wordpress.com/2010/10/figura113.png?w=640" alt="Figura 1"   /></a><p class="wp-caption-text">Rascunho do layout do relatório de filmes por cliente</p></div>
<p>&nbsp;</p>
<p>Como criar um relatório com esse layout? Usando subrelatórios! A parte mais externa do layout representa o arquivo de relatório mais geral, onde serão listados os clientes e onde será inserido o subrelatório. O subrelatório, destacado em azul, será um outro arquivo de relatório que será utilizado dentro do relatório mais geral. Confuso? Calma, calma, logo vocês vão enteder. Antes disso, um pouquinho mais de teoria.</p>
<p>O funcionamento de um subrelatório é igual ao de um relatório normal, sendo que existe apenas uma diferença e é justamente aqui que as pessoas se confundem. Os parâmetros de um subrelatório não são enviados diretamente do código Java como é feito em um relatório normal. No caso dos subrelatórios, os parâmetros são enviados pelo relatório que os contém, para então serem passados ao subrelatório. Então, caso você passe um parâmetro para o relatório que deve ser usado apenas no subrelatório, o seu relatório vai ter que ter o &#8220;mesmo&#8221; parâmetro  e você vai ter que criar essa ponte entre o relatório principal e o subrelatório. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_559" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura28.png"><img class="size-full wp-image-559" title="Figura 2" src="http://davidbuzatto.files.wordpress.com/2010/10/figura28.png?w=640&#038;h=499" alt="Figura 2" width="640" height="499" /></a><p class="wp-caption-text">Parâmetros sendo passados entre as camadas de relatórios</p></div>
<p>&nbsp;</p>
<p>Em vermelho é destacada a transmissão dos parâmetros a partir da aplicação em Java para o relatório. Esses parâmetros são enviados usando o mapa da parâmetros lembram? Em laranja é destacada a transmissão dos parâmetros para o subrelatório a partir do relatório. Veja então que o relatório vai servir de ponte entre os parâmetros desejados, além de poder criar novos parâmetros e os enviar para o subrelatório. Outro detalhe é que podem haver diversos níveis de relatórios, ou seja, um subrelatório pode enviar parâmetros para um subsubrelatório, um subsubrelatório pode enviar parâmetros para um subsubsubrelatório, e assim por diante.</p>
<p>Finalmente! Vamos à prática! Abra o NetBeans e o projeto que estamos usando (TutorialRelatorios). Se você não acompanhou a parte anterior do tutorial, ou mesmo que tenha acompanhado e não tenha feito o exemplo, você pode baixar a versão do projeto (finalizada na <a title="Parte 2 do tutorial" href="http://davidbuzatto.wordpress.com/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2)</a> <strong><a title="Download do projeto da Parte 2" href="http://www.4shared.com/file/w6bGDgPH/TutorialRelatorios_-_parte_2.html" target="_blank">clicando aqui</a></strong>. Na pasta de definições de relatórios que criamos, crie um novo Empty Report e dê o nome de LocacoesPorClientes. O arquivo LocacoesPorClientes.jrxml vai ser criado. Caso ele não abra automaticamente no editor, clique duas vezes para ser carregado no iReport.</p>
<p>Com o arquivo aberto, vamos primeramente criar um relatório simples, que lista os clientes a partir de uma pesquisa pelo nome. A query deste relatório vai ser um pouco mais complexa que a do relatório &#8220;ClientesPorNome&#8221;, criado na Parte 2 do tutorial, pois nela iremos obter outros dados do cliente que não estão na tabela customer. Não se esqueça de escolher o datasource correto, o &#8220;Sakila &#8211; JDBC&#8221; ok? Crie também um parâmetro, do tipo String, com o nome de &#8220;nomeCliente&#8221;. Segue então a query que deve ser inserida no relatório:</p>
<p><pre class="brush: sql;">SELECT
    c.customer_id idCliente,
    c.first_name nome,
    c.last_name sobrenome,
    c.email email,
    a.address endereco,
    a.phone telefone,
    ci.city nomeCidade,
    co.country nomePais

FROM
    customer c,
    address a,
    city ci,
    country co

WHERE
    /* junções */
    c.address_id = a.address_id AND
    a.city_id = ci.city_id AND
    ci.country_id = co.country_id AND

    /* restrições */
    c.first_name LIKE $P{nomeCliente}

ORDER BY c.first_name;</pre></p>
<p>Ao inserir a query, o iReport vai carregar os campos retornados por ela. Ao clicar em OK, os campos carregados serão criados na definição do relatório. Os fields lembram? Expanda então o nó Fields do Report Inspector e arraste e organize esses campos na banda Detail do relatório. Veja como ficou o meu.</p>
<p>&nbsp;</p>
<div id="attachment_564" class="wp-caption aligncenter" style="width: 645px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura32.png"><img class="size-full wp-image-564" title="Figura 3" src="http://davidbuzatto.files.wordpress.com/2010/10/figura32.png?w=640" alt="Figura 3"   /></a><p class="wp-caption-text">Layout do relatório de locações por clientes</p></div>
<p>&nbsp;</p>
<p>Note que coloquei campos estáticos na banda Detail, tirei as bandas Column Header, Column Footer e Summary. Criei um parâmetro chamado &#8220;nomeUsuario&#8221; para mostrar no cabeçalho da página o nome do usuário do &#8220;sistema&#8221; que gerou o relatório. Outra coisa que fiz foi colocar a data e hora que o relatório foi gerado na banda Page Header. Note que para o uso da data e do formato, foi usado um campo de texto dinâmico, com o tipo java.util.Date e a propriedade pattern alterada para &#8220;dd/MM/yyyy&#8217;, às&#8217; HH:mm&#8217;hs&#8217;&#8221; (sem as aspas). Note também que o valor deste campo é gerado a partir de um código Java! Segue o fonte em XML do relatório. Basta copiar e colar no seu relatório (usando o botão XML).</p>
<blockquote><p><em><strong>LocacoesPorClientes.jrxml</strong></em></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jasperReport xmlns=&quot;http://jasperreports.sourceforge.net/jasperreports&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd&quot; name=&quot;report name&quot; pageWidth=&quot;595&quot; pageHeight=&quot;842&quot; columnWidth=&quot;535&quot; leftMargin=&quot;20&quot; rightMargin=&quot;20&quot; topMargin=&quot;20&quot; bottomMargin=&quot;20&quot;&gt;
    &lt;property name=&quot;ireport.zoom&quot; value=&quot;1.0&quot;/&gt;
    &lt;property name=&quot;ireport.x&quot; value=&quot;0&quot;/&gt;
    &lt;property name=&quot;ireport.y&quot; value=&quot;0&quot;/&gt;
    &lt;parameter name=&quot;nomeCliente&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;nomeUsuario&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;queryString&gt;
        &lt;![CDATA[SELECT
    c.customer_id idCliente,
    c.first_name nome,
    c.last_name sobrenome,
    c.email email,
    a.address endereco,
    a.phone telefone,
    ci.city nomeCidade,
    co.country nomePais

FROM
    customer c,
    address a,
    city ci,
    country co

WHERE
    /* junções */
    c.address_id = a.address_id AND
    a.city_id = ci.city_id AND
    ci.country_id = co.country_id AND

    /* restrições */
    c.first_name LIKE $P{nomeCliente}

ORDER BY c.first_name;]]&gt;
    &lt;/queryString&gt;
    &lt;field name=&quot;idCliente&quot; class=&quot;java.lang.Integer&quot;/&gt;
    &lt;field name=&quot;nome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;sobrenome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;email&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;endereco&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;telefone&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomeCidade&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomePais&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;background&gt;
        &lt;band splitType=&quot;Stretch&quot;/&gt;
    &lt;/background&gt;
    &lt;title&gt;
        &lt;band height=&quot;75&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;18&quot; width=&quot;555&quot; height=&quot;40&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font size=&quot;25&quot; isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Locações por Clientes]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;74&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/title&gt;
    &lt;pageHeader&gt;
        &lt;band height=&quot;21&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;-1&quot; y=&quot;0&quot; width=&quot;51&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Usuário:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;53&quot; y=&quot;0&quot; width=&quot;150&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$P{nomeUsuario}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;360&quot; y=&quot;0&quot; width=&quot;68&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Gerado em:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField pattern=&quot;dd/MM/yyyy&amp;apos;, às&amp;apos; HH:mm&amp;apos;hs&amp;apos;&quot;&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;0&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.util.Date&quot;&gt;&lt;![CDATA[new Date()]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
        &lt;/band&gt;
    &lt;/pageHeader&gt;
    &lt;detail&gt;
        &lt;band height=&quot;110&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;3&quot; width=&quot;50&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Nome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;23&quot; width=&quot;99&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Sobrenome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;23&quot; width=&quot;136&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{sobrenome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[E-mail:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;23&quot; width=&quot;228&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{email}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;47&quot; width=&quot;59&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Endereço:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;62&quot; y=&quot;47&quot; width=&quot;177&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{endereco}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;3&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Telefone:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;23&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{telefone}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;47&quot; width=&quot;42&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Cidade:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;287&quot; y=&quot;47&quot; width=&quot;106&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomeCidade}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;397&quot; y=&quot;47&quot; width=&quot;31&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[País:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;47&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomePais}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;167&quot; y=&quot;82&quot; width=&quot;226&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot; rotation=&quot;None&quot;&gt;
                    &lt;font size=&quot;12&quot; isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[O Subrelatório vai vir aqui....]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/detail&gt;
    &lt;pageFooter&gt;
        &lt;band height=&quot;22&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;455&quot; y=&quot;2&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Right&quot; verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.Integer&quot;&gt;&lt;![CDATA[$V{PAGE_NUMBER}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/pageFooter&gt;
&lt;/jasperReport&gt;</pre></p>
<p>Depois de colar, volte para o Designer e verifique o que foi feito em cada parte. Após atualizar o seu relatório, teste-o. O iReport vai pedir dois parâmetros, o nomeCliente que vai ser usado na query e o nomeUsuario que vai ser usado no pageHeader. Note que coloquei um campo de texto estático na banda detail, mostrando onde vai ficar o subrealtório. Vamos criá-lo então. Primeiro, remova o campo de texto estático que tem o valor &#8220;O Subrelatório vai vir aqui&#8230;&#8221; e aumente a banda detail na altura cerca de 120 pixels (depois iremos deixar do tamanho correto). Na paleta de componentes, procure por Subreport. Arraste m subreport para a banda Detail. Assim que arrastar e soltar, o assistente de criação de subrelatórios irá abrir. No primeiro passo, escolha &#8220;Create a new report&#8221; e clique em Next. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_566" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura42.png"><img class="size-full wp-image-566" title="Figura 4" src="http://davidbuzatto.files.wordpress.com/2010/10/figura42.png?w=640&#038;h=429" alt="Figura 4" width="640" height="429" /></a><p class="wp-caption-text">Primeiro passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>No segundo passo, escolha o layout como Blank A4 e clique em Next. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_567" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura52.png"><img class="size-full wp-image-567" title="Figura 5" src="http://davidbuzatto.files.wordpress.com/2010/10/figura52.png?w=640&#038;h=462" alt="Figura 5" width="640" height="462" /></a><p class="wp-caption-text">Segundo passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>No terceiro passo, ele vai pedir para inserir uma query. Iremos colocar uma query provisória, só para poder continuar o assistente. Depois iremos mudá-la. Coloque &#8220;SELECT * FROM country&#8221; (sem as aspas) e clique em Next. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_568" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura62.png"><img class="size-full wp-image-568" title="Figura 6" src="http://davidbuzatto.files.wordpress.com/2010/10/figura62.png?w=640&#038;h=462" alt="Figura 6" width="640" height="462" /></a><p class="wp-caption-text">Terceiro passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>No quarto passo, ele vai perguntar os campos que queremos usar. Não adicione nenhum, pois não vamos usá-los, pois essa não é a query que queremos lembram? Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_569" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura72.png"><img class="size-full wp-image-569" title="Figura 7" src="http://davidbuzatto.files.wordpress.com/2010/10/figura72.png?w=640&#038;h=462" alt="Figura 7" width="640" height="462" /></a><p class="wp-caption-text">Quarto passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>No quinto passo, o assistente pergunta os grupos que serão usados. Nós não usaremos grupos, então, da mesma forma que fizemos no passo anterior, clique em Next sem fazer nada. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_570" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura82.png"><img class="size-full wp-image-570" title="Figura 8" src="http://davidbuzatto.files.wordpress.com/2010/10/figura82.png?w=640&#038;h=462" alt="Figura 8" width="640" height="462" /></a><p class="wp-caption-text">Quinto passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>No próximo passo, configuramos o nome do arquivo de relatório que vai ser gerado (Report Name), onde ele vai ser armazenado e como ele vai ser obtido no relatório principal. Sendo assim, em Report Name insira &#8220;LocacoesPorClientes_Locacoes&#8221; (sem as aspas). Não mexa em Location, pq já deve estar apontanto para o diretório do relatório principal. Abaixo, escolha &#8220;Store the directory name in a parameter&#8221;. Isso vai ser útil depois, para informarmos onde está o subrelatório. Feito isso, clique em Next. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_571" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura92.png"><img class="size-full wp-image-571" title="Figura 9" src="http://davidbuzatto.files.wordpress.com/2010/10/figura92.png?w=640&#038;h=462" alt="Figuta 9" width="640" height="462" /></a><p class="wp-caption-text">Sexto passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>No sétimo e último passo é perguntado como os dados do subrelatório serão obtidos. Marque a opção &#8220;Use the same connection used to fill the master report&#8221;, ou seja, vamos usar o mesmo objeto Connection passado para executar a query do relatório principal. Clique em Finish. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_572" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura102.png"><img class="size-full wp-image-572" title="Figura 10" src="http://davidbuzatto.files.wordpress.com/2010/10/figura102.png?w=640&#038;h=462" alt="Figura 10" width="640" height="462" /></a><p class="wp-caption-text">Sétimo passo do assistente de subrelatório</p></div>
<p>&nbsp;</p>
<p>Ao clicar em Finish, o novo arquivo de relatório será criado e aberto. Mas ainda não vamos mexer nele. Volte ao relatório principal. Você vai perceber que foi inserida uma caixa cinza no relatório. Essa caixa indica onde o subrelatório vai ser inserido. Note então que para cada cliente, teremos um subrelatório renderizado, afinal, estamos na banda Detail não é mesmo? Expanda a caixa na largura, para ocupar quase a totalidade do relatório e altere a largura da banda detail acomodar a caixa do subrealtório. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_573" class="wp-caption aligncenter" style="width: 645px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura114.png"><img class="size-full wp-image-573" title="Figura 11" src="http://davidbuzatto.files.wordpress.com/2010/10/figura114.png?w=640" alt="Figura 11"   /></a><p class="wp-caption-text">Layout do relatório principal</p></div>
<p>&nbsp;</p>
<p>Ainda não teste o relatório! Como estamos obtendo todos os países para cada registro de cliente obtido, o iReport pode travar. Salve o relatório principal e vamos agora para o arquivo do subrelatório. Caso queria, segue o XML do relatório principal.</p>
<blockquote><p><strong><em>LocacoesPorClientes.jrxml</em></strong></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jasperReport xmlns=&quot;http://jasperreports.sourceforge.net/jasperreports&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd&quot; name=&quot;report name&quot; pageWidth=&quot;595&quot; pageHeight=&quot;842&quot; columnWidth=&quot;535&quot; leftMargin=&quot;20&quot; rightMargin=&quot;20&quot; topMargin=&quot;20&quot; bottomMargin=&quot;20&quot;&gt;
    &lt;property name=&quot;ireport.zoom&quot; value=&quot;1.0&quot;/&gt;
    &lt;property name=&quot;ireport.x&quot; value=&quot;0&quot;/&gt;
    &lt;property name=&quot;ireport.y&quot; value=&quot;0&quot;/&gt;
    &lt;parameter name=&quot;nomeCliente&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;nomeUsuario&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;SUBREPORT_DIR&quot; class=&quot;java.lang.String&quot; isForPrompting=&quot;false&quot;&gt;
        &lt;defaultValueExpression&gt;&lt;![CDATA[&quot;C:\\Users\\David\\Documents\\Blog\\tutoriais\\TutorialRelatorios\\relatorios\\&quot;]]&gt;&lt;/defaultValueExpression&gt;
    &lt;/parameter&gt;
    &lt;queryString&gt;
        &lt;![CDATA[SELECT
    c.customer_id idCliente,
    c.first_name nome,
    c.last_name sobrenome,
    c.email email,
    a.address endereco,
    a.phone telefone,
    ci.city nomeCidade,
    co.country nomePais

FROM
    customer c,
    address a,
    city ci,
    country co

WHERE
    /* junções */
    c.address_id = a.address_id AND
    a.city_id = ci.city_id AND
    ci.country_id = co.country_id AND

    /* restrições */
    c.first_name LIKE $P{nomeCliente}

ORDER BY c.first_name;]]&gt;
    &lt;/queryString&gt;
    &lt;field name=&quot;idCliente&quot; class=&quot;java.lang.Integer&quot;/&gt;
    &lt;field name=&quot;nome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;sobrenome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;email&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;endereco&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;telefone&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomeCidade&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomePais&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;background&gt;
        &lt;band splitType=&quot;Stretch&quot;/&gt;
    &lt;/background&gt;
    &lt;title&gt;
        &lt;band height=&quot;75&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;18&quot; width=&quot;555&quot; height=&quot;40&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font size=&quot;25&quot; isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Locações por Clientes]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;74&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/title&gt;
    &lt;pageHeader&gt;
        &lt;band height=&quot;21&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;-1&quot; y=&quot;0&quot; width=&quot;51&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Usuário:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;53&quot; y=&quot;0&quot; width=&quot;150&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$P{nomeUsuario}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;360&quot; y=&quot;0&quot; width=&quot;68&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Gerado em:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField pattern=&quot;dd/MM/yyyy&amp;apos;, às&amp;apos; HH:mm&amp;apos;hs&amp;apos;&quot;&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;0&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.util.Date&quot;&gt;&lt;![CDATA[new Date()]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
        &lt;/band&gt;
    &lt;/pageHeader&gt;
    &lt;detail&gt;
        &lt;band height=&quot;175&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;3&quot; width=&quot;50&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Nome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;23&quot; width=&quot;99&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Sobrenome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;23&quot; width=&quot;136&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{sobrenome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[E-mail:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;23&quot; width=&quot;228&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{email}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;47&quot; width=&quot;59&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Endereço:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;62&quot; y=&quot;47&quot; width=&quot;177&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{endereco}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;3&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Telefone:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;23&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{telefone}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;47&quot; width=&quot;42&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Cidade:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;287&quot; y=&quot;47&quot; width=&quot;106&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomeCidade}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;397&quot; y=&quot;47&quot; width=&quot;31&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[País:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;47&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomePais}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;subreport&gt;
                &lt;reportElement x=&quot;7&quot; y=&quot;71&quot; width=&quot;544&quot; height=&quot;100&quot;/&gt;
                &lt;connectionExpression&gt;&lt;![CDATA[$P{REPORT_CONNECTION}]]&gt;&lt;/connectionExpression&gt;
                &lt;subreportExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$P{SUBREPORT_DIR} + &quot;LocacoesPorClientes_Locacoes.jasper&quot;]]&gt;&lt;/subreportExpression&gt;
            &lt;/subreport&gt;
        &lt;/band&gt;
    &lt;/detail&gt;
    &lt;pageFooter&gt;
        &lt;band height=&quot;22&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;455&quot; y=&quot;2&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Right&quot; verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.Integer&quot;&gt;&lt;![CDATA[$V{PAGE_NUMBER}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/pageFooter&gt;
&lt;/jasperReport&gt;</pre></p>
<p>A primeira coisa que vamos fazer no arquivo do subrelatório é excluir todas as bandas, exceto a Detail e a Column Header. Vamos agora criar um parâmetro chamado &#8220;idCliente&#8221;, que vai ser usado na nossa query para que possamos obter os filmes de um determinado cliente. O tipo deve deve ser Integer. Vamos agora editar a query do relatório, onde vamos obter o nome e o ano do filme alugado, além da data de devolução, sendo que iremos mostrar apenas os filmes que já foram alugados, ou seja, com data de devolução diferente de NULL. Teremos que fazer junções em algumas tabelas para podermos obter os filmes alugados por um determinado cliente. A query vai ficar assim:</p>
<p><pre class="brush: sql;">SELECT
    f.title titulo,
    f.release_year anoLancamento,
    r.return_date dataDevolucao

FROM
    customer c,
    rental r,
    inventory i,
    film f

WHERE
    /* junções */
    r.customer_id = c.customer_id AND
    r.inventory_id = i.inventory_id AND
    i.film_id = f.film_id AND

    /* restrições */
    c.customer_id LIKE $P{idCliente} AND
    r.return_date IS NOT NULL

ORDER BY r.return_date, f.title;</pre></p>
<p>Ao clicar em OK, o iReport vai gerar os campos para podermos utilizar no subrelatório. Organize então os campos da mesma forma que mostrado na Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_576" class="wp-caption aligncenter" style="width: 523px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura122.png"><img class="size-full wp-image-576" title="Figura 12" src="http://davidbuzatto.files.wordpress.com/2010/10/figura122.png?w=640" alt="Figura 12"   /></a><p class="wp-caption-text">Layout do subrelatório</p></div>
<p>&nbsp;</p>
<p>Note que diminui a largura da página para 6,5 polegadas (6.5 inches). Para fazer isso, no Report Inspector, clique com o botão direito no nó raiz (deve estar com o nome do arquivo de relatório) e vá em Page Format (primeira opção) e altere a largura (Width) para 6.5 polegadas e clique em OK. Segue o código XML do subrelatório.</p>
<blockquote><p><em><strong>LocacoesPorClientes_Locacoes.jrxml</strong></em></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jasperReport xmlns=&quot;http://jasperreports.sourceforge.net/jasperreports&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd&quot; name=&quot;LocacoesPorClientes_Locacoes&quot; language=&quot;groovy&quot; pageWidth=&quot;468&quot; pageHeight=&quot;802&quot; columnWidth=&quot;468&quot; leftMargin=&quot;0&quot; rightMargin=&quot;0&quot; topMargin=&quot;0&quot; bottomMargin=&quot;0&quot;&gt;
    &lt;property name=&quot;ireport.zoom&quot; value=&quot;1.0&quot;/&gt;
    &lt;property name=&quot;ireport.x&quot; value=&quot;0&quot;/&gt;
    &lt;property name=&quot;ireport.y&quot; value=&quot;0&quot;/&gt;
    &lt;parameter name=&quot;idCliente&quot; class=&quot;java.lang.Integer&quot;/&gt;
    &lt;queryString&gt;
        &lt;![CDATA[SELECT
    f.title titulo,
    f.release_year anoLancamento,
    r.return_date dataDevolucao

FROM
    customer c,
    rental r,
    inventory i,
    film f

WHERE
    /* junções */
    r.customer_id = c.customer_id AND
    r.inventory_id = i.inventory_id AND
    i.film_id = f.film_id AND

    /* restrições */
    c.customer_id LIKE $P{idCliente} AND
    r.return_date IS NOT NULL

ORDER BY r.return_date, f.title;]]&gt;
    &lt;/queryString&gt;
    &lt;field name=&quot;titulo&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;anoLancamento&quot; class=&quot;java.sql.Date&quot;/&gt;
    &lt;field name=&quot;dataDevolucao&quot; class=&quot;java.sql.Timestamp&quot;/&gt;
    &lt;background&gt;
        &lt;band splitType=&quot;Stretch&quot;/&gt;
    &lt;/background&gt;
    &lt;columnHeader&gt;
        &lt;band height=&quot;25&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Devolvido em]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;0&quot; width=&quot;47&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Título]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;326&quot; y=&quot;0&quot; width=&quot;117&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Ano de Lançamento]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;24&quot; width=&quot;468&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/columnHeader&gt;
    &lt;detail&gt;
        &lt;band height=&quot;21&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;textField pattern=&quot;dd/MM/yyyy&quot;&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.sql.Timestamp&quot;&gt;&lt;![CDATA[$F{dataDevolucao}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;1&quot; width=&quot;219&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{titulo}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;textField pattern=&quot;yyyy&quot;&gt;
                &lt;reportElement x=&quot;326&quot; y=&quot;1&quot; width=&quot;117&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.util.Date&quot;&gt;&lt;![CDATA[$F{anoLancamento}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
        &lt;/band&gt;
    &lt;/detail&gt;
&lt;/jasperReport&gt;</pre></p>
<p>Dê um preview no subreport, inserindo o valor &#8220;1&#8243; (sem as aspas) para o parâmetro idCliente. O preview deve ser parecido com o mostrado na Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_577" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura132.png"><img class="size-full wp-image-577" title="Figura 13" src="http://davidbuzatto.files.wordpress.com/2010/10/figura132.png?w=640&#038;h=446" alt="Figura 13" width="640" height="446" /></a><p class="wp-caption-text">Preview do subrelatório</p></div>
<p>&nbsp;</p>
<p>Engraçado notar que tem filmes que foram alugados pelo Cliente &#8220;1&#8243; antes de terem sido lançados <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Enfim, estamos quase lá. Falta agora nós fazermos os dois relatórios funcionarem juntos. Lembram que falei que os parâmetros do subrelatório teriam de ser enviados pelo relatório principal? No nosso caso, o nosso subrelatório espera pelo parâmetro &#8220;idCliente&#8221; (<strong><span style="color:#ff0000;">$P</span></strong>{idCliente}) para executar sua query. Então precisamos fazer com que o relatório principal passe este valor, que está sendo guardado do campo idCliente (<span style="color:#00ff00;"><strong>$F</strong></span>{idCliente}) que é obtido na query do relatório principal.</p>
<p>Para isso, vá no relatório principal e selecione a caixa que vai conter o subrelatório. Ao selecioná-la, procure pela propriedade Parameters no painel de propriedades. O valor vai estar definido como &#8220;No parameter defined&#8221;. Clique no pequeno botão a direita e a janela mostrada na Figura abaixo vai ser exibida.</p>
<p>&nbsp;</p>
<div id="attachment_579" class="wp-caption aligncenter" style="width: 409px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura142.png"><img class="size-full wp-image-579" title="Figura 14" src="http://davidbuzatto.files.wordpress.com/2010/10/figura142.png?w=640" alt="Figura 14"   /></a><p class="wp-caption-text">Configuração de parâmetros</p></div>
<p>&nbsp;</p>
<p>Esta janela é utilizada para criar um parâmetro de passagem (eu que inventei esse nome de &#8220;parâmetro de passagem&#8221;), que deve ter o mesmo nome do parâmetro esperado pelo subrelatório. Os parâmetros de passagem ficam na coluna destacada em roxo da tabela. O valor desse parâmetro é gerado pela expressão que for definida (coluna destacada em verde). Para criar o novo parâmetro de passagem, clique no botão Add. Ao clicar no botão, a janela mostrada na Figura abaixo é mostrada.</p>
<p>&nbsp;</p>
<div id="attachment_580" class="wp-caption aligncenter" style="width: 409px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura152.png"><img class="size-full wp-image-580" title="Figura 15" src="http://davidbuzatto.files.wordpress.com/2010/10/figura152.png?w=640" alt="Figura 15"   /></a><p class="wp-caption-text">Janela para adicionar parâmetros de passagem</p></div>
<p>&nbsp;</p>
<p>Preencha o campo &#8220;Subreport parameter name&#8221; com o valor idCliente (nome do parâmetro do subrelatório) e preencha o campo &#8220;Value expression&#8221; com o valor $F{idCliente}, ou seja, o campo idCliente da query do relatório principal e clique em OK. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_581" class="wp-caption aligncenter" style="width: 409px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura162.png"><img class="size-full wp-image-581" title="Figura 16" src="http://davidbuzatto.files.wordpress.com/2010/10/figura162.png?w=640" alt="Figura 16"   /></a><p class="wp-caption-text">Criando novo parâmetro de passagem</p></div>
<p>&nbsp;</p>
<p>Note que você pode usar o editor de expressões (Expression editor) clicando no botão destacado em laranja. Entendeu o que fizemos? Amarramos o parâmetro idCliente do subrelatório com o valor que vai ser inserido no campo idCliente ($F{idCliente}), ou seja, a cada vez que o subrelatório for chamado (para cada cliente) o valor do parâmetro idCliente vai ser configurado com o valor do campo idCliente. Note que o valor do parâmetro do subrelatório tem que ser do mesmo tipo que o valor gerado pela expressão de valor (value expression). É nesta mesma janela que você vai amarrar todos os parâmetros do subrelatório com valores gerados no relatório ou passados para ele. Por exemplo, o subrelatório tem um parâmetro chamado &#8220;paramSub1&#8243; e o valor deste parâmetro é passado ao relatório principal no parâmetro chamado &#8220;paramPrin1&#8243;. Então você teria que amarrar paramSub1 (coluna name, em verde) com a expressão $P{paramPrin1} (coluna expression, em roxo) entendeu? É como se estivéssemos chamando um método, passando parâmetros para ele. Segue então o código XML do relatório principal até o momento.</p>
<blockquote><p><em><strong>LocacoesPorClientes.jrxml</strong></em></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jasperReport xmlns=&quot;http://jasperreports.sourceforge.net/jasperreports&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd&quot; name=&quot;report name&quot; pageWidth=&quot;595&quot; pageHeight=&quot;842&quot; columnWidth=&quot;535&quot; leftMargin=&quot;20&quot; rightMargin=&quot;20&quot; topMargin=&quot;20&quot; bottomMargin=&quot;20&quot;&gt;
    &lt;property name=&quot;ireport.zoom&quot; value=&quot;1.0&quot;/&gt;
    &lt;property name=&quot;ireport.x&quot; value=&quot;0&quot;/&gt;
    &lt;property name=&quot;ireport.y&quot; value=&quot;0&quot;/&gt;
    &lt;parameter name=&quot;nomeCliente&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;nomeUsuario&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;SUBREPORT_DIR&quot; class=&quot;java.lang.String&quot; isForPrompting=&quot;false&quot;&gt;
        &lt;defaultValueExpression&gt;&lt;![CDATA[&quot;C:\\Users\\David\\Documents\\Blog\\tutoriais\\TutorialRelatorios\\relatorios\\&quot;]]&gt;&lt;/defaultValueExpression&gt;
    &lt;/parameter&gt;
    &lt;queryString&gt;
        &lt;![CDATA[SELECT
    c.customer_id idCliente,
    c.first_name nome,
    c.last_name sobrenome,
    c.email email,
    a.address endereco,
    a.phone telefone,
    ci.city nomeCidade,
    co.country nomePais

FROM
    customer c,
    address a,
    city ci,
    country co

WHERE
    /* junções */
    c.address_id = a.address_id AND
    a.city_id = ci.city_id AND
    ci.country_id = co.country_id AND

    /* restrições */
    c.first_name LIKE $P{nomeCliente}

ORDER BY c.first_name;]]&gt;
    &lt;/queryString&gt;
    &lt;field name=&quot;idCliente&quot; class=&quot;java.lang.Integer&quot;/&gt;
    &lt;field name=&quot;nome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;sobrenome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;email&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;endereco&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;telefone&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomeCidade&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomePais&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;background&gt;
        &lt;band splitType=&quot;Stretch&quot;/&gt;
    &lt;/background&gt;
    &lt;title&gt;
        &lt;band height=&quot;75&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;18&quot; width=&quot;555&quot; height=&quot;40&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font size=&quot;25&quot; isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Locações por Clientes]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;74&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/title&gt;
    &lt;pageHeader&gt;
        &lt;band height=&quot;21&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;-1&quot; y=&quot;0&quot; width=&quot;51&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Usuário:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;53&quot; y=&quot;0&quot; width=&quot;150&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$P{nomeUsuario}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;360&quot; y=&quot;0&quot; width=&quot;68&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Gerado em:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField pattern=&quot;dd/MM/yyyy&amp;apos;, às&amp;apos; HH:mm&amp;apos;hs&amp;apos;&quot;&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;0&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.util.Date&quot;&gt;&lt;![CDATA[new Date()]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
        &lt;/band&gt;
    &lt;/pageHeader&gt;
    &lt;detail&gt;
        &lt;band height=&quot;175&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;3&quot; width=&quot;50&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Nome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;23&quot; width=&quot;99&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Sobrenome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;23&quot; width=&quot;136&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{sobrenome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[E-mail:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;23&quot; width=&quot;228&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{email}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;47&quot; width=&quot;59&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Endereço:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;62&quot; y=&quot;47&quot; width=&quot;177&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{endereco}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;3&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Telefone:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;23&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{telefone}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;47&quot; width=&quot;42&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Cidade:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;287&quot; y=&quot;47&quot; width=&quot;106&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomeCidade}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;397&quot; y=&quot;47&quot; width=&quot;31&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[País:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;47&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomePais}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;subreport&gt;
                &lt;reportElement x=&quot;7&quot; y=&quot;71&quot; width=&quot;544&quot; height=&quot;100&quot;/&gt;
                &lt;subreportParameter name=&quot;idCliente&quot;&gt;
                    &lt;subreportParameterExpression&gt;&lt;![CDATA[$F{idCliente}]]&gt;&lt;/subreportParameterExpression&gt;
                &lt;/subreportParameter&gt;
                &lt;connectionExpression&gt;&lt;![CDATA[$P{REPORT_CONNECTION}]]&gt;&lt;/connectionExpression&gt;
                &lt;subreportExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$P{SUBREPORT_DIR} + &quot;LocacoesPorClientes_Locacoes.jasper&quot;]]&gt;&lt;/subreportExpression&gt;
            &lt;/subreport&gt;
        &lt;/band&gt;
    &lt;/detail&gt;
    &lt;pageFooter&gt;
        &lt;band height=&quot;22&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;455&quot; y=&quot;2&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Right&quot; verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.Integer&quot;&gt;&lt;![CDATA[$V{PAGE_NUMBER}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/pageFooter&gt;
&lt;/jasperReport&gt;</pre></p>
<p>Teste o relatório e veja o que acontece. Você vai perceber que para cada cliente será gerado uma lista de filmes. Agora que está tudo pronto, organize o layout do subrelatório e personalize da forma que achar melhor. Eu coloquei a largura com 7,694 polegadas e expandi a linha para ocupar toda a largura. Note que se você mudar alguma coisa no subrelatório, vc precisará compilar apenas ele. Agora, para finalizar, vamos chamar este relatório a partir do nosso programa em Java, mas para isso ainda temos que fazer algumas pequenas modificações no arquivo de relatório principal.</p>
<p>Para entender o que vamos fazer, abra o arquivo LocacoesPorClientes.jrxml e selecione a caixa do subrelatório. Nas propriedades procure pela propriedade Subreport Expression. Essa expressão que é responsável em fazer o subrelatório ser carregado, ou seja, é ela que define para o relatório principal a localização do subrelatório. Por padrão &#8211; na verdade, pq definimos quando usamos o assistente de subrelatórios &#8211; ela vai conter o valor $P{SUBREPORT_DIR} + &#8220;LocacoesPorClientes_Locacoes.jasper&#8221;, ou seja, o caminho do subrelatório é formado pelo valor do parâmetro SUBREPORT_DIR concatenado com o nome do arquivo de Subrelatório. O problema é que o parâmetro SUBREPORT_DIR está configurado com um valor fixo, que corresponde ao caminho absoluto do relatório e isso não é bom&#8230; O que vamos fazer então é fazer com que tudo execute corretamente tanto no projeto, quanto no programa compilado e empacotado.</p>
<p>Primeiro, no Report Inspector, procure pelo parâmetro SUBREPORT_DIR. Ao selecioná-lo, verifique a propriedade &#8220;Default Value Expression&#8221;. Ela vai estar definida como o caminho absoluto do diretório onde está o subrelatório. Vamos mudar esse valor para &#8220;/&#8221; (<strong>com</strong> as aspas), ou seja, uma String que contém uma barra, que vai indicar a raiz do projeto. O tipo da classe do parâmetro ainda é String. Ok, aqui está pronto. Agora selecione novamente a caixa do subrelatório. Na propriedade Subreport expression entre com o seguinte código.</p>
<p><pre class="brush: java;">getClass().getResource( $P{SUBREPORT_DIR} + &quot;LocacoesPorClientes_Locacoes.jasper&quot; )</pre></p>
<p>Note que o ponto e vírgula da instrução <strong>não é colocado</strong>. Essa linha de código vai retornar um objeto URL que aponta para o arquivo do subrelatório (&#8220;/LocacoesPorClientes_Locacoes.jasper&#8221;), sendo então carregado corretamente tanto no projeto, quanto no .jar. Note que poderíamos fixar esse valor sem precisar usar o parâmetro, mas caso haja a necessidade de mudar os diretórios dos subrelatórios, essa abordagem facilita o trabalho, tendo apenas que mudar o valor padrão do parâmetro. Como a expressão vai retornar um objeto URL, ainda nas propriedades da caixa do subrelatório, mude a Expression Class (logo abaixo da Subreport Expression) para java.net.URL.</p>
<p>Feito isso, salve o relatório e dê um preview. Na aba iReport output vai ser acusado um warning, dizendo que não é possível encontrar o relatório, no entando o relatório vai ser renderizado direitinho. Agora não precisamos mais nos preocupar, pois tanto no iReport, quanto no .jar que for ser gerado do projeto, o relatório vai abrir corretamente com o subrelatório.</p>
<p>O código do método abrirRelatorioClientes() da classe Main foi alterado para:</p>
<p><pre class="brush: java;">public void abrirRelatorioClientes() {

    InputStream inputStream = getClass().getResourceAsStream( &quot;/LocacoesPorClientes.jasper&quot; );

    Map&lt;String, Object&gt; parametros = new HashMap&lt;String, Object&gt;();
    parametros.put( &quot;nomeCliente&quot;, &quot;F%&quot; );

    try {

        ReportUtils.openReport( &quot;Locações por Clientes&quot;, inputStream, parametros,
                ConnectionFactory.getSakilaConnection() );

    } catch ( SQLException exc ) {
        exc.printStackTrace();
    } catch ( JRException exc ) {
        exc.printStackTrace();
    }

}</pre></p>
<p>O código das versões finais tanto do arquivo de relatório principal, quanto do subrelatório estão listadas a seguir.</p>
<blockquote><p><strong><em>LocacoesPorClientes.jrxml</em></strong></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jasperReport xmlns=&quot;http://jasperreports.sourceforge.net/jasperreports&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd&quot; name=&quot;report name&quot; pageWidth=&quot;595&quot; pageHeight=&quot;842&quot; columnWidth=&quot;535&quot; leftMargin=&quot;20&quot; rightMargin=&quot;20&quot; topMargin=&quot;20&quot; bottomMargin=&quot;20&quot;&gt;
    &lt;property name=&quot;ireport.zoom&quot; value=&quot;1.0&quot;/&gt;
    &lt;property name=&quot;ireport.x&quot; value=&quot;0&quot;/&gt;
    &lt;property name=&quot;ireport.y&quot; value=&quot;0&quot;/&gt;
    &lt;parameter name=&quot;nomeCliente&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;nomeUsuario&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;parameter name=&quot;SUBREPORT_DIR&quot; class=&quot;java.lang.String&quot; isForPrompting=&quot;false&quot;&gt;
        &lt;defaultValueExpression&gt;&lt;![CDATA[&quot;/&quot;]]&gt;&lt;/defaultValueExpression&gt;
    &lt;/parameter&gt;
    &lt;queryString&gt;
        &lt;![CDATA[SELECT
    c.customer_id idCliente,
    c.first_name nome,
    c.last_name sobrenome,
    c.email email,
    a.address endereco,
    a.phone telefone,
    ci.city nomeCidade,
    co.country nomePais

FROM
    customer c,
    address a,
    city ci,
    country co

WHERE
    /* junções */
    c.address_id = a.address_id AND
    a.city_id = ci.city_id AND
    ci.country_id = co.country_id AND

    /* restrições */
    c.first_name LIKE $P{nomeCliente}

ORDER BY c.first_name;]]&gt;
    &lt;/queryString&gt;
    &lt;field name=&quot;idCliente&quot; class=&quot;java.lang.Integer&quot;/&gt;
    &lt;field name=&quot;nome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;sobrenome&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;email&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;endereco&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;telefone&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomeCidade&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;nomePais&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;background&gt;
        &lt;band splitType=&quot;Stretch&quot;/&gt;
    &lt;/background&gt;
    &lt;title&gt;
        &lt;band height=&quot;75&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;18&quot; width=&quot;555&quot; height=&quot;40&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font size=&quot;25&quot; isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Locações por Clientes]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;74&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/title&gt;
    &lt;pageHeader&gt;
        &lt;band height=&quot;21&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;-1&quot; y=&quot;0&quot; width=&quot;51&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Usuário:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;53&quot; y=&quot;0&quot; width=&quot;150&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$P{nomeUsuario}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;360&quot; y=&quot;0&quot; width=&quot;68&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Gerado em:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField pattern=&quot;dd/MM/yyyy&amp;apos;, às&amp;apos; HH:mm&amp;apos;hs&amp;apos;&quot;&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;0&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.util.Date&quot;&gt;&lt;![CDATA[new Date()]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
        &lt;/band&gt;
    &lt;/pageHeader&gt;
    &lt;detail&gt;
        &lt;band height=&quot;196&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;3&quot; width=&quot;50&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Nome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;23&quot; width=&quot;99&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Sobrenome:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;23&quot; width=&quot;136&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{sobrenome}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;3&quot; width=&quot;70&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[E-mail:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;23&quot; width=&quot;228&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{email}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;47&quot; width=&quot;59&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Endereço:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;62&quot; y=&quot;47&quot; width=&quot;177&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{endereco}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;3&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Telefone:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;473&quot; y=&quot;23&quot; width=&quot;82&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{telefone}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;242&quot; y=&quot;47&quot; width=&quot;42&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Cidade:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;287&quot; y=&quot;47&quot; width=&quot;106&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomeCidade}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;397&quot; y=&quot;47&quot; width=&quot;31&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Left&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[País:]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;433&quot; y=&quot;47&quot; width=&quot;122&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{nomePais}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;subreport&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;96&quot; width=&quot;555&quot; height=&quot;100&quot;/&gt;
                &lt;subreportParameter name=&quot;idCliente&quot;&gt;
                    &lt;subreportParameterExpression&gt;&lt;![CDATA[$F{idCliente}]]&gt;&lt;/subreportParameterExpression&gt;
                &lt;/subreportParameter&gt;
                &lt;connectionExpression&gt;&lt;![CDATA[$P{REPORT_CONNECTION}]]&gt;&lt;/connectionExpression&gt;
                &lt;subreportExpression class=&quot;java.net.URL&quot;&gt;&lt;![CDATA[getClass().getResource( $P{SUBREPORT_DIR} + &quot;LocacoesPorClientes_Locacoes.jasper&quot; )]]&gt;&lt;/subreportExpression&gt;
            &lt;/subreport&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;72&quot; width=&quot;555&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font size=&quot;12&quot; isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Filmes alugados]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;71&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;92&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/detail&gt;
    &lt;pageFooter&gt;
        &lt;band height=&quot;22&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;455&quot; y=&quot;2&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Right&quot; verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.Integer&quot;&gt;&lt;![CDATA[$V{PAGE_NUMBER}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;555&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/pageFooter&gt;
&lt;/jasperReport&gt;</pre></p>
<blockquote><p><strong><em>LocacoesPorClientes_Locacoes.jrxml</em></strong></p></blockquote>
<p><pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jasperReport xmlns=&quot;http://jasperreports.sourceforge.net/jasperreports&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd&quot; name=&quot;LocacoesPorClientes_Locacoes&quot; language=&quot;groovy&quot; pageWidth=&quot;554&quot; pageHeight=&quot;802&quot; columnWidth=&quot;554&quot; leftMargin=&quot;0&quot; rightMargin=&quot;0&quot; topMargin=&quot;0&quot; bottomMargin=&quot;0&quot;&gt;
    &lt;property name=&quot;ireport.zoom&quot; value=&quot;1.0&quot;/&gt;
    &lt;property name=&quot;ireport.x&quot; value=&quot;0&quot;/&gt;
    &lt;property name=&quot;ireport.y&quot; value=&quot;0&quot;/&gt;
    &lt;parameter name=&quot;idCliente&quot; class=&quot;java.lang.Integer&quot;/&gt;
    &lt;queryString&gt;
        &lt;![CDATA[SELECT
    f.title titulo,
    f.release_year anoLancamento,
    r.return_date dataDevolucao

FROM
    customer c,
    rental r,
    inventory i,
    film f

WHERE
    /* junções */
    r.customer_id = c.customer_id AND
    r.inventory_id = i.inventory_id AND
    i.film_id = f.film_id AND

    /* restrições */
    c.customer_id LIKE $P{idCliente} AND
    r.return_date IS NOT NULL

ORDER BY r.return_date, f.title;]]&gt;
    &lt;/queryString&gt;
    &lt;field name=&quot;titulo&quot; class=&quot;java.lang.String&quot;/&gt;
    &lt;field name=&quot;anoLancamento&quot; class=&quot;java.sql.Date&quot;/&gt;
    &lt;field name=&quot;dataDevolucao&quot; class=&quot;java.sql.Timestamp&quot;/&gt;
    &lt;background&gt;
        &lt;band splitType=&quot;Stretch&quot;/&gt;
    &lt;/background&gt;
    &lt;columnHeader&gt;
        &lt;band height=&quot;25&quot;&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;0&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Devolvido em]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;0&quot; width=&quot;47&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Título]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;staticText&gt;
                &lt;reportElement x=&quot;326&quot; y=&quot;0&quot; width=&quot;117&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;&gt;
                    &lt;font isBold=&quot;true&quot;/&gt;
                &lt;/textElement&gt;
                &lt;text&gt;&lt;![CDATA[Ano de Lançamento]]&gt;&lt;/text&gt;
            &lt;/staticText&gt;
            &lt;line&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;24&quot; width=&quot;554&quot; height=&quot;1&quot;/&gt;
            &lt;/line&gt;
        &lt;/band&gt;
    &lt;/columnHeader&gt;
    &lt;detail&gt;
        &lt;band height=&quot;21&quot; splitType=&quot;Stretch&quot;&gt;
            &lt;textField pattern=&quot;dd/MM/yyyy&quot;&gt;
                &lt;reportElement x=&quot;0&quot; y=&quot;1&quot; width=&quot;100&quot; height=&quot;20&quot;/&gt;
                &lt;textElement textAlignment=&quot;Center&quot; verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.sql.Timestamp&quot;&gt;&lt;![CDATA[$F{dataDevolucao}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;textField&gt;
                &lt;reportElement x=&quot;103&quot; y=&quot;1&quot; width=&quot;219&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.lang.String&quot;&gt;&lt;![CDATA[$F{titulo}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
            &lt;textField pattern=&quot;yyyy&quot;&gt;
                &lt;reportElement x=&quot;326&quot; y=&quot;1&quot; width=&quot;117&quot; height=&quot;20&quot;/&gt;
                &lt;textElement verticalAlignment=&quot;Middle&quot;/&gt;
                &lt;textFieldExpression class=&quot;java.util.Date&quot;&gt;&lt;![CDATA[$F{anoLancamento}]]&gt;&lt;/textFieldExpression&gt;
            &lt;/textField&gt;
        &lt;/band&gt;
    &lt;/detail&gt;
&lt;/jasperReport&gt;</pre></p>
<p>O preview da versão final do meu relatório ficou assim:</p>
<p>&nbsp;</p>
<div id="attachment_583" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura172.png"><img class="size-full wp-image-583" title="Figura 17" src="http://davidbuzatto.files.wordpress.com/2010/10/figura172.png?w=640&#038;h=446" alt="Figura 17" width="640" height="446" /></a><p class="wp-caption-text">Versão final do relatório</p></div>
<p>&nbsp;</p>
<p>Então é isso! Terminamos mais uma parte do tutorial! Espero que tenham gostado e que tenha auxiliado quem ainda tinha dificuldade com os subrelatórios. O projeto finalizado desta parte do tutorial pode ser obtido <a title="Download da terceira parte do tutorial" href="http://www.4shared.com/file/ryZOwvOp/TutorialRelatorios_-_parte_3.html" target="_blank"><strong>neste link</strong></a>. Na próxima parte do tutorial iremos aprender a trabalhar com outros tipos de datasources além das conexões que estamos usando até agora.</p>
<p>Grande abraço a todos! Até a próxima parte <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <strong>Parte 3</strong> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/465/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/465/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/465/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=465&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura113.png" medium="image">
			<media:title type="html">Figura 1</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura28.png" medium="image">
			<media:title type="html">Figura 2</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura32.png" medium="image">
			<media:title type="html">Figura 3</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura42.png" medium="image">
			<media:title type="html">Figura 4</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura52.png" medium="image">
			<media:title type="html">Figura 5</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura62.png" medium="image">
			<media:title type="html">Figura 6</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura72.png" medium="image">
			<media:title type="html">Figura 7</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura82.png" medium="image">
			<media:title type="html">Figura 8</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura92.png" medium="image">
			<media:title type="html">Figura 9</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura102.png" medium="image">
			<media:title type="html">Figura 10</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura114.png" medium="image">
			<media:title type="html">Figura 11</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura122.png" medium="image">
			<media:title type="html">Figura 12</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura132.png" medium="image">
			<media:title type="html">Figura 13</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura142.png" medium="image">
			<media:title type="html">Figura 14</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura152.png" medium="image">
			<media:title type="html">Figura 15</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura162.png" medium="image">
			<media:title type="html">Figura 16</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura172.png" medium="image">
			<media:title type="html">Figura 17</media:title>
		</media:content>
	</item>
		<item>
		<title>JasperReports: Trabalhando com Relatórios em Java &#8211; Parte 2 (Primeiros Relatórios)</title>
		<link>http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/</link>
		<comments>http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 17:20:40 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Relatórios]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://davidbuzatto.wordpress.com/?p=463</guid>
		<description><![CDATA[Parte 1 &#8211; Parte 2 &#8211; Parte 3 &#8211; Parte 4 &#8211; Parte 5 Olá! Nesta segunda parte do tutorial sobre criação de relatórios, vamos fazer nossos primeiros exemplos, entretanto, para que possamos ver algum resultado, ou seja, nossos relatórios preenchidos com valores, precisamos de uma base de dados para extrairmos tais dados. Ao invés [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=463&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <strong>Parte 2</strong> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<p>Olá! Nesta segunda parte do tutorial sobre criação de relatórios, vamos fazer nossos primeiros exemplos, entretanto, para que possamos ver algum resultado, ou seja, nossos relatórios preenchidos com valores, precisamos de uma base de dados para extrairmos tais dados. Ao invés de criar uma base de dados na mão, iremos utilizar uma base já pronta. Nos nossos exemplos, vamos utilizar o MySQL como SGBD e iremos utilizar também o &#8220;<em>Sakila Sample Database</em>&#8221; para extrairmos nossos dados. Essa base de dados, é uma base de exemplo que é disponibilizada no site no MySQL (<a title="Sakila Sample Database" href="http://dev.mysql.com/doc/sakila/en/sakila.html" target="_blank">http://dev.mysql.com/doc/sakila/en/sakila.html</a>), que pode ser usada por desenvolvedores para fazer testes com consultas SQL. Como nossos primeiros relatórios vão trabalhar exclusivamente com SQL, vamos utilizar essa base de dados para facilitar nossa vida.</p>
<p>Então, mãos a obra! Primeiramente, acesse <a title="MySQL Other Docs" href="http://dev.mysql.com/doc/index-other.html" target="_blank">http://dev.mysql.com/doc/index-other.html</a> e procure por &#8220;<em>Sample Databases</em>&#8220;. Nesta seção, são apresentadas algumas bases de dados de exemplo que podemos baixar. Procure pela <em>sakila database</em> e baixe a base de dados escolhendo o formato desejado (TGZ ou Zip) na primeira coluna. Para facilitar, <a title="Download Sakila Database" href="http://downloads.mysql.com/docs/sakila-db.zip" target="_blank">este link</a> é o link para baixar a versão em Zip.</p>
<p>Quando terminar de baixar o arquivo, descompacte-o. Dentro dele estão contidos três arquivos:</p>
<ol>
<li><strong>sakila-schema.sql</strong>: é a estrutura da base de dados;</li>
<li><strong>sakila-data.sql</strong>: são os dados da base de dados;</li>
<li><strong>sakila.mwb</strong>: é um projeto do MySQL workbench (http://wb.mysql.com/).</li>
</ol>
<p>Vamos então carregar os dois primeiros arquivos para o nosso SGBD. Para isso, abra o <em>MySQL Command Line Client</em>, digite a senha do root e tecle &lt;ENTER&gt; para fazer o login. Se estiver usando Linux, ou estiver com o bin do MySQL configurado no PATH do Windows, faça o login no MySQL usando o comando &#8220;mysql -u root -p&#8221; (sem as aspas). Quando estamos logados no interpretador do MySQL, podemos utilizar alguns comandos para a administração das bases de dados existentes. Um desses comandos é o &#8220;source&#8221; que é utilizado para carregar e executar comandos do SGBD que estão contidos em um arquivo de texto. Vamos utilizar então este comando para carregar os dois primerios arquivos do <em>sakila database</em> (a estrutura e os dados). Copiei os arquivos sakila-schema.sql e sakila-data.sql para o C: para facilitar a digitação do comando. Veja na Figura abaixo o comando sendo usado para a carga do primeiro arquivo (sakila-schema.sql).</p>
<p>&nbsp;</p>
<div id="attachment_487" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura110.png"><img class="size-full wp-image-487" title="Figura 1" src="http://davidbuzatto.files.wordpress.com/2010/10/figura110.png?w=640&#038;h=323" alt="Figura 1" width="640" height="323" /></a><p class="wp-caption-text">Usando o comando source para carregar o arquivo sakila-schema.sql</p></div>
<p>&nbsp;</p>
<p>Assim que você digitar o comando &#8220;source C:/sakila-schema.sql;&#8221; (sem as aspas) e teclar &lt;ENTER&gt;, você vai ver que o interpretador do MySQL vai começar a processar o arquivo, gerando várias saídas. Se tudo der certo, uma base de dados chamada &#8220;sakila&#8221; será criada, bem como todas as tabelas da sua estrutura. Se quiser verificar que a base de dados foi criada, basta dar o comando &#8220;show databases;&#8221; (sem as aspas) para listar as bases de dados existentes.</p>
<p>Como exercício, da mesma forma que você carregou o arquivo sakila-schema.sql, você deve agora carregar o sakila-data.sql. Novamente os comandos serão processados e agora, além da estrutura da base de dados (criada no passo anterior), temos também vários dados para podermos utilizar em nossas consultas SQL e consequentemente em nossos relatórios, mas antes de partirmos para os relatórios, vamos falar um pouquinho da base de dados sakila. A seguir, uma imagem da estrutura da base, carregada no MySQL Workbench (clique na imagem para ampliar).</p>
<p>&nbsp;</p>
<div id="attachment_490" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura23.png"><img class="size-full wp-image-490" title="Figura 2" src="http://davidbuzatto.files.wordpress.com/2010/10/figura23.png?w=640&#038;h=561" alt="Figura 2" width="640" height="561" /></a><p class="wp-caption-text">Estrutura da base de dados sakila</p></div>
<p>&nbsp;</p>
<p>Na base de dados sakila estão modeladas diversas tabelas que representam os dados de uma locadora de DVDs fictícia. Não vou ficar comentando cada tabela, pois apenas com a leitura do diagrama você vai conseguir entender os relacionamentos entre as elas, afinal, se você trabalha com bases de dados isso devere ser trivial <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .</p>
<p>Pronto! Agora sim! Vamos aos relatórios! Abra o NetBeans (se ainda não estiver aberto) e carregue o projeto que criamos na <a title="Parte 1 do tutorial" href="http://davidbuzatto.wordpress.com/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> do tutorial. Caso você só tenha lido o tutorial, não se preocupe, você pode baixar o projeto feito na Parte 1 <a title="Download do projeto da primeira parte do tutorial" href="http://www.4shared.com/file/MTz6CMqH/TutorialRelatorios_-parte_1.html" target="_blank">neste link</a>. Com o projeto aberto, expanda o nó &#8220;Relatórios&#8221; do projeto. Você vai notar a existência do <em>default package</em> (pacote padrão). É nele que vamos criar os arquivos de código fonte dos nossos relatórios. Sendo assim, clique com o botão direito neste pacote e escolha <em>New -&gt; Other&#8230;</em> (Novo -&gt; Outro&#8230;). Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_491" class="wp-caption aligncenter" style="width: 583px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura31.png"><img class="size-full wp-image-491" title="Figura 3" src="http://davidbuzatto.files.wordpress.com/2010/10/figura31.png?w=640" alt="Figura 3"   /></a><p class="wp-caption-text">Novo arquivo</p></div>
<p>&nbsp;</p>
<p>Ao clicar em <em>Other&#8230;</em> a janela de novo arquivo arquivo será aberta. Em <em>Categories </em>(Categorias) escolha <em>Report </em>(Relatório) e em <em>File Types </em>(Tipos de Arquivo) escolha <em>Empty report</em> (Relatório vazio) e clique em <em>Next </em>(Próximo). Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_492" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura41.png"><img class="size-full wp-image-492" title="Figura 4" src="http://davidbuzatto.files.wordpress.com/2010/10/figura41.png?w=640&#038;h=440" alt="Figura 4" width="640" height="440" /></a><p class="wp-caption-text">Novo arquivo fonte de relatório</p></div>
<p>&nbsp;</p>
<p>Ao clicar em <em>Next</em>, preencha o campo <em>File Name </em>(Nome do Arquivo) com &#8220;Clientes&#8221; (sem as aspas) e clique em <em>Finish </em>(Finalizar/Terminar). Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_493" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura51.png"><img class="size-full wp-image-493" title="Figura 5" src="http://davidbuzatto.files.wordpress.com/2010/10/figura51.png?w=640&#038;h=440" alt="Figura 5" width="640" height="440" /></a><p class="wp-caption-text">Criando o novo arquivo fonte de relatório</p></div>
<p>&nbsp;</p>
<p>Ao clicar em <em>Finish</em>, o arquivo de código fonte do relatório será criado (Clientes.jrxml) e a interface de edição do relatório será aberta, com o arquivo Clientes.jrxml carregado. Note que neste primeiro relatório, vamos simplesmente listar os dados de todos os  clientes, que por sua vez estão contidos na tabela <em>customer </em>da base de  dados sakila.</p>
<p>Vamos agora conhecer a interface do editor do iReport. A Figura abaixo contém diversas áreas numeradas que serão explicadas logo à seguir.</p>
<p>&nbsp;</p>
<div id="attachment_497" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura6-mod.png"><img class="size-full wp-image-497" title="Figura 6" src="http://davidbuzatto.files.wordpress.com/2010/10/figura6-mod.png?w=640&#038;h=400" alt="Figura 6" width="640" height="400" /></a><p class="wp-caption-text">Interface gráfica do editor WYSIWYG do iReport</p></div>
<p>&nbsp;</p>
<ol>
<li><strong>Gerenciamento de <em>Datasources</em> (Fontes de Dados):</strong> A área 1, destacada em amarelo, é utilizada para gerenciar os <em>datasources</em> que podem ser utilizados nos testes dos relatórios que estão sendo criados;</li>
<li><strong>Área de edição do relatório:</strong> A área 2, destacada em azul escuro, contém o editor visual do relatório (descrito no item 3 a seguir), além de alguns botões onde podemos visualizar o editor WYSIWYG (<em>Design</em>), o código fonte do relatório (XML) e visualizar o relatório sendo executado (<em>Preview</em>), além de podermos configurar a forma que o relatório vai obter os dados que serão obtidos atravéz do <em>datasource</em> utilizado (primeiro botão após o botão <em>Preview</em>);</li>
<li><strong>Editor do relatório</strong>: Essa área é utilizada para editar o formato do relatório, onde cada texto vai aparecer, quais bandas ele vai ter, etc. Existem vários tipos de bandas. As que são exibidas por padrão são:
<ul>
<li><em><strong>Title</strong></em>: correponde ao cabeçalho do relatório. Aparece somente na primeira página;</li>
<li><em><strong>Page Header</strong></em>: cabeçalho da página. Aparece em todas as páginas;</li>
<li><em><strong>Column Header</strong></em>: cabeçalho das colunas. Aparece em todas as páginas;</li>
<li><em><strong>Detail</strong></em>: exibe os dados provenientes do <em>datasource</em>, ou seja, são os dados que queremos mostrar no relatório;</li>
<li><em><strong>Column Footer</strong></em>: rodapé das colunas. Aparece em todas as páginas;</li>
<li><em><strong>Page Footer</strong></em>: rodapé da página. Aparece em todas as páginas;</li>
<li><em><strong>Summary</strong></em>: resumo do relatório. Aparece apenas na última página.</li>
</ul>
</li>
<li><strong>Paleta de componentes</strong>: Esta área contém os componentes que podem ser utilizados para montar o relatório;</li>
<li><strong>Propriedades</strong>: Área utilizada para exibir e editar as propriedades de um componente que esteja selecionado;</li>
<li><em><strong>Report Inspector</strong></em>: É nesta área que as configurações do relatório são acessadas, como quais parâmetros ele contém, quais os campos que são utilizados, quais bandas estão visíveis, etc.;</li>
<li><strong>Saída (Output)</strong>: Nesta área são exibidos as saídas da execução e compilação do relatório corrente.</li>
</ol>
<p>Se a explicação de cada área ficou confusa, não se preocupe. Você vai entender tudo daqui a pouco. Vamos começar então a mexer no nosso primeiro relatório. Primeiro então temos que configurar um <em>datasource</em> que vai trazer os dados de algum lugar. Note que esse <em>datasource</em> é utilizado apenas durante a edição do relatório. Quando formos executar o relatório dentro de um programa, teremos que passar o <em>datasource</em> programaticamente, mas isso nós vamos aprender depois. Pois bem, clique então no botão <em>Report datasources</em> (Fontes de dados do relatório). Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_502" class="wp-caption aligncenter" style="width: 287px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura71.png"><img class="size-full wp-image-502" title="Figura 7" src="http://davidbuzatto.files.wordpress.com/2010/10/figura71.png?w=640" alt="Figura 7"   /></a><p class="wp-caption-text">Botão Report datasources</p></div>
<p>&nbsp;</p>
<p>Ao clicar neste botão, a janela de gerenciamento de <em>datasources </em>será exibida. Por padrão, apenas um <em>datasource </em>vai estar configurado no iReport. Este <em>datasource</em>, o <em>Empty datasource</em> (fonte de dados vazia) pode ser utilizado para visualizarmos apenas a estrutura do relatório. Vamos então criar o datasource para a base de dados sakila. Para isso, clique no botão <em>New</em> (Novo). Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_503" class="wp-caption aligncenter" style="width: 500px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura81.png"><img class="size-full wp-image-503" title="Figura 8" src="http://davidbuzatto.files.wordpress.com/2010/10/figura81.png?w=640" alt="Figura 8"   /></a><p class="wp-caption-text">Gerenciador de datasources</p></div>
<p>&nbsp;</p>
<p>Ao clicar em <em>New</em>, uma nova janela será exibida. Nesta janela escolhemos o tipo de <em>datasource </em>que vamos utilizar. No nosso caso, é um <em>Database JDBC connection</em>, pois iremos obter os dados no nosso relatório utilizando uma query SQL, que por sua vez vai ser executada através de uma conexão JDBC. Por padrão, este tipo de <em>datasource </em>é o que vai estar selecionado no assistente. Caso não esteja selecionado, selecione-o e clique em <em>Next</em>. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_504" class="wp-caption aligncenter" style="width: 466px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura91.png"><img class="size-full wp-image-504" title="Figura 9" src="http://davidbuzatto.files.wordpress.com/2010/10/figura91.png?w=640" alt="Figura 9"   /></a><p class="wp-caption-text">Escolhendo o tipo de datasource</p></div>
<p>&nbsp;</p>
<p>Ao clicar em <em>Next</em>, a janela de configuração do <em>datasource </em>vai ser exibida. Nela precisamos preencher alguns campos:</p>
<ul>
<li><strong><em>Name</em></strong>: nome do <em>datasource</em>. Utilize &#8220;Sakila &#8211; JDBC&#8221; (sem as aspas);</li>
<li><strong>JDBC Driver</strong>: o tipo de driver que vamos utilizar. No nosso caso, é o driver do MySQL;</li>
<li><strong>JDBC URL</strong>: endereço do banco de dados que queremos utilizar. No nosso caso é &#8220;jdbc:mysql://localhost/sakila&#8221; (sem as aspas);</li>
<li><strong><em>Username</em></strong>: nome do usuário. Estamos trabalhando em um ambiente de desenvolvimento, então vamos usar o root;</li>
<li><strong><em>Password</em></strong>: senha do usuário. No meu caso a senha do root é root também;</li>
<li><strong><em>Save password</em></strong>: salvar a senha utilizada. Pode deixar marcada essa opção, se não, toda hora que fizermos uma conexão, o iReport vai pedir a senha do usuário.</li>
<li><strong>Obs</strong>: os campos <em>Server Address</em> e <em>Database </em>são preenchidos apenas se você quiser usar o <em>Wizard </em>(botão <em>Wizard</em>) para preencher a URL de conexão. Como já sabemos o formato da URL para o MySQL e já preenchemos o endereço, não precisamos usar esses campos do <em>Wizard</em>.</li>
</ul>
<p>Com tudo preenchido, clique em <em>Save</em> (Salvar). Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_505" class="wp-caption aligncenter" style="width: 466px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura101.png"><img class="size-full wp-image-505" title="Figura 10" src="http://davidbuzatto.files.wordpress.com/2010/10/figura101.png?w=640" alt="Figura 10"   /></a><p class="wp-caption-text">Configurando o novo datasource</p></div>
<p>&nbsp;</p>
<p>Ao salvar o <em>datasource</em>, a janela anterior será exibida, mostrando que o novo <em>datasource </em>foi configurado e está marcado como <em>default</em> (Padrão). Clique em <em>Close </em>para fechar a janela. Fazendo isso, você vai ver que o <em>combobox</em> que contém os <em>datasources </em>estará exibindo o <em>datasource</em> padrão, ou seja, o &#8220;Sakila &#8211; JDBC&#8221; que criamos. Isso significa que quando formos criar uma <em>query </em>SQL no nosso relatório ou formos executá-lo para testar (<em>Preview</em>), o iReport vai usar o <em>datasource </em>que estiver selecionado neste combo. Novamente, reforço a ideia que este <em>datasource </em>é utilizado APENAS durante o desenvolvimento do relatório, seja na montagem de queries ou testes do relatório. Quando formos colocar o relatório para ser aberto em nosso programa, teremos que passar programaticamente o <em>datasource </em>que o nosso relatório irá usar. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_506" class="wp-caption aligncenter" style="width: 277px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura111.png"><img class="size-full wp-image-506" title="Figura 11" src="http://davidbuzatto.files.wordpress.com/2010/10/figura111.png?w=640" alt="Figura 11"   /></a><p class="wp-caption-text">Datasource &quot;Sakila - JDBC&quot; selecionado</p></div>
<p>&nbsp;</p>
<p>Muito bem. Configuramos o <em>datasource </em>que vamos utilizar e ele já está selecionado. Vamos agora ao relatório. Vamos agora editar a <em>query</em> SQL do Clientes.jrxml. Para isso, clique no botão que está destacado na Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_507" class="wp-caption aligncenter" style="width: 500px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura121.png"><img class="size-full wp-image-507" title="Figura 12" src="http://davidbuzatto.files.wordpress.com/2010/10/figura121.png?w=640" alt="Figura 12"   /></a><p class="wp-caption-text">Acessando o editor de queries</p></div>
<p>&nbsp;</p>
<p>Ao clicar no botão, a janela mostrada na Figura abaixo vai ser exibida.</p>
<p>&nbsp;</p>
<div id="attachment_509" class="wp-caption aligncenter" style="width: 471px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura131.png"><img class="size-full wp-image-509" title="Figura 13" src="http://davidbuzatto.files.wordpress.com/2010/10/figura131.png?w=640" alt="Figura 13"   /></a><p class="wp-caption-text">Editor de queries</p></div>
<p>&nbsp;</p>
<p>Nesta janela é que vamos editar a <em>query </em>do nosso relatório. Ao inserir a <em>query</em>, os campos que ela retorna serão automaticamente carregados. Para este relatório, queremos listar todos os Clientes da locadora de DVDs, então iremos usar a query &#8220;SELECT * FROM customer;&#8221; (sem as aspas). Assim que a <em>query </em>for preenchida e executada com sucesso, todos os campos que  a execução dela retornar serão carregados, sendo que seus respecitvos tipos também serão obtidos. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_510" class="wp-caption aligncenter" style="width: 471px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura141.png"><img class="size-full wp-image-510" title="Figura 14" src="http://davidbuzatto.files.wordpress.com/2010/10/figura141.png?w=640" alt="Figura 14"   /></a><p class="wp-caption-text">Execução da query e carga dos campos</p></div>
<p>&nbsp;</p>
<p>Observando a Figura acima, você pode perceber que ao executar a <em>query </em>informada foram obtidos os campos customer_id (tipo Integer), store_id (tipo Integer), first_name (tipo String) e assim por diante. Ao clicar em OK, esses campos (note que estão selecionados) serão inseridos na definição do relatório, bastando agora nós pegarmos esses campos e inserir cada um deles, ou os que nos forem relevantes, no <em>Design </em>do relatório. Para pegar os campos, expanda o nó <em>Fields</em> (Campos) do <em>Report Inspector</em>. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_511" class="wp-caption aligncenter" style="width: 353px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura151.png"><img class="size-full wp-image-511" title="Figura 15" src="http://davidbuzatto.files.wordpress.com/2010/10/figura151.png?w=640" alt="Figura 15"   /></a><p class="wp-caption-text">Campos inseridos na definiçao do relatório</p></div>
<p>&nbsp;</p>
<p>Suponha que queremos mostrar em nosso relatório apenas o nome, o sobrenome e o e-mail de cada cliente. Sendo assim, selecione primeiro o campo &#8220;first_name&#8221; e arraste para a banda <em>Detail </em>do relatório. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_512" class="wp-caption aligncenter" style="width: 644px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura161.png"><img class="size-full wp-image-512" title="Figura 16" src="http://davidbuzatto.files.wordpress.com/2010/10/figura161.png?w=640" alt="Figura 16"   /></a><p class="wp-caption-text">Iniciando a criação do relatório</p></div>
<p>&nbsp;</p>
<p>Note que onde você soltou o campo fist_name (na bada <em>Detail</em>), foi inserida uma caixa de texto do tipo Text Field (veja a paleta de componentes) com o valor $F{first_name}, onde $F denota o uso de um campo (F de <em>Field</em>) e o valor entre chaves é o nome do campo. Na banda <em>Column Header</em> foi inserida outra caixa de texto, só que apenas com o valor first_name. Essa caixa de texto inserida no cabeçalho da coluna é do tipo Static Text, ou seja, é um texto estático. Vamos mudar então o valor dessa segunda caixa para &#8220;Nome&#8221; (sem as aspas) e organizar tanto a caixa de texto estático quanto a de texto dinâmico. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_513" class="wp-caption aligncenter" style="width: 644px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura171.png"><img class="size-full wp-image-513" title="Figura 17" src="http://davidbuzatto.files.wordpress.com/2010/10/figura171.png?w=640" alt="Figura 17"   /></a><p class="wp-caption-text">Organizando o relatório</p></div>
<p>&nbsp;</p>
<p>Vamos testar agora o relatório, afinal, queremos vê-lo funcionando. Procure pelo botão <em>Preview </em>e clique nele. O relatório será compilado e exibido. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_514" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura181.png"><img class="size-full wp-image-514" title="Figura 18" src="http://davidbuzatto.files.wordpress.com/2010/10/figura181.png?w=640&#038;h=446" alt="Figura 18" width="640" height="446" /></a><p class="wp-caption-text">Visualizando o relatório</p></div>
<p>&nbsp;</p>
<p>Legal, já estamos vendo os dados que vem do banco de dados no relatório, mas afinal, qual o motivo de um nome estar tão distante do outro? O motivo é que a banda <em>Detail</em> está muito alta. A altura da banda <em>Detail</em> sempre vai ser replicada para cada registro encontrado. Então, para melhorar isso, vamos diminuir a altura da banda <em>Detail</em>. Volte então na visualização no <em>Designer </em>(usando o botão <em>Designer</em>), selecione a linha azul no limite inferior da banda <em>Detail</em> e arraste até chegar na altura desejada. Caso você queira que a banda fique com o tamanho do conteúdo dela (o que tem dentro dela), clique duas vezes na linha azul. A banda vai ser redimensionada automaticamente. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_515" class="wp-caption aligncenter" style="width: 641px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura191.png"><img class="size-full wp-image-515" title="Figura 19" src="http://davidbuzatto.files.wordpress.com/2010/10/figura191.png?w=640" alt="Figura 19"   /></a><p class="wp-caption-text">Banda detail redimensionada</p></div>
<p>&nbsp;</p>
<p>Teste novamente o relatório. Você vai notar que agora os nomes estão mais perto um do outro. Agora, como exercício, arraste os campos last_name e email para o relatório (na banda <em>Detail</em>) e organize-os. Note que você pode redimensionar cada campo tanto na largura quanto na altura. Outra tarefa é voltar ao editor da <em>query </em>do relatório e inserir o comando ORDER BY na <em>query</em>, para ordenar os registros pelo nome (first_name). Quando fizer tudo isso e mandar visualizar, o resultado deve ser algo parecido com o apresentado na Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_516" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura201.png"><img class="size-full wp-image-516" title="Figura 20" src="http://davidbuzatto.files.wordpress.com/2010/10/figura201.png?w=640&#038;h=447" alt="Figura 20" width="640" height="447" /></a><p class="wp-caption-text">Relatório atualizado</p></div>
<p>&nbsp;</p>
<p>Vamos deixar agora o relatório um pouco mais apresentável. Da mesma forma que fez com a banda <em>Detail</em>, diminua agora banda <em>Colum Header</em>. Clique com o botão direito na banda <em>Page Header</em> e escolha <em>Delete band</em>. Na banda Title, insira uma caixa de texto estática, troque o valor do texto para &#8220;Clientes Cadastrados&#8221; (sem as aspas). Utilize o editor de propriedades do componente (área 5 da Figura onde são apresentadas as áreas do iReport) para configurar o tamanho da fonte do componente para 26, negrito (<em>bold</em>), configure o alinhamento horizontal (<em>horizontal alignment</em>) para centro (<em>center</em>) e o alinhamento vertical (<em>vertical alignment</em>) para meio (<em>middle</em>). Expanda o campo de texto para ele ocupar toda a largura da página do relatório. Configure os campos que definem as colunas da banda detail (aqueles campos de texto contidos no cabeçalho) para ficarem em negrito. Execute novamente o relatório. Na Figura abaixo é mostrado como seu relatório deve ter ficado no <em>Preview</em>.</p>
<p>&nbsp;</p>
<div id="attachment_517" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura211.png"><img class="size-full wp-image-517" title="Figura 21" src="http://davidbuzatto.files.wordpress.com/2010/10/figura211.png?w=640&#038;h=445" alt="Figura 21" width="640" height="445" /></a><p class="wp-caption-text">Editando o relatório</p></div>
<p>&nbsp;</p>
<p>Para finalizar o <em>design </em>do nosso relatório, vamos adicionar o número de página na banda Page Footer. No Report Inspector, procure pelo nó Variables e expanda-o. Uma das variáveis pré-configuradas se chama PAGE_NUMBER. Arraste-a para o lado direito da banda <em>Page Footer</em> e configure o alinhamento horizontal do texto para a direita (right). Dimensione a altura da banda <em>Page Footer</em> para ficar do tamanho do campo que foi inserido. Delete as bandas <em>Column Footer</em> e <em>Summary </em>(clique com o botão direito e escolha <em>delete band</em> em cada uma delas). O design do relatório deve estar como o da Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_518" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura221.png"><img class="size-full wp-image-518" title="Figura 22" src="http://davidbuzatto.files.wordpress.com/2010/10/figura221.png?w=640&#038;h=217" alt="Figura 22" width="640" height="217" /></a><p class="wp-caption-text">Design final do relatório</p></div>
<p>&nbsp;</p>
<p>Teste seu relatório e veja que o número da página será exibido no final de cada página. Note que o campo do campo de texto que foi inserido (um campo dinâmico) é $V{PAGE_NUMBER}, sendo que o $V denota o uso de uma variável e o valor entre chaves é o nome de variável. Ainda vamos ver como criar variáveis e parâmetros manualmente (ainda não falei dos parâmetros).</p>
<p>Agora que já conseguimos criar nosso primeiro relatório, nós vamos aprender um detalhe muito importante que se conhecido, muitos problemas podem ser evitados. Quando usamos uma <em>query </em>no editor de <em>queries </em>e o iReport cria automaticamente os campos (<em>Fields</em>) para nós, ele atributi automaticamente um tipo para cada campo, dependendo, é claro, do tipo que aquele campo tem quando ele é obtido. Ou seja, first_name é um campo VARCHAR na tabela customer, então quando esse valor é obtido no iReport é criado um campo, com o nome first_name (o nome que vem por padrão) do tipo String, que é a representação para cadeias de caracteres em Java.</p>
<p>Quando queremos usar um campo no nosso relatório, nós podemos arrastar ele diretamente do <em>Report Inspector</em> para o relatório que o iReport vai se preocupar em criar um campo dinâmico (<em>Text Field</em> na paleta) e inserir o valor $F{nome_do_campo} dentro do campo dinâmico. Um detalhe que não vemos acontecer, justamente porque o iReport faz automáticamente, é a configuração do tipo do campo dinâmico. O tipo do campo dinâmico tem que ser SEMPRE igual ao tipo do campo que é utilizado.</p>
<p>Para entender o que eu falei, vamos fazer o seguinte teste. No relatório que estamos criando, arraste para a banda <em>Detail </em>- na frente do campo para e-mail &#8211; um campo dinâmico (<em>Text Field</em> na paleta). Por padrão, o valor do campo vai ser $F{field}. Se você tentar executar o relatório, o iReport vai reclamar, falando que o campo &#8220;field&#8221; não existe. Isso é uma verdade, visto que nenhum campo com o nome field foi criado não é mesmo? Vamos substituir o valor field para customer_id. O campo vai ficar então com o valor $F{customer_id}. Tente executar o relatório para ver o que acontece. Funcionou? Não! Mas qual o motivo? O erro diz &#8220;<em>Cannot cast from Integer to String</em>&#8220;. Isso quer dizer que o valor do campo customer_id é um Integer e o JasperReports está sendo instruido a fazer um cast explícito de Integer para String. Mas de onde vem essa String? Lembram que falei que o campo dinâmico (<em>Text Field</em>) tem que ter o mesmo tipo de um campo? Ou seja, o campo customer_id é do tipo Integer (inferido na criação da <em>query</em>), enquanto o campo dinâmico que está inserido no relatório é do tipo String. O que temos que fazer? Mudar o tipo do campo dinâmico. Para isso, selecione o campo dinâmico que está na banda <em>Detail</em> e procure pela propriedade &#8220;<em>expression class</em>&#8221; na guia de propriedades do editor. O valor que estará lá é java.lang.String. Vamos mudar para java.lang.Integer. Ao fazer isso, teste novamente o relatório. Agora funcinou não é? Então, tenha sempre em mente que o tipo de um campo dinâmico tem que SEMPRE SER DO MESMO TIPO que o campo ($F), a variável ($V), o parâmetro ($P), ou o resultado de uma expressão que for executada na propriedade <em>Text Field Expression</em> do campo dinâmico.</p>
<p>Legal, agora nós vamos fazer esse relatório ser executado a partir de um programa. Lembram que eu falei que para um relatório ser executado, nós precisaríamos passar o <em>datasource </em>que nós queremos que ele use? Pois bem, no nosso caso, o nosso <em>datasource </em>é uma conexão JDBC (java.sql.Connection), sendo assim, vamos precisar criar conexões  para passar para a <em>engine </em>de execução do relatório. Vamos então criar uma fábrica de conexões para utilizarmos. Essa fábrica é uma classe, com o nome ConnectionFactory. Para criar a classe, primeiramente vá para a aba <em>Projects</em> do NetBeans (canto superior esquerdo) expanda o nó <em>Source Packages</em> (pacotes de código fonte) do nosso projeto, e no pacote &#8220;tutorialrelatorios&#8221;, crie um pacote chamado &#8220;jdbc&#8221; (sem as aspas). Dentro então do pacote jdbc, crie uma classe chamada ConnectionFactory. Segue o código comentado da classe.</p>
<blockquote><p><em><strong><span style="color:#ff9900;">tutorialrelatorios.jdbc.</span>ConnectionFactory.java</strong></em></p></blockquote>
<p><pre class="brush: java;">package tutorialrelatorios.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Uma fábrica de conexões.
 *
 * @author David Buzatto
 */
public class ConnectionFactory {

    /*
     * Este bloco estático será executado assim que esta classe for carregada,
     * sendo assim, será executado apenas uma vez.
     */
    static {
        try {
            /*
             * Carrega a classe com.mysql.jdbc.Driver, que é a implementação
             * do driver JDBC para o MySQL.
             */
            Class.forName( &quot;com.mysql.jdbc.Driver&quot; );

            // caso a classe não seja encontrada
        } catch ( ClassNotFoundException exc ) {

            /*
             * Como log usaremos o stacktrace das excessões, mas recomendo
             * que para um projeto real você utilize algum mecanismo de log
             * melhor, como o Log4J por exemplo.
             */
            exc.printStackTrace();

        }
    }

    /**
     * O método getConnection retorna uma conexão com o banco de dados baseado
     * nos parâmetros fornecidos.
     *
     * @param url O endereço da base de dados.
     * @param usuario O usuário que tem permissão na base de dados especificada.
     * @param senha A senha do usuário especificado
     * @return Uma conexão com o banco de dados especificado na url.
     * @throws SQLException Caso ocorra algum problema durante a conexão.
     */
    public static Connection getConnection(
            String url,
            String usuario,
            String senha ) throws SQLException {

        // retorna a conexão a partir do método getConnection de DriverManager
        return DriverManager.getConnection( url, usuario, senha );

    }

    /**
     * Obtém uma conexão para a base de dados sakila.
     *
     * @return Uma conexão para a base de dados sakila.
     * @throws SQLException Caso ocorra algum problema durante a conexão.
     */
    public static Connection getSakilaConnection() throws SQLException {

        return getConnection(
                &quot;jdbc:mysql://localhost/sakila&quot;,
                &quot;root&quot;,
                &quot;root&quot; );

    }

}</pre></p>
<p>Usando o método getSakilaConnection() iremos então obter conexões para a base de dados sakila, sendo que essa conexão será utilizada pelo JasperReports para executar as queries que forem definidas nos relatórios.</p>
<p>Além da fábrica de conexões, vamos criar também uma classe que conterá métodos utilitários para abrir relatórios. Para isso, crie um pacote chamado &#8220;utils&#8221; (sem as aspas) dentro do pacote &#8220;tutorialrelatorios&#8221;. Dentro do pacote criado, crie uma classe com o nome de ReportUtils. Segue o código comentado da classe.</p>
<blockquote><p><em><strong><span style="color:#ff9900;">tutorialrelatorios.util.</span>ReportUtils.java</strong></em></p></blockquote>
<p><pre class="brush: java;">package tutorialrelatorios.util;

import java.awt.BorderLayout;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Map;
import javax.swing.JFrame;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.swing.JRViewer;

/**
 * Classe com métodos utilitários para executar e abrir relatórios.
 *
 * @author David Buzatto
 */
public class ReportUtils {

    /**
     * Abre um relatório usando uma conexão como datasource.
     *
     * @param titulo Título usado na janela do relatório.
     * @param inputStream InputStream que contém o relatório.
     * @param parametros Parâmetros utilizados pelo relatório.
     * @param conexao Conexão utilizada para a execução da query.
     * @throws JRException Caso ocorra algum problema na execução do relatório
     */
    public static void openReport(
            String titulo,
            InputStream inputStream,
            Map parametros,
            Connection conexao ) throws JRException {

        /*
         * Cria um JasperPrint, que é a versão preenchida do relatório,
         * usando uma conexão.
         */
        JasperPrint print = JasperFillManager.fillReport(
                inputStream, parametros, conexao );

        // abre o JasperPrint em um JFrame
        viewReportFrame( titulo, print );

    }

    /**
     * Abre um relatório usando um datasource genérico.
     *
     * @param titulo Título usado na janela do relatório.
     * @param inputStream InputStream que contém o relatório.
     * @param parametros Parâmetros utilizados pelo relatório.
     * @param dataSource Datasource a ser utilizado pelo relatório.
     * @throws JRException Caso ocorra algum problema na execução do relatório
     */
    public static void openReport(
            String titulo,
            InputStream inputStream,
            Map parametros,
            JRDataSource dataSource ) throws JRException {

        /*
         * Cria um JasperPrint, que é a versão preenchida do relatório,
         * usando um datasource genérico.
         */
        JasperPrint print = JasperFillManager.fillReport(
                inputStream, parametros, dataSource );

        // abre o JasperPrint em um JFrame
        viewReportFrame( titulo, print );

    }

    /**
     * Cria um JFrame para exibir o relatório representado pelo JasperPrint.
     *
     * @param titulo Título do JFrame.
     * @param print JasperPrint do relatório.
     */
    private static void viewReportFrame( String titulo, JasperPrint print ) {

        /*
         * Cria um JRViewer para exibir o relatório.
         * Um JRViewer é uma JPanel.
         */
        JRViewer viewer = new JRViewer( print );

        // cria o JFrame
        JFrame frameRelatorio = new JFrame( titulo );

        // adiciona o JRViewer no JFrame
        frameRelatorio.add( viewer, BorderLayout.CENTER );

        // configura o tamanho padrão do JFrame
        frameRelatorio.setSize( 500, 500 );

        // maximiza o JFrame para ocupar a tela toda.
        frameRelatorio.setExtendedState( JFrame.MAXIMIZED_BOTH );

        // configura a operação padrão quando o JFrame for fechado.
        frameRelatorio.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );

        // exibe o JFrame
        frameRelatorio.setVisible( true );

    }

}</pre></p>
<p>Não vamos criar uma interface gráfica para executar nosso relatório, pois vamos abri-lo diretamente da classe Main do projeto. Perceba que o código usado na classe Main é o mesmo que você vai utilizar, por exemplo, para abrir o relatório a partir do clique de um botão, mas antes disso, mais alguns detalhes. Quando fazemos o <em>preview </em>do relatório, o iReport invoca o compilador do JasperReports para compilar o arquivo .jrxml em um arquivo .jasper, para então executar o arquivo .jasper, abrindo assim o relatório. Você deve ter percebido que agora, além do arquivo Clientes.jrxml, existe também o arquivo Clientes.jasper na nossa pasta de definições de relatórios. Se você quiser compilar manualmente um relatório sem entrar no <em>preview</em> do mesmo, basta ir no <em>Report Inspector</em>, com o relatório desejado aberto, clicar com o botão direito no nó raiz do relatório, que por padrão tem o nome de &#8220;<em>report name</em>&#8221; (nome do relatório) e escolher <em>Compile Report</em> (Compilar Relatório).</p>
<p>Vamos então executar nosso relatório a partir do método main da classe Main do nosso projeto. Segue o código comentado da classe.</p>
<p><pre class="brush: java;">package tutorialrelatorios;

import java.io.InputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import tutorialrelatorios.jdbc.ConnectionFactory;
import tutorialrelatorios.util.ReportUtils;

/**
 * Ponto de entrada do projeto.
 *
 * @author David Buzatto
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main().abrirRelatorioClientes();
    }

    public void abrirRelatorioClientes() {

        /*
         * Obtendo o arquivo do relatório.
         * Note que estamos utilizando um InputStream para obter o arquivo que
         * está dentro do nosso projeto. Fazendo isso, não teremos problema
         * quando nosso projeto for empacotado em um .jar.
         *
         * Note que o caminho do .jasper inicia com /, ou seja, a raiz da
         * localização das classes compiladas do nosso projeto
         * (o pacote default).
         *
         * Utilize a aba Files (canto superior esquerdo) e veja que os arquivos
         * .jasper e .jrxml são copiados para o diretório /build/classes
         * e por consequencia para o .jar que for criado.
         *
         * Se não os estiver vendo, mande dar um Clean and Build no projeto
         * (botão direito no nó raiz do projeto, Clean and Build (Limpar e Construir)
         *
         */
        InputStream inputStream = getClass().getResourceAsStream( &quot;/Clientes.jasper&quot; );

        // mapa de parâmetros do relatório (ainda vamos aprender a usar)
        Map parametros = new HashMap();

        try {

            // abre o relatório
            ReportUtils.openReport( &quot;Clientes&quot;, inputStream, parametros,
                    ConnectionFactory.getSakilaConnection() );

        } catch ( SQLException exc ) {
            exc.printStackTrace();
        } catch ( JRException exc ) {
            exc.printStackTrace();
        }

    }

}</pre></p>
<p>Tente executar o projeto teclando F6. Uma excessão será lançada (java.lang.ClassNotFoundException: com.mysql.jdbc.Driver). Isso se deve ao fato de que nós ainda não colocamos o <em>driver </em>do MySQL no nosso projeto! Clique então em <em>Libraries </em>com o botão direito e escolha <em>Add Library</em>. Como as bibliotecas do nosso projeto ficam inseridas no projeto e não nas configurações do NetBeans, temos que criar a biblioteca como fizemos com o JasperReports e suas dependências. Mas ao invés de fazer todo aquele processo na mão, nós podemos importar bibliotecas que estão configuradas no NetBeans sendo que o <em>driver </em>do MySQL é uma delas. Sendo assim, na janela que se abriu, clique no botão <em>Import</em>. Ao fazer isso, a janela<em> Import Library</em> irá aparecer. Procure pela biblioteca &#8220;MySQL JDBC Driver&#8221;, selecione-a e clique no botão <em>Import Library</em>. Com isso a biblioteca do <em>driver </em>do MySQL será importada para o projeto. Você vai ver ela na janela que apareceu novamente. Selecione-a e clique em <em>Add Library</em>. Após fazer isso, tecle F6 novamente para executar o projeto.</p>
<p>Agora sim, uma janela com o relatório será aberta. Experimente utilizar os controles da janela, tente salvar o relatório em vários formatos, etc. Após brincar um pouco com isso, feche a janela e vamos a mais algumas explicações para finalizarmos esta parte do tutorial.</p>
<p>Ao ler os comentários da classe Main, você deve ter percebido duas coisas. Primeiro, o arquivo .jrxml está sendo copiado para a estrutura compilada do nosso projeto (<em>build</em>) e por consequência, o arquivo .jrxml vai ser empacotado no .jar, sendo que só queremos distribuir o arquivo compilado (.jasper). Segundo, ainda não aprendemos a utilizar o mapa de parâmetros e ainda não foi explicado qual a sua utilidade.</p>
<p>Em relação ao primeiro problema, para excluir certos tipos de arquivos do processo de <em>build</em>, abra as propriedades do projeto e localize o nó <em>Packaging</em>, dentro do nó <em>Build</em>. Ao clicar nesta opção, você vai ver um campo chamado &#8220;<em>Exclude From JAR File</em>&#8220;. Neste campo, você informa o padrão de nome dos arquivos que você NÃO QUER que sejam inseridos no <em>build</em>. Por padrão, o valor é &#8220;**/*.java,**/*.form&#8221;, ou seja, qualquer arquivo, de qualquer diretório do projeto que tenha extensão &#8220;java&#8221; e qualquer arquivo, de qualquer diretório do projeto que tenha extensão &#8220;form&#8221;. Precisamos inserir então nessa lista os arquivos de extensão &#8220;jrxml&#8221;. Para fazer isso, basta adicionar um item na lista com o valor &#8220;**/*.jrxml&#8221; (sem as aspas). O valor final do campo deve ser &#8220;**/*.java,**/*.form, **/*.jrxml&#8221; (sem as aspas). Ao fazer isso, clique em OK e mande limpar e refazer o <em>build </em>no projeto (botão direito no nó raiz do projeto, opção <em>Clean and Build</em> &#8211; Limpar e Construir). Vá novamente na aba <em>Files</em> (canto superior esquerdo) e expanda a pasta /build/classes. Você vai ver que agora somente o arquivo .jasper está sendo copiado para o <em>build</em>.</p>
<p>Tudo bem até aqui? Espero que sim. Estamos acabando. Agora vamos a parte final, os parâmetros.</p>
<p>Quando criamos listagens de dados em relatórios, normalmente nós queremos filtrar tais dados, nos baseando em alguma restrição. Imagine que no nosso relatório de clientes, nós queiramos filtrar os clientes existentes a partir do primeiro nome deles. Para isso, teremos que inserir uma restrição na <em>query </em>do relatório para comparar o primeiro nome com o valor que queremos filtrar. Modificar a <em>query </em>é fácil, mas nós precisamos que esse valor que será utilizado na <em>query </em>seja dinâmico, ou seja, a cada vez que executarmos o relatório, queremos que o valor de restrição seja diferente. Para utilizar esses valores dinâmicos no iReport, nós usamos os chamados parâmetros. Vamos então fazer uma cópia do nosso primeiro relatório para inserirmos esse tipo de restrição.</p>
<p>Na aba <em>Projects</em>, procure pelo arquivo Clientes.jrxml na pasta de definições de relatórios. Clique com o botão direito nele e escolha <em>Copy</em> (Copiar). Clique com o botão direito no pacote <em>default </em>da pasta de definições de relatórios e escolha <em>Paste </em>(Colar). O arquivo será colado com o nome de Clientes_1.jrxml. Selecione o arquivo, tecle F2 (ou botão direito, <em>rename </em>- renomear) e troque o nome para ClientesPorNome.jrxml. Ao fazer isso, abra o ClientesPorNome.jrxml no editor de relatórios.</p>
<p>Com o arquivo aberto, vá no <em>Report Inspector</em> e procure pela banda <em>Page Header</em> que estará sendo exibida em cinza claro. Está assim porque ela foi removida lembra? Para fazer ela aparecer novamente no relatório, clique com o botão direito nela e escolha <em>Add Band</em> (Adicionar Banda). Ainda não vamos mexer com essa banda, mas só para adiantar, ela vai ser utilizada para mostrar o filtro que estamos fazendo.</p>
<p>Ainda no <em>Report Inspector</em>, procure pelo nó <em>Parameters </em>(Parâmetros) e expanda-o. Você vai ver que existem diversos parâmetros pré-configurados no nosso relatório. Nós queremos criar mais um. Para isso, clique com o botão direito em <em>Parameters</em> e escolha <em>Add Parameter</em>. Um novo parâmetro, com o nome &#8220;parameter1&#8243; vai ser criado. Selecione-o e troque o nome dele para &#8220;primeiroNome&#8221;. Perceba que ao selecionar um parâmetro, o editor de propriedades do iReport mostra diversas propriedades, entre elas a classe do parâmetro (<em>Parameter Class</em>). Da mesma forma que os campos e variáveis do relatório, os parâmetros também precisam de um tipo. Este parâmetro que estamos criando vai ser utilizado no filtro da <em>query</em>, ou seja, ele vai conter o valor que queremos utilizar como filtro. Um nome é uma String não é? Então a classe desse parâmetro é a java.lang.String mesmo, mas imagine que queiramos comprar um número. Então a classe teria que ser de algum tipo numérico ok?</p>
<p>Note também que a propriedade &#8220;<em>Use as prompt</em>&#8221; deve estar selecionada. Essa propriedade é utilizada para que quando formos dar o <em>preview </em>no relatório, seja aberto um diálogo para pedir o valor que queremos que o parâmetro assuma naquela execução. Execute o relatório para ver isso acontecer. Veja a Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_525" class="wp-caption aligncenter" style="width: 485px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura231.png"><img class="size-full wp-image-525" title="Figura 23" src="http://davidbuzatto.files.wordpress.com/2010/10/figura231.png?w=640" alt="Figura 23"   /></a><p class="wp-caption-text">Prompt de parâmetro</p></div>
<p>&nbsp;</p>
<p>Mesmo que você informe qualquer valor para o parâmetro, o resultado do relatório vai ser o mesmo, afinal, não inserimos o parâmetro na <em>query</em> do relatório não é mesmo? Vamos fazer isso agora. Abra o editor de <em>queries </em>do relatório e edite a <em>query</em> para ficar assim:</p>
<p><pre class="brush: sql;">SELECT * FROM customer
WHERE first_name LIKE $P{primeiroNome}
ORDER BY first_name;</pre></p>
<p>Após editar, clique em OK. Note que foi inserido uma cláusula WHERE na <em>query</em>, comparando o campo first_name com o valor do parâmetro, usando o operador LIKE. Note que para utilizarmos o valor do parâmetro, utilizamos a notação &#8220;$P{nomeDoParametro}&#8221;. Imagine que na hora da execução, o parâmetro assuma o valor &#8220;D%&#8221;, ou seja, queremos qualquer cliente com o nome que inicie com a letra D. A <em>query </em>na hora da execução ficaria assim:</p>
<p><pre class="brush: sql;">SELECT * FROM customer
WHERE first_name LIKE 'D%'
ORDER BY first_name;</pre></p>
<p>Perceberam o que estamos fazendo? Note que as aspas simples serão inseridas automaticamente pelo JasperReports na hora da execução, pois o parâmetro primeiroNome é uma String. Teste o relatório e passe no valor do paramâmetro como &#8216;D%&#8217; (sem as aspas). O resultado deve estar parecido com o da Figura abaixo.</p>
<p>&nbsp;</p>
<div id="attachment_526" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura24.png"><img class="size-full wp-image-526" title="Figura 24" src="http://davidbuzatto.files.wordpress.com/2010/10/figura24.png?w=640&#038;h=447" alt="Figura 24" width="640" height="447" /></a><p class="wp-caption-text">Resultado do relatório passando D% no valor do parâmetro</p></div>
<p>&nbsp;</p>
<p>Legal não é? Então caso você queira inserir mais restrições no relatório, basta criar mais parâmetros e ir modificando a <em>query</em>. Faça mais alguns testes <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Vamos agora mostrar para o usuário qual foi a restrição que foi pedida no relatório. Lembram da banda <em>Page Header</em> que colocamos novamente no relatório? Insira nela um campo de texto estático (<em>Static Text</em>) e preencha-o com o valor &#8220;Com nome:&#8221; (sem as aspas), alinhe o texto à direita e escolha para ficar em negrito (<em>bold</em>). Na frente deste campo, insia um campo dinâmico (<em>Text Field</em>) e edite seu valor para &#8220;$P{primeiroNome}&#8221; (sem as aspas). Percebeu o que estamos fazendo? Vamos mostrar o valor do parâmetro no relatório também! Lembre-se que o tipo do campo dinâmico tem que ser o mesmo do valor que ele vai mostrar, no caso uma String, que é o tipo do parâmetro &#8220;primeiroNome&#8221;. Coloquei também algumas linhas (componente <em>Line </em>da paleta) no relatório para ficar mais bonitinho <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Veja a Figura abaixo para ver como ficou.</p>
<p>&nbsp;</p>
<div id="attachment_527" class="wp-caption aligncenter" style="width: 645px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura25.png"><img class="size-full wp-image-527" title="Figura 25" src="http://davidbuzatto.files.wordpress.com/2010/10/figura25.png?w=640" alt="Figura 25"   /></a><p class="wp-caption-text">Design do relatório finalizado</p></div>
<p>&nbsp;</p>
<p>Muito bem! Agora, para que este novo relatório funcione corretamente quando formos utilizá-lo no nosso programa, nós precisamos passar o parâmetro que foi configurado não é mesmo? Lembram do mapa de parâmetros que foi criado? Do tipo Map&lt;String, Object&gt;? É nele que passamos o valor dos parâmetros. A chave do mapa é uma String, que vai corresponder ao nome do parâmetro (no nosso caso, primeiroNome). O valor do item do mapa é um Object, mas precisamos passar instâncias de objetos que casem com o tipo do parâmetro configurado no relatório. No nosso caso, primeiroNome é do tipo String lembram? Então o objeto que tem que ser passado no valor do item do mapa precisa ser uma String, por causa do tipo do parâmetro como já falei. Veja o código alterado do método abrirRelatorioClientes() da classe Main.</p>
<p><pre class="brush: java;">public void abrirRelatorioClientes() {

    // note que estamos chamando o novo relatório
    InputStream inputStream = getClass().getResourceAsStream( &quot;/ClientesPorNome.jasper&quot; );

    // mapa de parâmetros do relatório
    Map parametros = new HashMap();

    /*
     * Insere o parâmetro primeiroNome no mapa, com o valor F%
     * ou seja, todos os clientes que tenham primeiro nome começando
     * com a letra F.
     */
    parametros.put( &quot;primeiroNome&quot;, &quot;F%&quot; );

    // outros possíveis parâmetros aqui...

    try {

        // abre o relatório
        ReportUtils.openReport( &quot;Clientes&quot;, inputStream, parametros,
                ConnectionFactory.getSakilaConnection() );

    } catch ( SQLException exc ) {
        exc.printStackTrace();
    } catch ( JRException exc ) {
        exc.printStackTrace();
    }

}</pre></p>
<p>Perceba que caso existam mais parâmetros a serem enviados ao relatório, eles devem ser inseridos no mesmo mapa. Outro detalhe é que estamos apenas fazendo um exemplo e passando um valor fixo no parâmetro. Em um caso real, o valor a String &#8220;F%&#8221; viria de um campo de texto ou qualquer outro componente da sua interface gráfica.</p>
<p>Com isso terminamos a segunda parte do nosso tutorial. Espero que tenham gostado <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Na próxima parte iremos aprender a trabalhar com os &#8220;temidos&#8221; subrelatórios <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Digo &#8220;temidos&#8221; porque são um pouco chatos de usar e se você não souber realmente o que está fazendo e como eles funcionam, você pode ficar um dia inteiro tentando fazer funcionar e não conseguir <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p><a title="Download do projeto da segunda parte do tutorial" href="http://www.4shared.com/file/w6bGDgPH/TutorialRelatorios_-_parte_2.html" target="_blank"><strong>Neste link</strong></a> você pode fazer o <em>download</em> do código fonte do projeto até o momento.</p>
<p>Então é isso ai. Um grande abraço!</p>
<p><a title="Parte 1 do tutorial" href="http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/" target="_blank">Parte 1</a> &#8211; <strong>Parte 2</strong> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/463/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/463/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/463/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=463&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura110.png" medium="image">
			<media:title type="html">Figura 1</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura23.png" medium="image">
			<media:title type="html">Figura 2</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura31.png" medium="image">
			<media:title type="html">Figura 3</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura41.png" medium="image">
			<media:title type="html">Figura 4</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura51.png" medium="image">
			<media:title type="html">Figura 5</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura6-mod.png" medium="image">
			<media:title type="html">Figura 6</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura71.png" medium="image">
			<media:title type="html">Figura 7</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura81.png" medium="image">
			<media:title type="html">Figura 8</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura91.png" medium="image">
			<media:title type="html">Figura 9</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura101.png" medium="image">
			<media:title type="html">Figura 10</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura111.png" medium="image">
			<media:title type="html">Figura 11</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura121.png" medium="image">
			<media:title type="html">Figura 12</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura131.png" medium="image">
			<media:title type="html">Figura 13</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura141.png" medium="image">
			<media:title type="html">Figura 14</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura151.png" medium="image">
			<media:title type="html">Figura 15</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura161.png" medium="image">
			<media:title type="html">Figura 16</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura171.png" medium="image">
			<media:title type="html">Figura 17</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura181.png" medium="image">
			<media:title type="html">Figura 18</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura191.png" medium="image">
			<media:title type="html">Figura 19</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura201.png" medium="image">
			<media:title type="html">Figura 20</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura211.png" medium="image">
			<media:title type="html">Figura 21</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura221.png" medium="image">
			<media:title type="html">Figura 22</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura231.png" medium="image">
			<media:title type="html">Figura 23</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura24.png" medium="image">
			<media:title type="html">Figura 24</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura25.png" medium="image">
			<media:title type="html">Figura 25</media:title>
		</media:content>
	</item>
		<item>
		<title>JasperReports: Trabalhando com Relatórios em Java &#8211; Parte 1 (Configurando o Ambiente)</title>
		<link>http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/</link>
		<comments>http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 03:14:48 +0000</pubDate>
		<dc:creator>davidbuzatto</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Relatórios]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[jasperreports]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[relatório]]></category>

		<guid isPermaLink="false">http://davidbuzatto.wordpress.com/?p=419</guid>
		<description><![CDATA[Parte 1 &#8211; Parte 2 &#8211; Parte 3 &#8211; Parte 4 &#8211; Parte 5 Olá a todos. Quem acompanha o blog sabe que no último post &#8211; há duas semanas atrás &#8211; eu pedi que vocês sugerissem o tema para o próximo tutorial. Dentre os temas que eu listei, o de criação de relatórios em [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=419&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Parte 1</strong> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<p>Olá a todos. Quem acompanha o blog sabe que no último post &#8211; há duas semanas atrás &#8211; eu pedi que vocês sugerissem o tema para o próximo tutorial. Dentre os temas que eu listei, o de criação de relatórios em Java foi o que ganhou. Este tutorial, como o de Flex e Java, vai ser dividido em algumas partes. Eu poderia escrever em apenas um post tudo sobre o tema, mas preferi dividir o tutorial em várias partes pequenas &#8211; menores que os tutoriais sobre Flex &#8211; para não ficar muito cansativo.</p>
<p>Nesta primeira parte (provavelmente a maior de todas), iremos aprender sobre o <em>framework </em>para criação relatórios que iremos utilizar, o JasperReports, entendendo seu funcionamento, aprendendo a obter e instalar o iReport, que é o editor de relatórios e preparar nosso ambiente de desenvolvimento. Irei novamente utilizar o NetBeans como IDE de desenvolvimento, mas você que usa o Eclipse ou qualquer outra IDE Java não vai ter dificuldades para seguir o tutorial.</p>
<p>Na segunda parte, iremos criar uma base de dados de teste para popularmos nossos relatórios e vamos aprender como criar, compilar e utilizar os relatórios criados em aplicações <em>desktop</em>. Na terceira parte, iremos aprender a criar subrelatórios. Na quarta, iremos utilizar fontes de dados &#8211; <em>data sources</em> &#8211; diferentes, permitindo então que possamos listar dados nos relatórios que não vem somente de consultas SQL. Por fim, na quinta e última parte, iremos aprender como utilizar nossos relatórios em uma página Web. Após todas essas partes, vocês terão a bagagem necessária para caminharem sozinhos <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Então, vamos começar!</p>
<p>Existem atualmente na indústria diferentes <em>frameworks </em>e <em>engines </em>para criação e processamento de relatórios. Dentre as soluções pagas, talvez o <a title="Crystal Reports" href="http://crystalreports.com/" target="_blank">Crystal Reports</a> seja a mais conhecida. O Crystal Reports é uma solução robusta e que pode ser utilizada com diversas linguagens de programação. Outra solução paga que é muito utilizada por quem trabalha com Delphi é o Quick Reports. Em Java, existem atualmente duas soluções que são mais utilizadas. O <a title="JasperReports" href="http://jasperforge.org/" target="_blank">JasperReports</a>, que é o <em>framework </em>gratuito mais popular e que iremos utilizar nos nossos tutoriais e o <a title="BIRT" href="http://www.eclipse.org/birt/" target="_blank">BIRT</a> (<em>Business Intelligence and Reporting Tools</em>) que também é gratuito e é mais utilizado por quem trabalha com o Eclipse.</p>
<p>Como iremos utilizar o JasperReports, vale a pena então entendermos um pouco do seu funcionamento. Quando trabalhamos com ele, nós criamos os arquivos de código fonte dos nossos relatórios utilizando XML, sendo que esse arquivo fonte &#8211; de extensão .jrxml &#8211; passa por um processo de compilação para gerar gerar arquivos .jasper, que por sua vez são interpretados pela engine do JasperReports. Nós não iremos escrever esses arquivos .jrxml na mão, pois iremos construir nossos relatórios utilizando um editor WYSIWYG (<em>What You See Is What You Get</em>), o iReport. Atualmente, o iReport pode ser obtido em duas versões. Uma delas é <em>standalone</em> (criada usando a <em>NetBeans Platform</em>), não precisando de nenhum outro programa para ser utilizada, enquanto a outra é um <em>plugin </em>para o NetBeans. Iremos utilizar a versão em <em>plugin</em>.</p>
<p>Bem, já falei demais. Chega de blablablá, vamos começar a por a mão na massa, afinal essa é a melhor forma de aprender <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Primeiro vamos baixar o iReport. Acesse então o endereço <a title="Download iReport" href="http://jasperforge.org/projects/ireport" target="_blank">http://jasperforge.org/projects/ireport</a> e procure o link de <em>download</em>. Na versão atual do site, para fazer o <em>download</em>, basta clicar no botão &#8220;<em>Download iReport Now</em>&#8220;. Ao clicar no botão, serão apresentadas as versões disponíveis. Nós vamos escolher a última: <em>Plugin for NetBeans IDE 3.x</em>. A versão atual do iReport é a 3.7.5. Note que a versão do iReport sempre vai ser a mesma do JasperReports.</p>
<p>Quando terminar de baixar, descompacte o arquivo &#8220;iReport-3.7.5-plugin.zip&#8221; (a versão pode variar dependendo de quando você baixar o pacote). Serão extraídos 4 arquivos com a extensão .nbm (<em>NetBeans Module</em>). Esses arquivos são os pacotes dos <em>plugins </em>que serão instalados no NetBeans. Com o arquivo descompactado, abra então o seu NetBeans. Estou usando a útlima versão, 6.9.1. Com o NetBeans aberto, vá no menu <em>Tools </em>(Ferramentas) e escolha <em>Plugins</em>. Ao abrir o gerenciador de <em>plugins</em>, vá na aba <em>Downloaded </em>(Baixados?). É nessa aba que você instala os arquivos .nbm. Clique em <em>Add Plugins </em>(Adicionar <em>Plugins</em>). Veja a Figura abaixo:</p>
<div id="attachment_424" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura1.png"><img class="size-full wp-image-424" title="Figura 1" src="http://davidbuzatto.files.wordpress.com/2010/10/figura1.png?w=640&#038;h=398" alt="Figura 1" width="640" height="398" /></a><p class="wp-caption-text">Gerenciador de Plugins</p></div>
<p>Ao clicar no botão <em>Add Plugins</em>, um diálogo será aberto. Neste diálogo, procure então pelos arquivos .nbm que foram descompactados a partir do pacote que fizemos download. Assim que os encontrar, selecione todos e clique <em>Open </em>(Abrir). Veja a Figura abaixo.</p>
<div id="attachment_425" class="wp-caption aligncenter" style="width: 608px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura2.png"><img class="size-full wp-image-425" title="Figura 2" src="http://davidbuzatto.files.wordpress.com/2010/10/figura2.png?w=640" alt="Figura 2"   /></a><p class="wp-caption-text">Escolhendo os pacotes</p></div>
<p>Ao fazer isso, a janela do gerenciador de plugins será exibida novamente, só que agora com os quatro pacotes sendo exibidos. Deixe os quatro pacotes marcados e clique em <em>Install </em>(Instalar). Veja a Figura abaixo.</p>
<div id="attachment_426" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura3.png"><img class="size-full wp-image-426" title="Figura 3" src="http://davidbuzatto.files.wordpress.com/2010/10/figura3.png?w=640&#038;h=398" alt="Figura 3" width="640" height="398" /></a><p class="wp-caption-text">Gerenciador de Plugins (instalação)</p></div>
<p>No primeiro passo do instalador, clique em <em>Next</em> (Próximo). Marque o <em>checkbox </em>para concordar com os termos da instalação e clique em <em>Install</em>. Aguarde o final da instalação. Quando a instalação terminar, provavelmente o NetBeans vai pedir para ser reiniciado. Reinicie a IDE. Quando o ambiente estiver aberto novamente, você vai perceber que na barra de ferramentas foi inserido um novo botão e um <em>combobox</em>. Ainda não iremos aprender para que eles servem, por enquanto entenda que eles fazem parte do <em>plugin </em>do iReport. Veja a Figura abaixo.</p>
<div id="attachment_428" class="wp-caption aligncenter" style="width: 497px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura4.png"><img class="size-full wp-image-428" title="Figura 4" src="http://davidbuzatto.files.wordpress.com/2010/10/figura4.png?w=640" alt="Figura 4"   /></a><p class="wp-caption-text">Barra de ferramentas alterada</p></div>
<p>Com o iReport instalado, vamos agora preparar a estrutura de uma aplicação que iremos usar nas próximas partes do tutorial. Inicie a criação de um novo projeto no NetBeans escolhendo um projeto do tipo <em>Java Application</em> (Aplicação Java). Veja a Figura abaixo.</p>
<div id="attachment_429" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura5.png"><img class="size-full wp-image-429" title="Figura 5" src="http://davidbuzatto.files.wordpress.com/2010/10/figura5.png?w=640&#038;h=440" alt="Figura 5" width="640" height="440" /></a><p class="wp-caption-text">Novo projeto</p></div>
<p>Clique em <em>Next</em>. Em seguida, dê o nome ao projeto, sugiro &#8220;TutorialRelatorios&#8221; (sem as aspas), escolha onde o projeto vai ser salvo e marque a opção <em>Use Dedicated Folder for Storing Libraries</em> (essa opção vai fazer com que todos os arquivos .jar utilizados fiquem contidos dentro do projeto, sob o diretório &#8220;lib&#8221;), configure as outras opções de acordo com a Figura abaixo e clique em <em>Finish</em>.</p>
<div id="attachment_430" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura6.png"><img class="size-full wp-image-430" title="Figura 6" src="http://davidbuzatto.files.wordpress.com/2010/10/figura6.png?w=640&#038;h=440" alt="Figura 6" width="640" height="440" /></a><p class="wp-caption-text">Configurando o novo projeto</p></div>
<p>Ao clicar em Finish, o projeto vai ser criado. A partir de agora já poríamos começar a criar nossos relatórios no iReport, mas ainda faltam algumas configurações para que possamos fazer esses relatórios executarem dentro de uma aplicação. Para isso, ainda temos que adicionar o JasperReports no nosso projeto, bem como todas as suas dependências, além de termos também que organizar a estrutura do projeto para guardar nossos relatórios.</p>
<p>Primeiro vamos tratar dos .jars. Ao instalar os <em>plugins</em> do pacote do iReport, uma biblioteca padrão com os .jars é criada, mas ela vem com alguns erros, então vamos criar a nossa biblioteca para não termos dores de cabeça depois. Para isso, expanda o nó raiz do projeto e procure pelo nó <em>Libraries</em> (Bibliotecas). Clique com o botão direito e escolha <em>Add Library </em>(Adicionar Biblioteca). Veja a Figura abaixo.</p>
<div id="attachment_431" class="wp-caption aligncenter" style="width: 293px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura7.png"><img class="size-full wp-image-431" title="Figura 7" src="http://davidbuzatto.files.wordpress.com/2010/10/figura7.png?w=640" alt="Figura 7"   /></a><p class="wp-caption-text">Nova biblioteca</p></div>
<p>Ao clicar em<em> Add Library</em>, o diálogo para a inserção de bibliotecas será exibido. Neste diálogo, clique no botão<em> Create&#8230;</em> (Criar). Veja a Figura abaixo.</p>
<div id="attachment_432" class="wp-caption aligncenter" style="width: 382px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura8.png"><img class="size-full wp-image-432" title="Figura 8" src="http://davidbuzatto.files.wordpress.com/2010/10/figura8.png?w=640" alt="Figura 8"   /></a><p class="wp-caption-text">Criando uma nova biblioteca</p></div>
<p>Ao clicar em <em>Create</em>, será exibido um novo diálogo, onde o nome e o tipo da nova biblioteca devem ser definidos. Em <em>Library Name</em> (Nome da Biblioteca), configure como &#8220;JasperReports-3.7.5&#8243;, lembrando de mudar o número da versão caso esteja utilizando uma versão mais nova. Em <em>Library Type</em> (Tipo da Biblioteca), deixe como <em>Class Libraries</em> (Bibliotecas de Classe). Por fim, clique no botão OK. Veja a Figura abaixo.</p>
<div id="attachment_433" class="wp-caption aligncenter" style="width: 382px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura9.png"><img class="size-full wp-image-433" title="Figura 9" src="http://davidbuzatto.files.wordpress.com/2010/10/figura9.png?w=640" alt="Figura 9"   /></a><p class="wp-caption-text">Criando uma nova biblioteca</p></div>
<p>Ao clicar em OK, será exibido o diálogo <em>Customize Library</em> (Personalizar Biblioteca?). É nele que indicaremos os .jars que fazem parte da nossa biblioteca. Quando instalamos o <em>plugin</em> do iReport no NetBeans é criada uma pasta chamada &#8220;ireport&#8221; dentro do diretório de instalação e é lá que estão os .jars que precisamos. Sabendo disso, clique então no botão <em>Add JAR/Folder </em>(Adicionar JAR/Diretório). Veja a Figura abaixo.</p>
<div id="attachment_434" class="wp-caption aligncenter" style="width: 557px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura10.png"><img class="size-full wp-image-434" title="Figura 10" src="http://davidbuzatto.files.wordpress.com/2010/10/figura10.png?w=640" alt="Figura 10"   /></a><p class="wp-caption-text">Adicionando os JARs</p></div>
<p>Com o diálogo aberto, procure pelo diretório onde a instalação do NetBeans foi feita. No meu caso, ele foi instalado em C:\Program Files (x86)\NetBeans 6.9.1\. Dentro deste diretório, procure pelo diretório chamado &#8220;ireport&#8221; e entre nele. O conteúdo do diretório é exibido na Figura abaixo, sendo que os diretórios que nos interessam são o diretório &#8220;libs&#8221; e o diretório &#8220;modules&#8221; destacados na Figura.</p>
<div id="attachment_435" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura11.png"><img class="size-full wp-image-435" title="Figura 11" src="http://davidbuzatto.files.wordpress.com/2010/10/figura11.png?w=640&#038;h=349" alt="Figura 11" width="640" height="349" /></a><p class="wp-caption-text">libs e modules</p></div>
<p>Primeiramente, acesse o diretório &#8220;libs&#8221;. Dentro dele, existe apenas um .jar (para a versão 3.7.5 do iReports). Selecione esse .jar (xalan.jar) e clique em <em>Add JAR/Folder</em>. Veja a Figura abaixo.</p>
<div id="attachment_436" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura12.png"><img class="size-full wp-image-436" title="Figura 12" src="http://davidbuzatto.files.wordpress.com/2010/10/figura12.png?w=640&#038;h=349" alt="Figura 12" width="640" height="349" /></a><p class="wp-caption-text">Adicionando xalan.jar</p></div>
<p>Ao clicar, o NetBeans vai perguntar se você deseja mesmo criar um diretório dentro do diretório &#8220;libs&#8221; (aquele que vai guardar nossas bibliotecas) com o nome de JasperReports-3.7.5 (o nome que demos para a biblioteca, lebram?). Responda Sim. Veja a Figura abaixo.</p>
<div id="attachment_437" class="wp-caption aligncenter" style="width: 545px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura13.png"><img class="size-full wp-image-437" title="Figura 13" src="http://davidbuzatto.files.wordpress.com/2010/10/figura13.png?w=640" alt="Figura 13"   /></a><p class="wp-caption-text">Alerta de criação de novo diretório</p></div>
<p>Ao aceitar a criação do novo diretório, a janela <em>Customize Libraries </em>voltará a aparecer, agora com o xalan.jar sendo mostrado na lista de .jars. Além da pasta &#8220;libs&#8221;, precisamos adicionar também os .jars que estão dentro da pasta &#8220;modules&#8221;. Então clique novamente no botão Add JAR/Folder da janela <em>Customize Libraries </em>e entre no diretório &#8220;modules&#8221;. Dentro dele existirão alguns .jars, mas<strong> não são eles que queremos</strong>. Note que além dos .jars, existe um diretório chamado &#8220;ext&#8221;. Entre nele. Neste diretório estão TODAS as dependências do JasperReports. Para facilitar as coisas, iremos selecionar TODOS os .jars. Em um projeto real, o mais sensato seria selecionar apenas os .jars que você tem certeza que vão ser utilizados. Entretanto, esta abordagem traz um problema. O Jasper utiliza nos bastidores muitos desses .jars, mesmo que a gente pense que não. Um exemplo é o spring.jar <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> . E o pior! A cada versão, as dependências mudam (já tive vários problemas com isso). Minha recomendação é que você selecione TODOS os .jars, e depois, caso já utilize um deles (por exemplo o Hibernate) recomendo então que você atualize o .jar para a versão mais nova. Enfim, selecione TODOS e clique em <em>Add JAR/Folder</em>. Veja a Figura abaixo.</p>
<div id="attachment_438" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura14.png"><img class="size-full wp-image-438" title="Figura 14" src="http://davidbuzatto.files.wordpress.com/2010/10/figura14.png?w=640&#038;h=349" alt="Figura 14" width="640" height="349" /></a><p class="wp-caption-text">Jars do diretório modules/ext</p></div>
<p>Ao fazer isso, novamente a janela<em> Customize Library</em> vai ser exibida, mostrando que todos os .jars foram inseridos. Clique em OK. Ao clicar, o diálogo <em>Add Library</em> será exibido novamente, mas agora com a nova biblioteca criada. Selecione-a (já vai estar selecionada por padrão) e clique em <em>Add Library</em>. Veja a Figura abaixo.</p>
<div id="attachment_439" class="wp-caption aligncenter" style="width: 382px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura15.png"><img class="size-full wp-image-439" title="Figura 15" src="http://davidbuzatto.files.wordpress.com/2010/10/figura15.png?w=640" alt="Figura 15"   /></a><p class="wp-caption-text">Adicionando a biblioteca no projeto</p></div>
<p>Fazendo isso, o diálogo será fechado e você vai perceber que todos os .jars aparecerão dentro do projeto. Veja a Figura abaixo.</p>
<div id="attachment_440" class="wp-caption aligncenter" style="width: 310px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura16.png"><img class="size-full wp-image-440" title="Figura 16" src="http://davidbuzatto.files.wordpress.com/2010/10/figura16.png?w=640" alt="Figura 16"   /></a><p class="wp-caption-text">Projeto com a biblioteca adicionada</p></div>
<p>Ok, já temos a biblioteca configurada com todos os .jars do JasperReports. Agora vamos criar um diretório no nosso projeto para conter as definições dos nossos relatórios (arquivos .jrxml). Para isso, clique com o botão direito no nó raiz do projeto e escolha <em>Properties </em>(Propriedades). Veja a Figura abaixo.</p>
<div id="attachment_443" class="wp-caption aligncenter" style="width: 312px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura17.png"><img class="size-full wp-image-443" title="Figura 17" src="http://davidbuzatto.files.wordpress.com/2010/10/figura17.png?w=640" alt="Figura 17"   /></a><p class="wp-caption-text">Acessando as propriedades do projeto</p></div>
<p>Ao clicar em <em>Properties</em>, a janela de propriedades do projeto será exibida. Nesta janela, selecione o primeiro nó à esquerda (<em>Source</em> &#8211; Fonte) e do lado direito, na tabela <em>Source Package Folders</em>, clique em <em>Add Folder&#8230;</em> (Adicionar Diretório). Veja a Figura abaixo.</p>
<div id="attachment_444" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura18.png"><img class="size-full wp-image-444" title="Figura 18" src="http://davidbuzatto.files.wordpress.com/2010/10/figura18.png?w=640&#038;h=464" alt="Figura 18" width="640" height="464" /></a><p class="wp-caption-text">Propriedades do projeto</p></div>
<p>Ao clicar em <em>Add Folder</em>, um diálogo será exibido. Neste diálogo, clique no botão localizado no canto superior direito. Veja a Figura abaixo.</p>
<div id="attachment_445" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura19.png"><img class="size-full wp-image-445" title="Figura 19" src="http://davidbuzatto.files.wordpress.com/2010/10/figura19.png?w=640&#038;h=464" alt="Figura 19" width="640" height="464" /></a><p class="wp-caption-text">Botão para criar um novo diretório</p></div>
<p>Com isso, um novo diretório será criado. Dê o nome de &#8220;relatorios&#8221; (sem as aspas e sem acento agudo), selecione-o e clique em <em>Open</em>. Veja a Figura abaixo.</p>
<div id="attachment_449" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura20a.png"><img class="size-full wp-image-449" title="Figura 20" src="http://davidbuzatto.files.wordpress.com/2010/10/figura20a.png?w=640&#038;h=464" alt="Figura 20" width="640" height="464" /></a><p class="wp-caption-text">Diretório &quot;relatorios&quot; criado</p></div>
<p>Ao clicar em <em>Open</em>, o novo diretório será inserido na tabela <em>Source Package Folders</em>. Na primeira coluna é apresentado o caminho do diretório, enquanto na segunda coluna é apresentado o <em>label </em>que vai identificar esse diretório dentro do projeto. Clique duas vezes na célula da segunda coluna que corresponde ao <em>label </em>do diretório criado e dê o nome de &#8220;Relatórios&#8221;. Cuidado! Ao terminar de editar o nome, tecle &lt;ENTER&gt;. Veja a Figura abaixo.</p>
<div id="attachment_446" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura20.png"><img class="size-full wp-image-446" title="Figura 21" src="http://davidbuzatto.files.wordpress.com/2010/10/figura20.png?w=640&#038;h=464" alt="Figura 21" width="640" height="464" /></a><p class="wp-caption-text">Configurando o novo diretório</p></div>
<p>Ao fazer isso, o <em>label </em>será configurado (saindo da edição) e você agora deve clicar no botão OK das propriedades do projeto, aceitando assim as modificações que foram feitas. Veja a Figura abaixo.</p>
<div id="attachment_447" class="wp-caption aligncenter" style="width: 650px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura21.png"><img class="size-full wp-image-447" title="Figura 22" src="http://davidbuzatto.files.wordpress.com/2010/10/figura21.png?w=640&#038;h=464" alt="Figura 22" width="640" height="464" /></a><p class="wp-caption-text">Aceitando as configurações</p></div>
<p>Pronto, terminamos a configuração do projeto. Se tudo tiver dado certo, o novo diretório será exibido na estrutura do projeto, sendo que ele será identificado pelo <em>label </em>que foi configurado no passo anterior. Veja a Figura abaixo.</p>
<div id="attachment_448" class="wp-caption aligncenter" style="width: 310px"><a href="http://davidbuzatto.files.wordpress.com/2010/10/figura22.png"><img class="size-full wp-image-448" title="Figura 23" src="http://davidbuzatto.files.wordpress.com/2010/10/figura22.png?w=640" alt="Figura 23"   /></a><p class="wp-caption-text">Estrutura do projeto atualizada</p></div>
<p>Com isso terminamos a primeira parte do tutorial. Aprendemos alguns conceitos sobre o JasperReports e como instalar o iReport. Aprendemos também a criar e a inserir uma nova biblioteca no projeto, sendo que essa biblioteca corresponde aos .jars necessários para nós utilizarmos o JasperReports no nosso programa (quando formos abrir o relatório a partir do programa). Além disso, aprendemos a criar um diretório dedicado aos nossos relatórios. Então é isso. Terminamos a primeira parte do tutorial. Com o cenário pronto, agora podemos começar a brincar com o iReport e criar nossos primeiros relatórios.</p>
<p>O projeto completo até o momento pode ser obtido <a title="Download da primeira parte do tutorial" href="http://www.4shared.com/file/MTz6CMqH/TutorialRelatorios_-parte_1.html" target="_blank"><strong>neste link</strong></a>.</p>
<p>Fiquem ligados, a próxima parte vem ai <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Parte 1</strong> &#8211; <a title="Parte 2 do tutorial" href="http://davidbuzatto.com.br/2010/10/10/jasperreports-trabalhando-com-relatorios-em-java-parte-2-primeiros-relatorios/" target="_blank">Parte 2</a> &#8211; <a title="Parte 3 do tutorial" href="http://davidbuzatto.com.br/2010/10/14/jasperreports-trabalhando-com-relatorios-em-java-parte-3-subrelatorios/" target="_blank">Parte 3</a> &#8211; <a title="Parte 4 do tutorial" href="http://davidbuzatto.com.br/2010/11/11/jasperreports-trabalhando-com-relatorios-em-java-parte-4-diferentes-tipos-de-fontes-de-dados-data-sources/" target="_blank">Parte 4</a> &#8211; <a title="Parte 5 do tutorial" href="http://davidbuzatto.com.br/2010/11/12/jasperreports-trabalhando-com-relatorios-em-java-parte-5-relatorios-na-web/" target="_blank">Parte 5</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/davidbuzatto.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/davidbuzatto.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/davidbuzatto.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/davidbuzatto.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/davidbuzatto.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/davidbuzatto.wordpress.com/419/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/davidbuzatto.wordpress.com/419/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/davidbuzatto.wordpress.com/419/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=davidbuzatto.com.br&amp;blog=2465622&amp;post=419&amp;subd=davidbuzatto&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://davidbuzatto.com.br/2010/10/09/jasperreports-trabalhando-com-relatorios-em-java-parte-1/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/42bf17348e28505f5e6834106d9deee4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">davidbuzatto</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura1.png" medium="image">
			<media:title type="html">Figura 1</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura2.png" medium="image">
			<media:title type="html">Figura 2</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura3.png" medium="image">
			<media:title type="html">Figura 3</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura4.png" medium="image">
			<media:title type="html">Figura 4</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura5.png" medium="image">
			<media:title type="html">Figura 5</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura6.png" medium="image">
			<media:title type="html">Figura 6</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura7.png" medium="image">
			<media:title type="html">Figura 7</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura8.png" medium="image">
			<media:title type="html">Figura 8</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura9.png" medium="image">
			<media:title type="html">Figura 9</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura10.png" medium="image">
			<media:title type="html">Figura 10</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura11.png" medium="image">
			<media:title type="html">Figura 11</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura12.png" medium="image">
			<media:title type="html">Figura 12</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura13.png" medium="image">
			<media:title type="html">Figura 13</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura14.png" medium="image">
			<media:title type="html">Figura 14</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura15.png" medium="image">
			<media:title type="html">Figura 15</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura16.png" medium="image">
			<media:title type="html">Figura 16</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura17.png" medium="image">
			<media:title type="html">Figura 17</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura18.png" medium="image">
			<media:title type="html">Figura 18</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura19.png" medium="image">
			<media:title type="html">Figura 19</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura20a.png" medium="image">
			<media:title type="html">Figura 20</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura20.png" medium="image">
			<media:title type="html">Figura 21</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura21.png" medium="image">
			<media:title type="html">Figura 22</media:title>
		</media:content>

		<media:content url="http://davidbuzatto.files.wordpress.com/2010/10/figura22.png" medium="image">
			<media:title type="html">Figura 23</media:title>
		</media:content>
	</item>
	</channel>
</rss>
