<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">

<channel>
	<title>Daniel Sousa</title>
	
	<link>http://www.danielsousa.com.br/wp</link>
	<description>Um blog sobre tecnologia, internet, entre outros...</description>
	<lastBuildDate>Sat, 05 Feb 2011 22:38:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/danielsousawp" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="danielsousawp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Um blog sobre tecnologia, internet, entre outros...</itunes:subtitle><item>
		<title>Usando virtualização para gerar grandes relatórios no JasperReports</title>
		<link>http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 19:11:23 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[JasperReport / iReport]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[JasperReport]]></category>
		<category><![CDATA[java heap space]]></category>
		<category><![CDATA[JRFileVirtualizer]]></category>
		<category><![CDATA[JRGzipVirtualizer]]></category>
		<category><![CDATA[JRSwapFileVirtualizer]]></category>
		<category><![CDATA[OutOfMemoryException]]></category>
		<category><![CDATA[relatório]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[virtualização]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=264</guid>
		<description><![CDATA[Afim de possibilitar a geração de relatórios relativamente grandes, o JasperReports dispõe de um recurso chamado "virtualização". Ao gerar um relatório utilizando virtualização, o JasperReports busca gerenciar melhor a memória RAM utilizada para geração do mesmo, tentando assim, eliminar um grande incômodo chamado "OutOfMemoryException: Java heap space". Neste post, explico o funcionamento dos 3 virtualizadores: JRFileVirtualizer, JRSwapFileVirtualizer, e JRGzipVirtualizer.


Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2008/11/13/virtualizar-relatorio/' rel='bookmark' title='Permanent Link: Virtualizar Relatório'>Virtualizar Relatório</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/' rel='bookmark' title='Permanent Link: Usando o componente Table do iReport'>Usando o componente Table do iReport</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/08/13/participe-grupo-jasperreports-ireport-brasil/' rel='bookmark' title='Permanent Link: Participe:  Grupo JasperReports / iReport Brasil'>Participe:  Grupo JasperReports / iReport Brasil</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Afim de possibilitar a geração de relatórios relativamente grandes, o JasperReports dispõe de um recurso chamado &#8220;virtualização&#8221;. Ao gerar um relatório utilizando virtualização, o JasperReports busca gerenciar melhor a memória RAM utilizada para geração do mesmo, tentando assim, eliminar um grande incômodo chamado &#8220;OutOfMemoryException: Java heap space&#8221;.</p>
<p>Existem 3 tipos de virtualização: <strong>JRFileVirtualizer</strong>, <strong>JRSwapFileVirtualizer</strong>, e <strong>JRGzipVirtualizer</strong>. Cada uma gerencia a memória de forma distinta, cabe ao desenvolvedor identificar a situação e a que melhor se adequar ao seu problema. Neste artigo, pretendo explicar o funcionamento de cada um deles.</p>
<p><span id="more-264"></span></p>
<p>Observação Importante:<br />
Podemos dividir o processo de geração de um relatório em 2 fases:<br />
<strong> 1º: Preenchimento (ou Fill Phase):</strong> Nesta fase, busca-se os dados da fonte de dados (banco de dados, java beans, etc..), percorre esses dados gerando então o relatório final, podendo ser um objeto JasperPrint ou serializado em um arquivo &#8220;*.jrprint&#8221;. Ambos os formatos, são o relatório já pronto, crú, sem formato, podendo ser exibido apenas através da GUI fornecida pelo JasperReports. Nesta fase, o JasperReports não precisa se utilizar de APIs de terceiros para a criação do relatório em sí.<br />
<strong> 2º: Exportação (ou Export Phase):</strong> Nesta fase, é realizado apenas a conversão do relatório já pronto (JasperPrint) para algum formato conhecido, usando APIs de terceiros, tais como: PDF usando a <a title="Site do iText" href="http://itextpdf.com/" target="_blank">iText</a>, XLS usando <a title="Site da JExcelApi" href="http://jexcelapi.sourceforge.net/" target="_blank">JExcelApi</a> ou <a title="Site da API Apache POI" href="http://poi.apache.org/" target="_blank">Apache POI</a>, e muitos outros.</p>
<p><strong>É extremamente importante saber que o recurso de virtualização aplica-se exclusivamente à fase de Preenchimento (Fill Phase)</strong>. O JasperReports não tem controle de como as APIs de terceiros geram o formato específico (pdf, xls, docx, etc).</p>
<p>Portanto é necessário tomar cuidado com o formato de destino na fase de Exportação, pois dependendo do tamanho do relatório, ainda pode-se ter problemas. Ao exportar para xls, por exemplo, utilizando a JExcelApi, ela precisa que todo o conteúdo da planilha esteja em memória durante a criação do xls, logo é bem perigoso ter um OutOfMemory aqui, mesmo tendo gerado o JasperPrint com sucesso.  Em casos como este, não há muita escolha, senão aumentar o Heap Space da JVM e a  memória RAM da máquina.</p>
<p><strong><span style="font-size: medium;">JRFileVirtualizer &#8211; <span style="font-size: small;">[<a title="net.sf.jasperreports.engine.fill.JRFileVirtualizer" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/fill/JRFileVirtualizer.html" target="_blank">net.sf.jasperreports.engine.fill.JRFileVirtualizer</a>]</span></span></strong><br />
<strong> Construtores:</strong><br />
JRFileVirtualizer(int maxSize)<br />
JRFileVirtualizer(int maxSize, String directory)</p>
<p>Para este virtualizador, devemos informar o número de páginas que serão mantidas em memória (objetos JRPrintPage), e opcionalmente, um diretório onde as páginas em excesso serão salvas em arquivos, liberando a RAM, caso não seja informado um diretório, será utilizado o diretório em que a aplicação está rodando. A maior desvantagem desse virtualizador é um overhead na manipulação de arquivos. Ele cria muitos arquivos em disco em um único diretório durante o processo de virtualização, para então juntar todos eles e gerar o arquivo final *.jrprint (ou objeto JasperPrint). Se o dataset não for tão grande assim, pode-se utilizar esse virtualizador tranquilamente.</p>
<p>Se o numero de páginas informadas ao virtualizador for menor que o número de páginas que o relatório terá, o virtualizador não será utilizado, obviamente. Por exemplo: Se informado para manter no máximo 100 páginas em memória, e a fase de preenchimento gerou o relatório com apenas 80 páginas, o virtualizador nem chegou a ser usado.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">conexao <span style="color: #339933;">=</span> Conexao.<span style="color: #006633;">getConexao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Instancia o virtualizador, indicando a pasta onde serão gerados os arquivos</span>
JRAbstractLRUVirtualizer virtualizer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRFileVirtualizer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span>, <span style="color: #0000ff;">&quot;c:<span style="color: #000099; font-weight: bold;">\\</span>tmp&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Seta o parametro REPORT_VIRTUALIZER com a instância da virtualização</span>
<span style="color: #003399;">HashMap</span> parametros <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
parametros.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>JRParameter.<span style="color: #006633;">REPORT_VIRTUALIZER</span>, virtualizer<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Preenche o relatório e exibe numa GUI</span>
JasperPrint jp <span style="color: #339933;">=</span> JasperFillManager.<span style="color: #006633;">fillReport</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MeuRelatorio.jasper&quot;</span>, parametros, conexao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
JasperViewer.<span style="color: #006633;">viewReport</span><span style="color: #009900;">&#40;</span>jp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong><span style="font-size: medium;">JRSwapFileVirtualizer &#8211; <span style="font-size: small;">[<a title="net.sf.jasperreports.engine.fill.JRSwapFileVirtualizer" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/fill/JRSwapFileVirtualizer.html" target="_blank">net.sf.jasperreports.engine.fill.JRSwapFileVirtualizer</a>]</span></span></strong><br />
<strong>Construtores:</strong><br />
JRSwapFileVirtualizer(int maxSize, JRSwapFile swap)<br />
JRSwapFileVirtualizer(int maxSize, JRSwapFile swap, boolean swapOwner)</p>
<p>Este virtualizador elimina a desvantagem do JRFileVirtualizer. Ao invés de criar vários arquivos em disco, ele cria apenas um único arquivo de swap, que pode ir crescendo de tamanho conforme a necessidade Este arquivo de Swap pode inclusive ser utilizado por vários relatórios ao mesmo tempo. Para este virtualizador, deve-se informar:</p>
<p>- O número máximo de páginas mantidas em memória, igual ao JRFileVirtualizer;<br />
- Uma instância de um objeto JRSwapFile, que representa o arquivo que será usado como swap;<br />
- O terceiro parâmetro serve para dizer se o arquivo de swap será utilizado apenas nesta instância do JRSwapVirtualizer. Em caso de true, ele executa o método cleanup() ao terminar de ser utilizado, apagando o arquivo swap do disco.</p>
<p>Igualmente ao JRFileVirtualizer, este virtualizador só começa a ser utilizado se o número de páginas do relatório ultrapassar o número de páginas que devem ser mantidas em memória, no parâmetro &#8220;maxSize&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">conexao <span style="color: #339933;">=</span> Conexao.<span style="color: #006633;">getConexao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Instancia o arquivo de swap, informando:</span>
<span style="color: #666666; font-style: italic;">// Diretorio,</span>
<span style="color: #666666; font-style: italic;">// Tamanho de cada bloco (4kb)</span>
<span style="color: #666666; font-style: italic;">// Numero mínimo de blocos que o  swap será aumentado sempre que estiver cheio</span>
JRSwapFile arquivoSwap <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRSwapFile<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;c:<span style="color: #000099; font-weight: bold;">\\</span>tmp&quot;</span>, <span style="color: #cc66cc;">4096</span>, <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Instancia o virtualizador</span>
JRAbstractLRUVirtualizer virtualizer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRSwapFileVirtualizer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span>, arquivoSwap, <span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Seta o parametro REPORT_VIRTUALIZER com a instância da virtualização</span>
<span style="color: #003399;">HashMap</span> parametros <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
parametros.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>JRParameter.<span style="color: #006633;">REPORT_VIRTUALIZER</span>, virtualizer<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Preenche o relatório e exibe numa GUI</span>
JasperPrint jp <span style="color: #339933;">=</span> JasperFillManager.<span style="color: #006633;">fillReport</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MeuRelatorio.jasper&quot;</span>, parametros, conexao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
JasperViewer.<span style="color: #006633;">viewReport</span><span style="color: #009900;">&#40;</span>jp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong><span style="font-size: medium;">JRGzipVirtualizer &#8211; <span style="font-size: small;">[<a title="net.sf.jasperreports.engine.fill.JRGzipVirtualizer" href="http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/fill/JRGzipVirtualizer.html" target="_blank">net.sf.jasperreports.engine.fill.JRGzipVirtualizer</a>]</span></span></strong><br />
<strong> Construtor:</strong><br />
JRGzipVirtualizer(int maxSize)</p>
<p>Diferente dos outros dois virtualizadores, o JRGzipVirtualizer não escreve nada em arquivo físico. Ele otimiza o consumo de memória durante a geração, comprimindo as páginas diretamente na memória RAM, utilizando-se de um algoritmo GZIP. De acordo com a documentação oficial, ele reduz o consumo de memória num fator de 1/10.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">conexao <span style="color: #339933;">=</span> Conexao.<span style="color: #006633;">getConexao</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Instancia o virtualizador</span>
JRAbstractLRUVirtualizer virtualizer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JRGzipVirtualizer<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Seta o parametro REPORT_VIRTUALIZER com a instância da virtualização</span>
<span style="color: #003399;">HashMap</span> parametros <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">HashMap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
parametros.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>JRParameter.<span style="color: #006633;">REPORT_VIRTUALIZER</span>, virtualizer<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Preenche o relatório e exibe numa GUI</span>
JasperPrint jp <span style="color: #339933;">=</span> JasperFillManager.<span style="color: #006633;">fillReport</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;MeuRelatorio.jasper&quot;</span>, parametros, conexao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
JasperViewer.<span style="color: #006633;">viewReport</span><span style="color: #009900;">&#40;</span>jp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Então é isso pessoal. Caso tenham alguma dúvida a respeito, podem perguntar nos comentários, ou então peça um help pelo grupo de discussão: <a title="Página do grupo JasperReports / iReport Brasil" href="http://groups.google.com.br/group/jasperreports-ireport-brasil" target="_blank">http://groups.google.com.br/group/jasperreports-ireport-brasil</a></p>
<p>Se escrevi algo que consirem errado, ou falta algo, por favor, não deixem de comentar ok.</p>
<p>Abraço!</p>
<p>Fontes Principais:<br />
Livro: <a title="Página de venda do JasperReports Ultimate Guide" href="http://www.jaspersoft.com/jasperreports-ultimate-guide" target="_blank">The JasperReports Ultimate Guide<br />
</a>Site / Fórum: <a href="http://jasperforge.org/projects/jasperreports">http://jasperforge.org/projects/jasperreports</a></p>


<br /><p>Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2008/11/13/virtualizar-relatorio/' rel='bookmark' title='Permanent Link: Virtualizar Relatório'>Virtualizar Relatório</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/' rel='bookmark' title='Permanent Link: Usando o componente Table do iReport'>Usando o componente Table do iReport</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/08/13/participe-grupo-jasperreports-ireport-brasil/' rel='bookmark' title='Permanent Link: Participe:  Grupo JasperReports / iReport Brasil'>Participe:  Grupo JasperReports / iReport Brasil</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Paltalk: Para quem quer aprender Inglês</title>
		<link>http://www.danielsousa.com.br/wp/2010/08/21/paltalk-para-quem-quer-aprender-ingles/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/08/21/paltalk-para-quem-quer-aprender-ingles/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 00:02:15 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[aprender]]></category>
		<category><![CDATA[conversação]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[idioma]]></category>
		<category><![CDATA[inglês]]></category>
		<category><![CDATA[paltalk]]></category>
		<category><![CDATA[praticar]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=323</guid>
		<description><![CDATA[Durante o aprendizado de um outro idioma, um dos fatores mais importantes, além da real vontade de aprender é claro, é praticar a conversação.
Neste vídeo, apresento um programa chamado PalTalk. Com ele podemos interagir e conversar com pessoas de todo o planeta, praticando assim o idioma desejado, neste caso, o inglês.


Nenhum post relacionado.]]></description>
			<content:encoded><![CDATA[<p>Durante o aprendizado de um outro idioma, um dos fatores mais importantes, além da real vontade de aprender é claro, é praticar a conversação.</p>
<p>Uma das formas mais eficazes é realizar um intercâmbio, porém nem todos possuem recursos financeiros que possam bancar todo o custo necessário.. Mesmo assim, existem alternativas bem legais e de graça. Para quem não conhece, apresento-lhes o PalTalk.</p>
<p>No PalTalk, podemos praticar conversação com pessoas do mundo todo, via microfone, webcam ou simplesmente texto. Mas o mais interessante aqui, é usar o microfone.</p>
<p>O PalTalk é um programinha, no estilo MSN Messenger, porém  funciona de forma um pouco diferente. Lá, você procura salas de chat. Imagine o chat da UOL, onde existe diversas salas, divididas por temas. No PalTalk, as salas são criadas pelos próprios usuários,e muitas delas são dedicadas a prática do inglês.</p>
<p><span id="more-323"></span>Site para Download:  <a title="Site Oficial do Paltalk" href="http://www.paltalk.com" target="_blank">http://www.paltalk.com</a></p>
<p>Fiz um vídeo (12 minutos e com áudio) demonstrando para vocês como utilizá-lo. Espero que gostem =]</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="589" height="345" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blip.tv/play/he8EgfeVGAA%2Em4v" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="589" height="345" src="http://blip.tv/play/he8EgfeVGAA%2Em4v" allowfullscreen="true"></embed></object></p>


<br /><p>Nenhum post relacionado.</p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/08/21/paltalk-para-quem-quer-aprender-ingles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Participe:  Grupo JasperReports / iReport Brasil</title>
		<link>http://www.danielsousa.com.br/wp/2010/08/13/participe-grupo-jasperreports-ireport-brasil/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/08/13/participe-grupo-jasperreports-ireport-brasil/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 15:46:25 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[JasperReport / iReport]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[discussão]]></category>
		<category><![CDATA[grupo]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[JasperReport]]></category>
		<category><![CDATA[lista]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=309</guid>
		<description><![CDATA[Grupo de discussão sobre JasperReports / iReports Brasil: http://groups.google.com/group/jasperreports-ireport-brasil


Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/' rel='bookmark' title='Permanent Link: Usando virtualização para gerar grandes relatórios no JasperReports'>Usando virtualização para gerar grandes relatórios no JasperReports</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/' rel='bookmark' title='Permanent Link: Usando o componente Table do iReport'>Usando o componente Table do iReport</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/' rel='bookmark' title='Permanent Link: iReport &#8211; Componente Table: Como mesclar células'>iReport &#8211; Componente Table: Como mesclar células</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal!!<br />
Hoje procurei por alguma boa lista de discussão sobre essa ferramenta, e não encontrei nada assim aqui do Brasil.</p>
<p>Resolvi então criar um grupo para tal.</p>
<p>Espero que participem, usuários ou não, afim de podermos criar um ambiente onde a API e a ferramenta sejam o tema de foco central, e possamos ajudar e tirar dúvidas de outros usuários!</p>
<p><strong>JasperReports / iReport Brasil</strong><br />
<a class="vt-p" title="Grupo JasperReport / iReports Brasil" href="http://groups.google.com.br/group/jasperreports-ireport-brasil" target="_blank">http://groups.google.com.br/group/jasperreports-ireport-brasil</a></p>
<p>Participem! Quanto mais gente ajudar, melhor!<br />
Abraço! =]</p>


<br /><p>Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/' rel='bookmark' title='Permanent Link: Usando virtualização para gerar grandes relatórios no JasperReports'>Usando virtualização para gerar grandes relatórios no JasperReports</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/' rel='bookmark' title='Permanent Link: Usando o componente Table do iReport'>Usando o componente Table do iReport</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/' rel='bookmark' title='Permanent Link: iReport &#8211; Componente Table: Como mesclar células'>iReport &#8211; Componente Table: Como mesclar células</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/08/13/participe-grupo-jasperreports-ireport-brasil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iReport – Componente Table: Como mesclar células</title>
		<link>http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 03:26:02 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[JasperReport / iReport]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[JasperReport]]></category>
		<category><![CDATA[relatório]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[soudev]]></category>
		<category><![CDATA[tabela]]></category>
		<category><![CDATA[table]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=289</guid>
		<description><![CDATA[Neste post, ensino como mesclar células de um componente Table do iReport.


Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/' rel='bookmark' title='Permanent Link: Usando o componente Table do iReport'>Usando o componente Table do iReport</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2009/08/06/ireport-3-5-3/' rel='bookmark' title='Permanent Link: iReport 3.5.3'>iReport 3.5.3</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2008/11/13/virtualizar-relatorio/' rel='bookmark' title='Permanent Link: Virtualizar Relatório'>Virtualizar Relatório</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Uma tarefa comum quando utilizamos tabelas, seja no MS Word/Excel, etc&#8230; , é mesclar células.</p>
<p>Sendo assim, é de se esperar que possamos fazê-lo também com uma tabela feita no iReport. Essa não é uma tarefa tão simples, pois não existe uma opção explícita para fazê-la, é necessário prestar atenção nos detalhes.</p>
<p>Para mesclar duas células (ou mais), basicamente, é necessário selecionar as colunas delas, e então agrupá-las. Desse agrupamento, um novo elemento é criado na Table (visível apenas na árvore da tabela, no painel Report Inspector). Para que a célula mesclada apareça na tabela, basta clicar com o botão direto sobre esse novo elemento, e clicar em &#8220;Add Cell&#8221;.</p>
<p>Fiz um vídeo, comentado em áudio, demonstrando passo-a-passo como realizar esta tarefa, espero que ajude =]</p>
<p><embed src="http://blip.tv/play/he8EgequXQA%2Em4v" type="application/x-shockwave-flash" width="589" height="345" allowscriptaccess="always" allowfullscreen="true"></embed></p>
<p>Download do material do vídeo:</p>
<p><a title="Arquivo jrxml" href="http://www.danielsousa.com.br/videos/iReport/arquivos/MesclandoCelulas.jrxml" target="_blank">JRXML</a></p>


<br /><p>Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/' rel='bookmark' title='Permanent Link: Usando o componente Table do iReport'>Usando o componente Table do iReport</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2009/08/06/ireport-3-5-3/' rel='bookmark' title='Permanent Link: iReport 3.5.3'>iReport 3.5.3</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2008/11/13/virtualizar-relatorio/' rel='bookmark' title='Permanent Link: Virtualizar Relatório'>Virtualizar Relatório</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Usando o componente Table do iReport</title>
		<link>http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 02:22:52 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[JasperReport / iReport]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ireport]]></category>
		<category><![CDATA[JasperReport]]></category>
		<category><![CDATA[relatório]]></category>
		<category><![CDATA[report]]></category>
		<category><![CDATA[tabela]]></category>
		<category><![CDATA[table]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=235</guid>
		<description><![CDATA[Vídeo tutorial que ensina como desenvolver tabelas no iReport, utilizando o componente Table.


Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/' rel='bookmark' title='Permanent Link: iReport &#8211; Componente Table: Como mesclar células'>iReport &#8211; Componente Table: Como mesclar células</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/' rel='bookmark' title='Permanent Link: Usando virtualização para gerar grandes relatórios no JasperReports'>Usando virtualização para gerar grandes relatórios no JasperReports</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2009/08/06/ireport-3-5-3/' rel='bookmark' title='Permanent Link: iReport 3.5.3'>iReport 3.5.3</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Na versão 3.7.2, o  jasperReports ganhou um novo componente: <strong>Table</strong>.<br />
E como não poderia deixar de ser, no iReport 3.7.2 podemos usar ele e criar tabelas visualmente.<br />
No vídeo a seguir, demonstro um passo-a-passo de como utilizar esse componente.</p>
<p>Espero que gostem =].  Não foi possível colocar no youtube devido ao tamanho&#8230;</p>
<p>Em posts futuros, explicarei mais detalhes do uso da table, tais como mesclar células, esconder colunas e utilizar agrupamentos.</p>
<p>Vídeo: Usando o componente Table (Têm Áudio)<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="589" height="345" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blip.tv/play/he8EgefdHwA%2Em4v" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="589" height="345" src="http://blip.tv/play/he8EgefdHwA%2Em4v" allowfullscreen="true"></embed></object></p>
<p>Download do material do vídeo:</p>
<p><a title="Arquivo jrxml" href="http://www.danielsousa.com.br/videos/iReport/arquivos/table1.jrxml" target="_blank">JRXML</a><br />
<a title="Arquivo PDF" href="http://www.danielsousa.com.br/videos/iReport/arquivos/table1.pdf" target="_blank">PDF</a></p>
<p>Obs: A base de dados eu disponibilizo para download também caso alguém se interesse.</p>


<br /><p>Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/06/30/ireport-componente-table-como-mesclar-celulas/' rel='bookmark' title='Permanent Link: iReport &#8211; Componente Table: Como mesclar células'>iReport &#8211; Componente Table: Como mesclar células</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2010/09/12/usando-virtualizacao-para-gerar-grandes-relatorios-no-jasperreports/' rel='bookmark' title='Permanent Link: Usando virtualização para gerar grandes relatórios no JasperReports'>Usando virtualização para gerar grandes relatórios no JasperReports</a></li>
<li><a href='http://www.danielsousa.com.br/wp/2009/08/06/ireport-3-5-3/' rel='bookmark' title='Permanent Link: iReport 3.5.3'>iReport 3.5.3</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/06/15/usando-o-componente-table-do-ireport/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<enclosure url="http://www.danielsousa.com.br/videos/iReport/arquivos/table1.pdf" length="438393" type="application/pdf" /><media:content url="http://www.danielsousa.com.br/videos/iReport/arquivos/table1.pdf" fileSize="438393" type="application/pdf" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Vídeo tutorial que ensina como desenvolver tabelas no iReport, utilizando o componente Table. Posts relacionados:iReport &amp;#8211; Componente Table: Como mesclar células Usando virtualização para gerar grandes relatórios no JasperReports iReport 3.5.3 </itunes:subtitle><itunes:summary>Vídeo tutorial que ensina como desenvolver tabelas no iReport, utilizando o componente Table. Posts relacionados:iReport &amp;#8211; Componente Table: Como mesclar células Usando virtualização para gerar grandes relatórios no JasperReports iReport 3.5.3 </itunes:summary><itunes:keywords>Ferramentas, JasperReport / iReport, Java, ireport, JasperReport, relatório, report, tabela, table, tutorial</itunes:keywords></item>
		<item>
		<title>Integrando CodeIgniter e mPDF para geração de arquivos PDF</title>
		<link>http://www.danielsousa.com.br/wp/2010/05/23/integrando-codeigniter-e-mpdf-para-geracao-de-arquivos-pdf/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/05/23/integrando-codeigniter-e-mpdf-para-geracao-de-arquivos-pdf/#comments</comments>
		<pubDate>Sun, 23 May 2010 20:14:16 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[mpdf]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=190</guid>
		<description><![CDATA[Este post propõe uma forma de integrar o framework CodeIgniter e a bliblioteca mPDF para gerar arquivos PDF mais facilmente.


Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/03/21/converter-html-para-pdf-usando-mpdf/' rel='bookmark' title='Permanent Link: Converter HTML para PDF usando mPDF'>Converter HTML para PDF usando mPDF</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>No post anterior, falei sobre a biblioteca mPDF, para geração de arquivos PDF.</p>
<p>Hoje, apresento uma forma de integrar essa biblioteca no framework CodeIgniter.</p>
<p>Download mPDF:  <a href="http://mpdf.bpm1.com/">http://mpdf.bpm1.com/</a></p>
<p>Download CodeIgniter: <a title="Site CodeIgniter" href="http://codeigniter.com/" target="_blank">http://codeigniter.com/</a></p>
<p>Dê um nome qualquer a pasta do mPDF, vou considerar daqui pra frente como &#8220;<strong>mpdf_lib</strong>&#8220;.</p>
<p>Coloque a pasta <strong>mpdf_lib </strong>dentro do CodeIgniter, na pasta <strong>&#8220;system/plugins</strong>&#8221;</p>
<p>Ficaremos então com a seguinte estrutura:<br />
<span id="more-190"></span><br />
<div id="attachment_192" class="wp-caption aligncenter" style="width: 181px"><img class="size-full wp-image-192" title="Estrutura" src="http://www.danielsousa.com.br/wp/wp-content/uploads/2010/05/estrutura_codeigniter1.png" alt="" width="171" height="290" /><p class="wp-caption-text">Estrutura do CodeIngiter + mPDF</p></div></p>
<p>Feito isso, vamos criar o plugin que será invocado para gerar os pdfs:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BASEPATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access allowed'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> pdf<span style="color: #009900;">&#40;</span><span style="color: #000088;">$html</span><span style="color: #339933;">,</span> <span style="color: #000088;">$filename</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mpdf_lib/mpdf.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$mpdf</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mPDF<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//$mpdf-&gt;allow_charset_conversion=true;</span>
    <span style="color: #666666; font-style: italic;">//$mpdf-&gt;charset_in='iso-8859-1';</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Exibir a pagina inteira no browser</span>
    <span style="color: #666666; font-style: italic;">//$mpdf-&gt;SetDisplayMode('fullpage');</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Cabeçalho: Seta a data/hora completa de quando o PDF foi gerado + um texto no lado direito</span>
    <span style="color: #666666; font-style: italic;">//$mpdf-&gt;SetHeader('{DATE j/m/Y H:i}|{PAGENO}/{nb}|Texto no cabeçalho');</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">//Rodapé: Seta a data/hora completa de quando o PDF foi gerado + um texto no lado direito</span>
    <span style="color: #666666; font-style: italic;">//$mpdf-&gt;SetFooter('{DATE j/m/Y H:i}|{PAGENO}/{nb}|Texto no rodapé');</span>
&nbsp;
    <span style="color: #000088;">$mpdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">WriteHTML</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$html</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// define um nome para o arquivo PDF</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$filename</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Y-m-d_his&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_impressao.pdf'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000088;">$mpdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Output</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filename</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'I'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* End of file mpdf_pdf_pi.php */</span>
<span style="color: #666666; font-style: italic;">/* Location: ./system/plugins/mpdf_pi.php */</span></pre></div></div>

<p>Salve esse código na pasta &#8220;<strong>system/plugins</strong>&#8221; como o nome &#8220;<strong>mpdf_pi.php</strong>&#8220;.</p>
<p><em>PS: As linhas comentadas não são obrigatórias, mas são apenas um exemplo de coisas que já podem ser setadas por default, quando gerar o PDF, para mais opções, recomendo consultar a documentaçao do mPDF.</em></p>
<p>Para utilizar o plugin nos controllers/views&#8230; basta chamar dessa maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">plugin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'mpdf'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;html&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;head&gt;&lt;/head&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;body&gt;Meu arquivo de teste&lt;/body&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;&lt;/html&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Opcional: Também é possivel carregar uma view inteira...</span>
<span style="color: #666666; font-style: italic;">//$html = $this-&gt;load-&gt;view('uma_view_qualquer', null, true);</span>
&nbsp;
pdf<span style="color: #009900;">&#40;</span><span style="color: #000088;">$html</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Para que não seja necessário fazer &#8220;load&#8221; do plugin toda vez que precisar utilizá-lo, basta configurar para que ele seja carregado automaticamente pelo codeigniter. Para isso, abra o arquivo &#8220;<strong>/system/application/config/autoload.php</strong>&#8220;, e troque a linha&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'plugin'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#8230;Por&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$autoload</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'plugin'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mpdf&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Espero ter ajudado.</p>
<p>Qualquer dúvida, podem perguntar nos comentários que respondo assim que possível.</p>
<p>Abraço!</p>


<br /><p>Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/03/21/converter-html-para-pdf-usando-mpdf/' rel='bookmark' title='Permanent Link: Converter HTML para PDF usando mPDF'>Converter HTML para PDF usando mPDF</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/05/23/integrando-codeigniter-e-mpdf-para-geracao-de-arquivos-pdf/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Converter HTML para PDF usando mPDF</title>
		<link>http://www.danielsousa.com.br/wp/2010/03/21/converter-html-para-pdf-usando-mpdf/</link>
		<comments>http://www.danielsousa.com.br/wp/2010/03/21/converter-html-para-pdf-usando-mpdf/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 02:44:51 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[conversão]]></category>
		<category><![CDATA[dompdf]]></category>
		<category><![CDATA[mpdf]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=175</guid>
		<description><![CDATA[Neste post, conhecemos uma alternativa interessante para conversão de documentos HTML para arquivos PDF, usando PHP.


Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/05/23/integrando-codeigniter-e-mpdf-para-geracao-de-arquivos-pdf/' rel='bookmark' title='Permanent Link: Integrando CodeIgniter e mPDF para geração de arquivos PDF'>Integrando CodeIgniter e mPDF para geração de arquivos PDF</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Depois de muito &#8220;googlear&#8221; uma maneira de converter páginas HTML em arquivo PDF, muitos dos resultados encontrados no google apontam que a melhor biblioteca a ser usada é a <a title="dompdf" href="http://www.digitaljunkies.ca/dompdf/" target="_blank">dompdf</a>. Está certo que, se reparar bem, a maioria dos sites que indicam essa biblioteca datam de 2008 ou menos&#8230;</p>
<p>Se essa era a &#8220;melhor&#8221;, resolvi testá-la.</p>
<p>Me atendeu razoavelmente bem na sua tarefa principal &#8220;Html para PDF&#8221;.  Porém, se você quer formatar o PDF usando CSS, o suporte dessa biblioteca é horrendo. Muitos atributos não funcionam, e os que funcionam, hora só funcionam quando define-se a classe no próprio html (sem usar uma folha externa), hora só funcionam quando colocados inline ( usando o atributo style na própria tag html).</p>
<p>Até aí, ainda dá pra fazer um acerto aqui, e alí, e dá pra usar&#8230;.</p>
<p>Porém um bug GRAVE, me fez obrigado abandonar essa bilioteca:  Se houver uma &#8220;table&#8221; que venha ocupar mais de uma página quando gerando o PDF, é levantada uma exceção: <strong>Uncaught exception &#8216;DOMPDF_Internal_Exception&#8217; with message &#8216;Frame not found in cellmap</strong></p>
<p>Depois de me decepcionar com o dompdf, busquei alguma outra solução. Para minha sorte, encontrei um post do Diogo Besson &#8220;<a title="mPDF PHP e PDF" href="http://diogobesson.wordpress.com/2009/12/28/mpdf-php-e-pdf/" target="_blank">mPDF PHP e PDF</a>&#8221; que fala sobre a biblioteca <a href="http://mpdf.bpm1.com/" target="_blank">mPDF</a>.</p>
<p>Simplesmente FANTÁSTICA!!!!</p>
<p>Possui tudo que a dompdf possui, e muito mais&#8230;.. tem suporte até para CSS 3!! A documentação no <a href="http://mpdf.bpm1.com/" target="_blank">site oficial</a> então, nem se fala&#8230; completíssima. É de longe&#8230;. bem melhor que a dompdf, tanto na perfeição dos PDFs gerados, quanto na possibilidade de customização dos mesmos.</p>
<p>Dêem uma lida no <a href="http://diogobesson.wordpress.com/2009/12/28/mpdf-php-e-pdf/" target="_blank">post</a> do Diego Besson, lá ele já colocou alguns exemplos de uso, dos quais prefiro não repetir aqui.</p>
<p>Adotei a mPDF para todos os projeto &#8220;PHP&#8221; em que trabalho, e recomendo fortemente seu uso.</p>


<br /><p>Posts relacionados:<ol><li><a href='http://www.danielsousa.com.br/wp/2010/05/23/integrando-codeigniter-e-mpdf-para-geracao-de-arquivos-pdf/' rel='bookmark' title='Permanent Link: Integrando CodeIgniter e mPDF para geração de arquivos PDF'>Integrando CodeIgniter e mPDF para geração de arquivos PDF</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2010/03/21/converter-html-para-pdf-usando-mpdf/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Convites para o Lockerz / Invitations to the Lockerz</title>
		<link>http://www.danielsousa.com.br/wp/2009/12/12/convites-para-o-lockerz-invitations-to-the-lockerz/</link>
		<comments>http://www.danielsousa.com.br/wp/2009/12/12/convites-para-o-lockerz-invitations-to-the-lockerz/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 20:21:52 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[convite]]></category>
		<category><![CDATA[invitation]]></category>
		<category><![CDATA[invite]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[Lockerz]]></category>
		<category><![CDATA[Notebook]]></category>
		<category><![CDATA[pointz]]></category>
		<category><![CDATA[prêmios]]></category>
		<category><![CDATA[ps3]]></category>
		<category><![CDATA[ptz]]></category>
		<category><![CDATA[tv]]></category>
		<category><![CDATA[wii]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=156</guid>
		<description><![CDATA[O que é o Lockerz? Por volta de Agosto começou a se ouvir falar muito do nome: LOCKERZ. Afinal, do quê se trata? LOCKERZ é um site criado por uma união de associados, dentre eles a Apple, Microsoft, Marc Jacobs, EA, Ripstik, etc., fundado pela compania Liberty Media, que dá prêmios para os usuários, televisões, [...]


Nenhum post relacionado.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><strong><span style="font-size: large;"><span style="color: #0000ff;"><span style="font-size: x-large;">O que é o Lockerz?</span></span></span></strong></p>
<p>Por volta de Agosto começou a se ouvir falar muito do nome: LOCKERZ.</p>
<p>Afinal, do quê se trata?</p>
<p>LOCKERZ é um site criado por uma união de associados, dentre eles a Apple, Microsoft, Marc Jacobs, EA, Ripstik, etc., fundado pela compania Liberty Media, que dá prêmios para os usuários, televisões, Notebooks, iphones, ipods, entre outras coisas.<br />
A princípio o site consiste exclusivamente em mecanismos de acúmulo de pontos (PTZ) os quais podem ser trocados por prêmios, incluindo consoles de vide-games (wii, xbox 360, playstation 3 slim, dentre outros), pranchas de snowboarding, skates, bolsas, relógios, capinhas para iPhones, iPods, Laptops, etc.</p>
<p><span id="more-156"></span></p>
<p>As formas de se obter pontos são:<br />
1 &#8211; Um jogo, que só pode ser jogado uma vez, que consiste em alcançar as notinhas verdes que caem, acumulando o máximo de ptz que você conseguir;<br />
2 &#8211; A cada dia que você faz o log-in no site;<br />
3 &#8211; A cada dia que você deixa resposta a uma pergunta (a pergunta do dia);<br />
4 &#8211; A cada convidado que se cadastra no site.</p>
<p style="text-align: center;"><strong><span style="color: #0000ff;"><span style="font-size: x-large;">Como entrar? Como se cadastrar?</span></span></strong></p>
<p style="text-align: center;"><strong><span style="color: #0000ff;"><span style="font-size: x-large;">É de graça? O que preciso para ganhar os prêmios?</span></span></strong></p>
<p style="text-align: center;"><strong><span style="color: #0000ff;"><span style="font-size: x-large;"><br />
</span></span></strong></p>
<p>Para se cadastrar no Lockerz você precisa de um invite (convite). Para conseguir um, tudo que você precisa é que alguém tenha a boa vontade de convida-lo. Para receber seu convite, basta preencher o formulário no inicio deste post que enviarei o mais breve possível.</p>
<p><span style="font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 13px; line-height: 19px;">Após receber seu convite, clique no link que está nele e você será levado ao site para se cadastrar.</span></p>
<p>O site é todo em inglês, portanto, segue abaixo uma imagem explicando o que deve ser preenchido em cada campo:</p>
<div class="wp-caption aligncenter" style="width: 586px"><a href="http://www.danielsousa.com.br/imagens/cadastro_lockerz.jpg" target="_blank"><img class=" " title="Tela de Cadastro" src="http://www.danielsousa.com.br/imagens/cadastro_lockerz.jpg" alt="Tela de Cadastro" width="576" height="333" /></a><p class="wp-caption-text">Tela de Cadastro do Lockerz</p></div>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><span style="font-size: x-large;"><span style="color: #0000ff;"><strong>Como ganhar PTZ (Pointz)</strong></span></span></p>
<p style="text-align: center;"><span style="font-size: xx-large;"><span style="color: #0000ff;"><strong><br />
</strong></span></span></p>
<p>O <strong>jeito mais fácil de ganhar PTZ (Pointz) no Lockerz</strong> é visitando o site diariamente. Participando dos dailies, que são eventos diários. Ao logar no site você já ganha 2 PTZ. Respondendo a pergunta do dia se ganham mais 2. E assim vai, até se juntarem muitos pontos para trocar por prêmios.</p>
<p style="text-align: center;"><span style="font-size: x-large;"><span style="color: #0000ff;"><strong>Tabela de pontuação</strong></span></span></p>
<p style="text-align: center;"><span style="font-size: xx-large;"><span style="color: #0000ff;"><strong><br />
</strong></span></span></p>
<p style="text-align: center;">Acessar o site (1x por dia) &#8211; 2 PTZ<br />
Responder a pergunta diária (1x por dia (diária, né)) &#8211; 2 PTZ<br />
Convidar um amigo &#8211; 2 PTZ</p>
<p style="text-align: center;">Se for um membro Z-Lister, tudo vale em dobro (4 PTZ).</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><span style="font-size: x-large;"><span style="color: #0000ff;"><strong>Alguns prêmios disponíveis</strong></span></span></p>
<p style="text-align: center;"><span style="font-size: xx-large;"><span style="color: #0000ff;"><strong><br />
</strong></span></span></p>
<p style="text-align: center;">iMac 21,5″ &#8211; 3500PTZ<br />
MacBook 13″(modelo de alumínio) &#8211; 2500PTZ<br />
Notebook Acer 10,1″ &#8211; 1000PTZ<br />
iPod Touch 64GB &#8211; 800PTZ<br />
Notebook HP 10″ &#8211; 800PTZ<br />
Notebook Inspiron Dell 10″ &#8211; 750PTZ<br />
xBox &#8211; 675PTZ<br />
PS3 &#8211; 675PTZ<br />
PSP GO &#8211; 675PTZ<br />
DJ Hero (PS3, xBox360, Wii) &#8211; 650PTZ<br />
Câmera Digital Canon 10MB &#8211; 500TPZ<br />
DSi &#8211; 375PTZ<br />
Wii &#8211; 250PTZ<br />
<span class="bbli">PSP</span>- 200PTZ</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><span style="font-size: x-large;"><span style="color: #0000ff;"><strong>Enviam para o Brasil?</strong></span></span></p>
<p style="text-align: center;"><span style="font-size: xx-large;"><span style="color: #0000ff;"><strong><br />
</strong></span></span></p>
<p>Realmente, o Brasil é o único país no qual está complicando e não dá o braço a torcer. O Lockerz está tentando achar uma parceria aqui no país para poder fazer a distribuição diretamente. Por enquanto, você terá que torcer um pouco para o seu produto não ser taxado na alfândega, caso isso aconteça você terá que pagar 50% do valor para retirá-lo nos correios, algo que ainda vale a pena, pois o preço de um PS3 nos EUA é muito mais barato que aqui, e você irá pagar 50% do valor. Mas a maioria dos usuários do Lockerz aqui no Brasil dizem que recebem os produtos sem precisar pagar esta taxa… vai da sorte, infelizmente.</p>
<p style="text-align: center;"><span style="font-size: x-large;"><span style="color: #0000ff;"><strong>Alguns produtos estão marcados como &#8220;More Soon&#8221;.</strong></span></span></p>
<p style="text-align: center;"><span style="font-size: x-large;"><span style="color: #0000ff;"><strong>O que é isso?</strong></span></span></p>
<p style="text-align: center;"><span style="font-size: xx-large;"><span style="color: #0000ff;"><strong><br />
</strong></span></span></p>
<p>Existem 2 milhões de usuários cadastrados e o site vai repondo os produtos sempre, só que você vai ter que ser rápido para trocá-los por seus pontos, normalmente em poucas horas o estoque acaba. Não é nada muito difícil, mesmo!</p>
<p>OBS.: Esta semana saiu no Facebook uma nota dizendo que o site está para ser reformulado em dezembro/janeiro, fazendo com que todos os valores dos produtos sejam multiplicados por 4 (quatro), porém o site oferecerá 15 maneiras diferentes de se conseguir PTZ diariamente. A idéia é tornar um pouco mais difícil a conquista dos pontos, porém sempre ter em estoque os produtos (o que eu acho muito melhor). Então o negócio é começar desde já.</p>


<br /><p>Nenhum post relacionado.</p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2009/12/12/convites-para-o-lockerz-invitations-to-the-lockerz/feed/</wfw:commentRss>
		<slash:comments>74</slash:comments>
		</item>
		<item>
		<title>Transaction com SQLObject</title>
		<link>http://www.danielsousa.com.br/wp/2009/08/28/transaction-com-sqlobject/</link>
		<comments>http://www.danielsousa.com.br/wp/2009/08/28/transaction-com-sqlobject/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 04:19:12 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[callback]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[sqlobject]]></category>
		<category><![CDATA[transação]]></category>
		<category><![CDATA[transaction]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/?p=117</guid>
		<description><![CDATA[Como executar transação no banco de dados usando SQLObject e python.
Using SQLobject and Python to execute database transactions.


Nenhum post relacionado.]]></description>
			<content:encoded><![CDATA[<p>Nesse post, não pretendo explicar o que é um ORM (SQLObject, Alchemy, Hibernate, etc..), nem o que é uma transação.</p>
<p>Quem sabe em um post futuro&#8230; por hora, dexarei ao final deste post alguns links interessantes sobre o assunto. O foco é mostrar como utilizar uma transação com python, usando o sqlobject.</p>
<p>Bom, vamos lá..<br />
<span id="more-117"></span></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> executaTransacao<span style="color: black;">&#40;</span>funcaoCallback, <span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">from</span> sqlobject <span style="color: #ff7700;font-weight:bold;">import</span> sqlhub
	conexao = <span style="color: black;">&#91;</span>conexao<span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># Existem varias maneiras de obter uma conexao. Mas se este post lhe interessou, você provavelmente já tem a conexao.. rs</span>
	conn_transacao = conexao.<span style="color: black;">transaction</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	sqlhub.<span style="color: black;">threadConnection</span> = conn_transacao 
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">try</span>:
		<span style="color: #ff7700;font-weight:bold;">try</span>:
			valor = funcaoCallback<span style="color: black;">&#40;</span>conn_transacao, <span style="color: #66cc66;">*</span>args<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, ex:
			conn_transacao.<span style="color: black;">rollback</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">raise</span> ex
		<span style="color: #ff7700;font-weight:bold;">else</span>:
			conn_transacao.<span style="color: black;">commit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
			<span style="color: #ff7700;font-weight:bold;">return</span> valor
	<span style="color: #ff7700;font-weight:bold;">finally</span>:
		sqlhub.<span style="color: black;">threadConnection</span> = conexao</pre></div></div>

<p><strong>linha 2 :</strong> Importa o sqlhub<br />
<strong> linha 3 :</strong> Guardamos a referencia da conexao atual (para obter/abrir uma conexao com o banco, tem um post no site <a title="Tutorial SQLObject" href="http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject" target="_blank">oturbogears.org</a><br />
<strong> linha 4 :</strong> Esse método transaction() cria um objeto Transaction, que possui uma cópia da conexão atual, porém com o atributo autoCommit = False<br />
<strong> linha 5 </strong>: troca a conexão do processo/thread atual pela conexao da transaction<br />
<strong> linha 9 :</strong> Executa a função de callback* repassando os parâmetros informados na chamada da executaTransacao<br />
<strong> linha 11:</strong> Caso ocorra qualquer exceção na funcao de callback, qualquer alteração realizada no banco será desfeita (Rollback)*. Porém só funcionará rollback nas alterações do banco onde a conexao da transação foi explicitamente utilizada (vou explicar mais a frente)<br />
<strong> linha 12:</strong> Levanta a exceção ocorrida para ser tratada.<br />
<strong> linha 14:</strong> Se nenhuma exceção ocorreu, dá Commit em todas as alterações feitas no banco.<br />
<strong> linha 15:</strong> Retorna um valor da função de callback (caso queira retornar algo)<br />
<strong> linha 17:</strong> Depois de tudo, com exceção ou não, devolve a conexao antiga para o processo/thread atual</p>
<p><strong>*Função de Callback:</strong> Quando passamos a referência de uma função como parâmetro de outra função.</p>
<p>Já temos nosso método que vai gerênciar a nossa transação, agora podemos escrever nossa função que, efetivamente realiza as alterações no banco de dados.<br />
Para um simples entendimento, vamos criar uma função que grava varias pessoas no banco de dados (tabela pessoa). O número de pessoas é informado como parâmetro.</p>
<p>Considerar que, a tabela pessoa, possui 0 (zero) registros e tem os seguintes campos:   id e nome</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> minhaTransacao<span style="color: black;">&#40;</span>connTrans, totalPessoas<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">for</span> pessoa <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>totalPessoas<span style="color: black;">&#41;</span>:
		Pessoa<span style="color: black;">&#40;</span>
				nome = <span style="color: #483d8b;">&quot;Pessoa %s&quot;</span> <span style="color: #66cc66;">%</span> pessoa,
				connection = connTrans
		<span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #808080; font-style: italic;"># Altera o nome da pessoa de id 2</span>
                Pessoa.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, connTrans<span style="color: black;">&#41;</span>.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span>nome = <span style="color: #483d8b;">&quot;Pessoa 2 editada&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #808080; font-style: italic;"># Altera o nome da pessoa de id 2</span>
                Pessoa.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">30</span>, connTrans<span style="color: black;">&#41;</span>.<span style="color: #008000;">set</span><span style="color: black;">&#40;</span>nome = <span style="color: #483d8b;">&quot;Pessoa 30 editada&quot;</span><span style="color: black;">&#41;</span> 
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;Comandos executados com Sucesso&quot;</span></pre></div></div>

<p><strong>linha 1 :</strong> Assinatura da função. Obrigatório ter pelo menos 1 parâmetro, que é a conexao da trasansação, recebida da executaTransacao.<br />
<strong> linha 2 / 3 :</strong> Grava as pessoas no banco de dados (tabela Pessoa), conforme o numero informado no parametro totalPessoas.<br />
<strong><span style="color: #ff0000;"> Importante:</span></strong> Notem que, ao gravar uma pessoa na tabela, é informado um atributo connection. Isto serve para que esse INSERT seja feito utilizando a transação, sendo assim possível efetuar o commit/rollback. Se essa conexão não fosse explicitada aí, a transação não teria efeito nesse comando.</p>
<p>Utilizando as funções criadas:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">retorno = <span style="color: #483d8b;">&quot;&quot;</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
	retorno = executaTransacao<span style="color: black;">&#40;</span>minhaTransacao, <span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, ex:
       <span style="color: #ff7700;font-weight:bold;">raise</span> ex
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> retorno</pre></div></div>

<p>linha 3 : Executa nossa transação, passando o valor 10</p>
<p>Nesse exemplo acima, acabamos criando um exemplo de ROLLBACK, pois será levantada uma exceção:</p>
<p>A transação efetua as seguintes ações:<br />
(funcao minhatransacao)<br />
- Grava 10 pessoas na tabela pessoa (id de 0 a 9)<br />
- Edita o nome da pessoa com id = 2 de &#8220;Pessoa 2&#8243; para &#8220;Pessoa 2 editada&#8221;<br />
- Tenta editar o nome da pessoa com id 30, de &#8220;Pessoa 30&#8243; para &#8220;Pessoa 30 editada&#8221;, PORÉM, esse registro não existe, e é levantada uma exceção.<br />
- a funcao executaTransacao detecta a exceção, e desfaz a edição da pessoa com id = 2, de &#8220;Pessoa 2 editada&#8221; para &#8220;Pessoa 2&#8243;<br />
- as 10 pessoas que haviam sido inseridas na tabela, são excluídas.<br />
- a exceção então é levantada mais uma vez, para fora da executaTransacao, para possível tratamento&#8230; Nesse caso, estamos apenas dando um raise.</p>
<p>Se, neste exemplo, ao invés de passar 10, passassemos 31 ou valor mais alto, a função minhaTransacao teria rodado sem levantar nenhuma exceção, logo, a funcao executaTransacao daria COMMIT , e todos os registros seriam salvos no banco com sucesso.</p>
<p>Bom, então é isso&#8230; Espero ter ajudado.</p>
<p>Qualquer dúvida / sugestão, podem deixar nos comentários que procurarei responder o mais breve possível.</p>
<p>Até a próxima!</p>
<div id="attachment_129" class="wp-caption aligncenter" style="width: 446px"><a href="http://www.danielsousa.com.br/wp/wp-content/uploads/2009/08/Transacao.png"><img class="size-full wp-image-129" title="Transacao" src="http://www.danielsousa.com.br/wp/wp-content/uploads/2009/08/Transacao.png" alt="Exemplo de fluxo de uma transação simples" width="436" height="762" /></a><p class="wp-caption-text">Exemplo de fluxo de uma transação simples</p></div>
<p><strong>Links Interessantes:</strong></p>
<p>Manual do SQLObject traduzido para português:<br />
<a title="O Turbogears - Tutorial SQLObject em português" href="http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject" target="_blank"> http://oturbogears.org/documentacao/tutorial/tutorial-sqlobject</a></p>
<p>Object-relational mapping<br />
<a title="Object-relational mapping" href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank"> http://en.wikipedia.org/wiki/Object-relational_mapping</a></p>
<p>Mapeamento objeto-relacional<br />
<a title="Mapeamento objeto-relacional" href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank"> http://pt.wikipedia.org/wiki/Orm</a></p>
<p>PDF sobre Transação<br />
<a title="PDF sobre Transações" href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank"> http://www.dcc.ufam.edu.br/~eccv/bd1/slides/3-transacoes.pdf</a></p>


<br /><p>Nenhum post relacionado.</p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2009/08/28/transaction-com-sqlobject/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Santo Python</title>
		<link>http://www.danielsousa.com.br/wp/2009/08/10/santo-python/</link>
		<comments>http://www.danielsousa.com.br/wp/2009/08/10/santo-python/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 14:17:44 +0000</pubDate>
		<dc:creator>Daniel Sousa</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.danielsousa.com.br/wp/?p=75</guid>
		<description><![CDATA[Um exemplo de como utilizar o python para resolver problemas do dia-a-dia com rapidez...


Nenhum post relacionado.]]></description>
			<content:encoded><![CDATA[<p>Esse domingo, estava me preparando para postar aqui no site meu primeiro video-tutorial sobre relatórios com o ireport 3.5.3, quando tive que enfrentar um pequeno empasse.</p>
<p>O script para inserção de registros no banco de dados (PostgreSQL) que eu estava preparando estava com um pequeno problema. As datas estavam num formato inválido &#8220;DD MM YYYY&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AL'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Arab League'</span><span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">'Cairo'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'ET'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'El Qahira (munic.)'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'22 03 1945'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AG'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Andean Group'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Lima'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'PE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Lima'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'26 05 1969'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'C'</span><span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">'Commonwealth'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'London'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'GB'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Greater London'</span><span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'NAM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Nonaligned Movement'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Jakarta'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'RI'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Indonesia'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'01 09 1961'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Notem que, para o banco de dados aceitar esses INSERTs, a data deveria estar no formato &#8220;YYYY-MM-DD&#8221;.<br />
Eu poderia muito bem ter arrumado as datas na mão, claro, mas eram mais de 150 linhas, e eu demoraria muito fazendo isso&#8230;<br />
<span id="more-75"></span><br />
Foi então, que, tive a idéia de criar um script em Python (sim, tenho dons de python, rs) para realizar a correção dos meus INSERTs.</p>
<p>Peguei todas as instruções de INSERT, e coloquei-as dentro de um arquivo &#8220;txt&#8221;, chamado &#8220;<strong>inserts.txt</strong>&#8220;.</p>
<p>Após rodar o script python, é gerado o arquivo &#8220;<strong>inserts_novo.txt</strong>&#8220;, com todas as instruções sql corrigidas, como num passe de mágica.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AL'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Arab League'</span><span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">'Cairo'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'ET'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'El Qahira (munic.)'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'1945-03-22'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'AG'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Andean Group'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Lima'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'PE'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Lima'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'1969-05-26'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'C'</span><span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">'Commonwealth'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'London'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'GB'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Greater London'</span><span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> organization <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'NAM'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Nonaligned Movement'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Jakarta'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'RI'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Indonesia'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'1961-09-01'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Segue então o código. Importante notar que, como foi um código corriqueiro, não me preocupei em fazer validações, não havia necessidade.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">insert = <span style="color: #483d8b;">&quot;INSERT INTO organization VALUES &quot;</span>
arquivo = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;inserts.txt&quot;</span>, <span style="color: #483d8b;">&quot;r&quot;</span><span style="color: black;">&#41;</span>            <span style="color: #808080; font-style: italic;"># Arquivo de INSERTS com data incorreta</span>
novo_arquivo = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;inserts_novo.txt&quot;</span>, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># Arquivo que receberá os INSERTS corretos</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> linha <span style="color: #ff7700;font-weight:bold;">in</span> arquivo:
	tupla = linha<span style="color: black;">&#91;</span>linha.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;(&quot;</span><span style="color: black;">&#41;</span>:linha.<span style="color: black;">rfind</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;)&quot;</span><span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>  <span style="color: #808080; font-style: italic;"># Pega a parte que vem após o VALUES</span>
	tupla = tupla.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NULL&quot;</span>, <span style="color: #483d8b;">&quot;None&quot;</span><span style="color: black;">&#41;</span>              <span style="color: #808080; font-style: italic;"># Troca os valores NULL por None. OBS: Não existe NULL no Python, no lugar dele, existe o None</span>
	lista = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span><span style="color: #008000;">eval</span><span style="color: black;">&#40;</span>tupla<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>                          <span style="color: #808080; font-style: italic;"># Transforma string numa tuple, e logo em seguida numa list. Isso é necessário, dado que objetos tuple são imutáveis.</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">if</span> lista<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!</span>= <span style="color: #008000;">None</span>:
		dia, mes, ano = lista<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>       <span style="color: #808080; font-style: italic;"># Quebra o elemento onde está a data em mais 3 elementos, e já atribui eles em variáveis</span>
		lista<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">&quot;%s-%s-%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>ano, mes, dia<span style="color: black;">&#41;</span>   <span style="color: #808080; font-style: italic;"># Troca a data antiga pela data no formato correto</span>
&nbsp;
	tupla = <span style="color: #008000;">tuple</span><span style="color: black;">&#40;</span>lista<span style="color: black;">&#41;</span>                               <span style="color: #808080; font-style: italic;"># Tranforma a list numa tuple novamente</span>
	nova_query = insert + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>tupla<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>            <span style="color: #808080; font-style: italic;"># Recria o INSERT</span>
	nova_query = nova_query.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;None&quot;</span>, <span style="color: #483d8b;">&quot;NULL&quot;</span><span style="color: black;">&#41;</span>    <span style="color: #808080; font-style: italic;"># Troca novamente os valores None por NULL</span>
&nbsp;
	novo_arquivo.<span style="color: black;">write</span><span style="color: black;">&#40;</span>nova_query<span style="color: black;">&#41;</span>                     <span style="color: #808080; font-style: italic;"># Escreve o INSERT no arquivo_novo.txt</span>
&nbsp;
novo_arquivo.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># Salva as informações escritas e fecha o arquivo</span>
arquivo.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>       <span style="color: #808080; font-style: italic;"># Fecha o arquivo</span></pre></td></tr></table></div>

<p>Apenas a título de curiosidade para aqueles que não conhecem essa linguagem fantástica, o código acima pode ainda ser escrito de outra forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="python" style="font-family:monospace;">insert = <span style="color: #483d8b;">&quot;INSERT INTO organization VALUES &quot;</span>
arquivo = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;inserts_novo_old.sql&quot;</span>, <span style="color: #483d8b;">&quot;r&quot;</span><span style="color: black;">&#41;</span>
novo_arquivo = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;inserts_novo.sql&quot;</span>, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> linha <span style="color: #ff7700;font-weight:bold;">in</span> arquivo:
	lista = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span><span style="color: #008000;">eval</span><span style="color: black;">&#40;</span>linha<span style="color: black;">&#91;</span>linha.<span style="color: black;">find</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;(&quot;</span><span style="color: black;">&#41;</span>:linha.<span style="color: black;">rfind</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;)&quot;</span><span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;NULL&quot;</span>, <span style="color: #483d8b;">&quot;None&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">if</span> lista<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!</span>= <span style="color: #008000;">None</span>:
		dia, mes, ano = lista<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>
		lista<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">&quot;%s %s %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>ano, mes, dia<span style="color: black;">&#41;</span>
&nbsp;
	novo_arquivo.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>insert + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">tuple</span><span style="color: black;">&#40;</span>lista<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;None&quot;</span>, <span style="color: #483d8b;">&quot;NULL&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
novo_arquivo.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
arquivo.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>Ainda dava pra diminuir, porém não estou com inspiração pra fazer isso&#8230; rs</p>
<p><strong>Observação:</strong> Esse código não levou nem 15 minutos para ficar pronto e funcionar. Isso porque nem sou um mestre em python, rs&#8230; Os gurus da <a title="Python Brasil" href="http://www.python.org.br" target="_blank">Python Brasil</a> talvez levassem apenas uns 5 minutos&#8230; rs .  Se eu fosse alterar as datas na mão, talvez levasse um pouco mais de 1 hora&#8230;</p>
<p>Bom, fica aí a dica, aprendam Python, mesmo que o básico, e verá o quanto pode se beneficiar disso. Não é a toa que dizem que Python torna o desenvolvimento mais rápido e produtivo.</p>
<p>Quem tiver interesse em aprender, pode acessar o site da <a title="Python Brasil" href="http://www.python.org.br" target="_blank">Python Brasil</a>, ou pesquisar pela internet mesmo, que existe muito material bom&#8230;</p>
<p><strong>Links interessantes:</strong></p>
<p><a href="http://www.python.org/" target="_blank">http://www.python.org/</a> (Site Oficial do Python &#8211; Inglês)<br />
<a title="Python Brasil" href="http://www.python.org.br" target="_blank">http://www.python.org.br</a><br />
<a href="http://diveintopython.org/" target="_blank">http://diveintopython.org/<br />
</a><a href="http://www.async.com.br/projects/python/pnp/" target="_blank">http://www.async.com.br/projects/python/pnp/</a></p>


<br /><p>Nenhum post relacionado.</p>]]></content:encoded>
			<wfw:commentRss>http://www.danielsousa.com.br/wp/2009/08/10/santo-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	<media:rating>nonadult</media:rating></channel>
</rss>

