<?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>Reginaldo Jr. Weblog</title>
	<atom:link href="http://reginaldojr.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://reginaldojr.wordpress.com</link>
	<description>Consultoria em Desenvolvimento de Sistemas</description>
	<lastBuildDate>Sun, 15 Nov 2009 14:53:14 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='reginaldojr.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/390ed8f174fbd40f91aaeacfef44f0ef?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Reginaldo Jr. Weblog</title>
		<link>http://reginaldojr.wordpress.com</link>
	</image>
			<item>
		<title>Visual Studio + NHibernate: Tutorial corrigido e com fontes</title>
		<link>http://reginaldojr.wordpress.com/2009/11/15/visual-studio-nhibernate-tutorial-corrigido-e-com-fontes/</link>
		<comments>http://reginaldojr.wordpress.com/2009/11/15/visual-studio-nhibernate-tutorial-corrigido-e-com-fontes/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 14:02:16 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Todos]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=374</guid>
		<description><![CDATA[Após inúmeros pedidos resolvi incrementar nosso tutorial &#8220;Visual Studio + NHibernate: Construindo aplicações em camadas&#8220;. Fiz diversas modificações visando dar mais qualidade a este material que é de grande importância para aqueles de desejam utilizar o NHibernate no desenvolvimento de sistemas de informações utilizando o Visual Studio.  Vou descrever as novidades:

 Site do tutorial. Foi [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=374&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Após inúmeros pedidos resolvi incrementar nosso tutorial &#8220;<a href="http://reginaldojr.wordpress.com/2008/06/21/visual-studio-nhibernate-construindo-aplicacoes-em-camadas/" target="_blank">Visual Studio + NHibernate: Construindo aplicações em camadas</a>&#8220;. Fiz diversas modificações visando dar mais qualidade a este material que é de grande importância para aqueles de desejam utilizar o NHibernate no desenvolvimento de sistemas de informações utilizando o Visual Studio.  Vou descrever as novidades:</p>
<ul>
<li> Site do tutorial. Foi criado um site com os arquivos necessários para acompanhar o tutorial: script do banco em firebird ou arquivo de dados já criado, solução completa com fontes com os arquivos criados em cada etapa do tutorial. Agora voce pode ler o tutorial, baixar a solução e ver como ficou comparando com a sua implementação;</li>
<li>O MyGeneration deixou de ser utilizado para gerar as classes. Desenvolvemos um programa que faz esse trabalho de maneira mais rápida e prática. O programa é <a href="http://rsclass.wordpress.com" target="_blank">RSClass &#8211; Gerador de Classes</a>. A utilização deste programa é livre sem qualquer limitação (apenas para uso não-comercial).  Dispnibilizamos também os fontes para aqueles que se interessarem. Entre em contato comigo por email e sabia como;</li>
<li>Alguns problemas no texto foram corrigidos visando dar maior claresa no entendimento do tutorial;</li>
<li>Os programas envolvidos foram atualizados (Visual Studio, Banco de dados e a novidade, RSClass).</li>
</ul>
<p>Para aqueles que já leram sugerimos uma revisada no tutorial para ver pessoalmente o que mudou. Para os que estão acessando pela primeira vez saibam que estão desfrutando de um material que é aprimorado a medida que novas idéias e tecnologias vão surgindo.</p>
<p>Desde já, obrigado a todos que participam com sugestões, dúvidas e principalmente adiquirindo nossos <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/" target="_self">Sistemas c/ fontes</a>. Isso nos motiva a continuar estudando e melhorando a qualidade deste e de outros trabalhos.</p>
<p>É isso.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/374/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/374/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/374/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/374/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/374/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/374/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/374/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/374/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/374/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/374/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=374&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/11/15/visual-studio-nhibernate-tutorial-corrigido-e-com-fontes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>EDWS &#8211; Sistema de Gerenciamento de Conteúdo</title>
		<link>http://reginaldojr.wordpress.com/2009/07/21/edws-sistema-de-gerenciamento-de-conteudo/</link>
		<comments>http://reginaldojr.wordpress.com/2009/07/21/edws-sistema-de-gerenciamento-de-conteudo/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 23:32:26 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Todos]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[conteudo]]></category>
		<category><![CDATA[edws]]></category>
		<category><![CDATA[fckeditor]]></category>
		<category><![CDATA[gerenciamento]]></category>
		<category><![CDATA[gerenciamento de conteudo]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=335</guid>
		<description><![CDATA[Em certa oportunidade um usuário me pediu para construir um site para o estabelecimento onde trabalha. Eu perguntei qual o objetivo do site. Ele simplesmente respondeu que a chefia dele quem solicitou e ele não sabia nem por onde começar. Ele não tinha a menor idéia do que ia colocar no site. Fiz algumas sugestões [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=335&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Em certa oportunidade um usuário me pediu para construir um site para o estabelecimento onde trabalha. Eu perguntei qual o objetivo do site. Ele simplesmente respondeu que a chefia dele quem solicitou e ele não sabia nem por onde começar. Ele não tinha a menor idéia do que ia colocar no site. Fiz algumas sugestões de conteúdos e disse que ele deveria, primeiro, conversar com os setores do estabelecimento e colher informações para alimentar o site com notícias, fotos, informações, artigos, textos, etc.</p>
<p>Mas surgiu um problema: quem iria dar manutenção no site? EU? Sem chances!!!!!!! Foi aí que surgiu a idéia de construir um sistema gerenciador de conteúdo onde ele mesmo pudesse criar e gerenciar as páginas do site. A criação das páginas deveria ser bem simples, como se fosse um editor de textos. Procurei na Internet sistemas de CMS (Content Management System ou Sistema Gerenciador de Conteúdo) prontos que pudessem ajudar nessa tarefa e achei alguns: Blogs gratuitos, EVA (100% brasileiro), XOOPS, etc. Todos muito bons porém, para usuários com pouca ou nenhuma experiência, são exageradamente cheio de recuros. É bom que se diga, bons recursos. Mas para o meu problema, possivelmente eu tivesse que &#8220;dar um curso&#8221; de alguma dessas ferramentas para o usuário e o pior: ficar tirando dúvidas, etc. Sem falar nos problemas com a instalação do banco de dados.</p>
<p>Decidi construi algo mais simples, levando em consideração que o usuário só queria ter um local na Internet para divulgar informações. Construi o EDWS &#8211; Edição Dinâmica de WebSite. Esta primeira versão era bem limitada. Uma versão light. Tinha uns 3 layouts prontos, menu superior e lateral e dois recursos pré-formatados: uma página &#8220;Fale conosco&#8221; e uma outra para localização do estabelecimento no Google Maps. Adicionei também um contador de visita além de uns links para alguns serviços últeis: consulta de CEP e previsão do tempo. A edição das páginas era feita utilizando o FCK Editor. Já falei dele em posts anteriores. Documentação sobre este editor pode ser facilmente encontrado na Internet.</p>
<p>O fato é que o usuário ficou satisfeito e eu também. Ele fez o site e está no ar até hoje. Eu também gostei do resultado e decidi desenvolver outra versão para o EDWS. Nasce, então, o <strong>EDWS &#8211; Sistema de Gerenciamento de Conteúdo. </strong>Adicionei inúmeros outros recursos pré-formatados: blog, álbum, notícias, novos layouts, YouTube, etc.</p>
<p>Além de tudo, decidi disponibilizá-lo para quem desejar utilizar em seus trabalhos. Acho que o maior diferencial deste sistema é a simplicidade e facilidade de uso. Quem desejar conhecer mais sobre este sistema e baixá-lo pode acessar o blog que criei especialmente para este projeto: <a href="http://edwsblog.wordpress.com" target="_blank">http://edwsblog.wordpress.com</a>. Não há necessidade de adiquirir licença para utilizar a versão gratuita. Porém quem desejar suporte ou os fontes do programa poderá entrar em contato comigo para fazer-mos alguma negociação. A única limitação dessa versão gratuita é a exibição de um link para o blog do EDWS.</p>
<p>É isso!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/335/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=335&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/07/21/edws-sistema-de-gerenciamento-de-conteudo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>Sistema c/ fontes migrados do .NET 2.0 para .NET 3.5</title>
		<link>http://reginaldojr.wordpress.com/2009/06/30/sistema-c-fontes-migrados-do-net-2-0-para-net-3-5/</link>
		<comments>http://reginaldojr.wordpress.com/2009/06/30/sistema-c-fontes-migrados-do-net-2-0-para-net-3-5/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 23:15:11 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Dicas.NET]]></category>
		<category><![CDATA[Todos]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=326</guid>
		<description><![CDATA[Quando iniciei na plataforma .NET utilizei a versão 1.1 do framerwork no VS2003. Com o lançamento da versão 2.0 juntamente com o VS2005 migrei as aplicações para esta versão.
Hoje com o anúncio do VS2010 e do .NET 4.0 decidi migrar as minhas aplicações para a versão 3.5 e VS 2008. Preliminarmente tive dois problemas na [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=326&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quando iniciei na plataforma .NET utilizei a versão 1.1 do framerwork no VS2003. Com o lançamento da versão 2.0 juntamente com o VS2005 migrei as aplicações para esta versão.</p>
<p>Hoje com o anúncio do VS2010 e do .NET 4.0 decidi migrar as minhas aplicações para a versão 3.5 e VS 2008. Preliminarmente tive dois problemas na migração:<a href="http://reginaldojr.wordpress.com/wp-admin/post.php?action=edit&amp;post=326">Editar posts ‹ Reginaldo Jr. Weblog — WordPress</a></p>
<ol>
<li>O Service Pack 1 do Visual Studio 2008 tinha uns bugs. Mas isso não foi problema por que no site da microsoft já havia a solução. Páginas com MasterPage, AJAX e componentes do AjaxControlToolkit geravam um erro durante a utilização do modo Design no VS 2008. O problema e a correção podem ser baixados <a href="http://support.microsoft.com/kb/961847/" target="_blank">aqui</a>.</li>
<li>O tratamento de excessão dentro do UpdatePanel do AJAX foi alterado em sua forma de utilização. Para utilizar a forma de tratar a excessão dentro de um UpdatePanel como era utilizada no .NET Framework 2.0 e VS 2005 tive que implementar um pequeno script em Javascript. Uma excessão dentro de um UpdatePanel na versão 2.0 do framework fazia surgir um &#8216;alert&#8217; no browser. Na versao 3.5 surge um erro Javascript que precisa ser tratado em Javascript. Dá uma certa flexibilidade no tratamento de erros no lado do cliente. Mas com um pequeno script isso pode ser corrigido e o &#8216;alert&#8217; pode ser exibido. Quem desejar ver este scrpit pode pedir por email que eu envio. Leia mais <a href="http://forums.asp.net/t/1233526.aspx" target="_blank">aqui.</a></li>
</ol>
<p>No geral não tive problemas de adaptação ao novo ambiente já que é bem próximo da versão anterior. Porém achei pesado, ou seja, precisa de mais memória para uma boa performance. Mas indico a migração. Quem usa NHibernate como camada de persistência não vai ter maiores problemas, principalmente se utilizar o pacote NHibernate 2.0.1 GA. Tive um erro com uma query utilizando Criterion que, escrevendo em HQL, resolveu o problema.</p>
<p>Estou utilizando o VS2008 Pro SP1 desde o dia 28/06/2009 e &#8220;tudo bem também&#8221;; nada de mais. Espero não ter outros problemas. Se tiver possivelmente eu atualiza este post com o novo problema (não garanto). Quem conhecer outros incovenientes queram por gentileza deixar um comentário nesta página.</p>
<p>É isso. Ah, os sistemas com fontes que disponibilizo, agora, vai nessa nova versão da plataforma.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/326/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=326&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/06/30/sistema-c-fontes-migrados-do-net-2-0-para-net-3-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>Importar Tabela Unificada SUS</title>
		<link>http://reginaldojr.wordpress.com/2009/06/04/importar-tabela-unificada-sus/</link>
		<comments>http://reginaldojr.wordpress.com/2009/06/04/importar-tabela-unificada-sus/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 00:34:54 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Dicas.NET]]></category>
		<category><![CDATA[ftp datasus]]></category>
		<category><![CDATA[sigtap]]></category>
		<category><![CDATA[tabela unificada sus]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=315</guid>
		<description><![CDATA[Quem desenvolve sistema de informações em saúde voltado para atendimento SUS certamente conhece a TABELA UNIFICADA SUS. Afinal os procedimentos hospitalares e ambulatoriais, CID´s, ocupações dos profissionais envolvidos, relacionamentos entre tabelas, valores dos procedimentos, prazos, tempos de premanência, entre outros são encontrados nessas tabelas que dão suporte a vários outros sistemas fornecidos pelo Ministério da [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=315&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quem desenvolve sistema de informações em saúde voltado para atendimento SUS certamente conhece a TABELA UNIFICADA SUS. Afinal os procedimentos hospitalares e ambulatoriais, CID´s, ocupações dos profissionais envolvidos, relacionamentos entre tabelas, valores dos procedimentos, prazos, tempos de premanência, entre outros são encontrados nessas tabelas que dão suporte a vários outros sistemas fornecidos pelo Ministério da Saúde. Quem não conhece a estrutura da Tabela Unificada SUS pode conhecer no site <a target="_blank" href="http://sigtap.datasus.gov.br">http://sigtap.datasus.gov.br</a>. Esta é a forma  on-line de consultar essas informações.</p>
<p>Recentemente eu desenvolvi um sistema de gestão em saúde que utilizava esta tabela. O Datasus disponibiliza os dados desta tabela mensalmente em arquivos textos compactados. Tivemos que criar uma maneira de importar facilmente estes dados baixando do <a href="ftp://ftp2.datasus.gov.br/pub/sistemas/tup/downloads/" target="_blank">FTP</a> e importando para o nosso banco de dados. O próprio usuário pode disparar este processo quando tiver conhecimento da disponibilidade das informações atualizadas da tabela.</p>
<p>Resolvi, então, disponibilizar a solução completa e com fontes para os interessados. Este projeto é bastante rico em recursos: criação de tabelas, descompactação de arquivos, download de FTP, conexão com banco de dados, execução de scripts DDL, etc. O projeto foi desenvolvido para utilização com banco de dados Firebird mas pode ser facilmente convertido para qualquer outro banco. </p>
<p>O projeto está disponível para download no CodePlex: <a href="http://tabelaunificadasus.codeplex.com/" target="_blank">http://tabelaunificadasus.codeplex.com/</a>. Lá voce irá encontrar maiores informações sobre o nosso projeto. </p>
<p>É isso.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/315/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=315&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/06/04/importar-tabela-unificada-sus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>Validar Campos no Cliente com .NET e Javascript</title>
		<link>http://reginaldojr.wordpress.com/2009/05/10/validar-campos-no-cliente-com-net-e-javascript/</link>
		<comments>http://reginaldojr.wordpress.com/2009/05/10/validar-campos-no-cliente-com-net-e-javascript/#comments</comments>
		<pubDate>Sun, 10 May 2009 13:47:56 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Dicas.NET]]></category>
		<category><![CDATA[Todos]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=294</guid>
		<description><![CDATA[Uma ponto importante para quem desenvolve sistemas é o tráfego de rede. Espera-se que os sistemas de informações utilizem o mínimo possível os recursos da rede. Evitar acessos desnecessários ao servidor de aplicação e banco de dados é uma das providências que os desenvolvedores devem tomar pra diminuir esse tráfego.
Em sistemas web não seria diferente. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=294&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Uma ponto importante para quem desenvolve sistemas é o tráfego de rede. Espera-se que os sistemas de informações utilizem o mínimo possível os recursos da rede. Evitar acessos desnecessários ao servidor de aplicação e banco de dados é uma das providências que os desenvolvedores devem tomar pra diminuir esse tráfego.</p>
<p>Em sistemas web não seria diferente. Afinal o acesso a páginas web pode ocorrer via intranet, ou seja, na rede local, ou pela internet passando por vários servidores, bandas, nós, comutadores, etc. É importante evitar submissões de páginas desnecessárias. Isso pode fazer com que a navegação seja bem mais rápida e produtiva. Por exemplo, se for definido na aplicação uma regra que somentes CPF´s válidos podem ser gravados no banco de dados, a aplicação deve validar o CPF antes de gravar no banco. Mas onde essa validação deve acontecer? Algumas sugestões:</p>
<ol>
<li>Triggers na tabela &#8211; Antes do INSERT a trigger pode validar o CPF. O uso de trigger é desaconselhável, principalmente para validações de campo;</li>
<li>Procedures -  Se o sistema utilizar as procedures para implementar as regras de negócio, um ótimo lugar para validar o CPF é durante a execução da procedure;</li>
</ol>
<p>Essa duas formas tem um problema em relação ao tráfego: os dados trafegaram a rede inteira apartir da tela do cliente até o banco de dados apenas para retornar &#8220;CPF inválido.&#8221;</p>
<p>Se utilizar um servidor de aplicação em uma arquitetura de n-camadas pode-se implementar a validação nos objetos de négocio. Isso já diminui um pouco o tráfego. Afinal o servidor de aplicação deve estar em uma camada acima, em relação a camada onde é feito o acesso ao banco de dados. O servidor de aplicação pode validar os dados e quando forem enviados à camada infeiror, os dados já foram validados na camada de regra de négocios.</p>
<p>Mas podemos subir camada ainda mais nessa validação. Podemos colocar a validação do CPF na camada de apresentação, exatamente no servidor web. Plataformas como PHP, ASP, ASP.NET, JSP podem utilizar essa forma. A página é submetida ao servidor web que faria a validação dos dados. Note que o servidor web deve ficar numa camada acima do servidor de aplicação.  Agora o tráfego é apenas entre o cliente e o servidor web que já é muito bom.</p>
<p>Mas tem certas validações que podem ser feitas diretamente no cliente; lá no navegador. Vejamos alguns exemplos:</p>
<ul>
<li>campos que não podem ser nulos;</li>
<li>data, cpf, cns, cnpj, etc. inválidos;</li>
<li>comparação de dados entre dos campos.</li>
</ul>
<p>Ou seja, se determinadas validações, também chamadas de pré-validações, forem checadas antes de submeter a página ao servidor web podemos evitar ao máximo tráfegos desnecessários em situações elementares. O campo CPF pode ser validado antes de o usuário enviar os dados ao servidor, ou seja, a página só seria enviada ou submetida ao servidor se o CPF fosse digitado corretamente, com os dois dígitos verificadores válidos. O mesmo podemos pensar com datas, horas e outros valores. Assim a diminuição do tráfego seria total. A gravação do CPF, ao ser validado no navegador do cliente, quando fosse enviado ao servidor certamente seria gravado já que o CPF sempre estaria correto ao chegar no servidor. Isso vale para vários outros tipos de campos: data, hora, data e hora, cnpj, cns, números, campos com dígitos verificadores, entre outros.</p>
<p>Essa validação no cliente pode ser feita com Javascript. Uma problema: &#8220;E se o navegador não suportar Javascript?&#8221; Realmente. Aí a validação deverá também ser feita em alguma das camadas inferiores citadas acima. Foi dito que essas validações seriam um tipo de pré-validações. Nenhuma aplicação deve ser feita apenas com validações no navegador do cliente. Algum outro local deve fazer a validação principal. Os objetos de negócio devem implementar as validações dos campos. Em programação orientada a objetos isso passa a ser um requisito técnico. Se a validação no navegador do cliente não funcionar, a verificação em outra camada inferior deverá ser feita.</p>
<p>O fato é que validar no navegador do cliente utilizando Javascript é um boa prática para qualquer sistema web. Em ASP.NET existe alguns componentes que realizam essa tafera com muita qualidade.</p>
<ul>
<li>RequiredFieldValidator: usado quando um campo não pode ser vazio;</li>
<li>RangeValidator: usado para verificar se o conteúdo do campo está dentro de uma determinada faixa;</li>
<li>RegularExpressionValidator: usado para validar campos utilizando expressões regulares;</li>
<li>CompareValidator: usado para comparar dois campos;</li>
<li>CustomValidator: usado para preparar uma verificação personalizada;</li>
</ul>
<p>Todos esses validadores fazem verificações diretamente no navegador do cliente e só deixa os dados serem enviados ao servidor se os dados estiverem de acordo com as condições definidas nos validadores. Existe mais um componente chamado<strong> </strong><span style="color:#ff0000;">ValidatorSummary</span> que é capaz de exibir mensagens de erro durante a validação. Leia mais sobre esses validadores neste <a href="http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=46" target="_blank">link</a>.</p>
<p>Gostaria de destacar a utilidade do <strong>CustomValidator</strong>. Ele permite utilizar validações personalizadas em Javascript. O desenvolvedor pode criar alguma validação de acordo com sua necessidade.  Para utilizar este validador genérico a função em Javascript segue uma padronização na sua definição. O script para validação pode vir entre tags &lt;scripts&gt;&lt;/scripts&gt; na própria página ou em arquivos .js e vinculados a página. A função de validação pode ter qualquer nome sendo que os parâmetros de entrada devem ser <strong>source</strong> e <strong>arguments</strong>.  Veja o exemplo:</p>
<p>&lt;script language=&#8221;Javascript&#8221;&gt;</p>
<p>function valida_vazio(source, arguments)</p>
<p>{</p>
<p>// O campo não pode ser vazio</p>
<p>if (arguments.Value!=&#8221;")</p>
<p>{</p>
<p>arguments.IsValid = true;</p>
<p>return true;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>arguments.IsValid = false;</p>
<p>return false;</p>
<p>}</p>
<p>&lt;/script&gt;<br />
O exemplo acima faz a mesma coisa que o RequiredFieldValidator: valida campos que não podem ser vazio. O CustomValidator faz referência a esta função na propriedade <strong>ClientValidationFunction</strong>. Voce pode também combinar validators. Por exempo: O RequiredFieldValidator pode ser usado para verificar que um campo não pode ser vazio e o CustomValidator para verificar se o campo foi preenchido com um CPF válido por exemplo.</p>
<p>Note que essas validações no cliente apenas verificam a qualidade dos dados digitados. Elas não verificam, por exemplo, se o CPF está ou não cadastrado no banco. Esse tipo de validação tem que ser feita do lado do servidor.</p>
<p>Diversos tratamentos e validações pode ser feitos utilizando Javascript e o CustomValidator. Veja alguns exemplos:</p>
<ul>
<li>CEP</li>
<li>CNPJ</li>
<li>CNS</li>
<li>CPF</li>
<li>Data</li>
<li>Data/Hora</li>
<li>Números decimal</li>
<li>Dígito verificador</li>
<li>Email</li>
<li>Hora</li>
<li>Números</li>
<li>PIS/PASEP</li>
</ul>
<p>Essas validações são comumente utilizadas na maioria das aplicações. Eu implementei cada uma delas em Javascript e construi uma página em ASP.NET que demonstra a utilização de cada uma delas com o CustomValidator.  Se desejar ver ou ter todas ou alguma dessas validações <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/">clique aqui</a>.</p>
<p>Então é isso.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/294/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/294/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/294/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/294/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/294/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/294/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/294/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/294/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/294/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/294/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=294&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/05/10/validar-campos-no-cliente-com-net-e-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>Relatórios em .NET: ReportViewer e NHibernate</title>
		<link>http://reginaldojr.wordpress.com/2009/05/06/relatorios-em-anet-reportviewer-e-nhibernate/</link>
		<comments>http://reginaldojr.wordpress.com/2009/05/06/relatorios-em-anet-reportviewer-e-nhibernate/#comments</comments>
		<pubDate>Wed, 06 May 2009 14:48:31 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Todos]]></category>
		<category><![CDATA[aspnet]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[relatorio]]></category>
		<category><![CDATA[reportviewer]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=289</guid>
		<description><![CDATA[Quem utiliza sistemas de informações sabe da importância dos relatórios. Eles são tão importantes quanto o próprio banco de dados. Listagens, gráficos, resumos, sumários, formulários são alguns exemplos de resultados que essas ferramentas devem ser capazes de fornecer. Claro que dada tipo de resultado será aplicado em um contexto. Cada sistema precisa emitir relatórios de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=289&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Quem utiliza sistemas de informações sabe da importância dos relatórios. Eles são tão importantes quanto o próprio banco de dados. Listagens, gráficos, resumos, sumários, formulários são alguns exemplos de resultados que essas ferramentas devem ser capazes de fornecer. Claro que dada tipo de resultado será aplicado em um contexto. Cada sistema precisa emitir relatórios de acordo com a necessidade do trabalho onde for utilizado. Por exemplo, os gráficos são normalmente utilizados para avaliação e gestão. As listagens são utilizadas para buscas, levantamentos, etc. O fato é que relatórios são de vital importância para quem utiliza algum sistema de gerenciamento de dados.</p>
<p>Por outro lado, os desenvolvedores de sistemas sabem da dificuldade de se construir um relatório. Isso sem falar das alterações que possam surgir posteriormente. Todos procuram alguma ferramenta que possa minimizar o desgaste natural causado pelo processo de construção e manutenção de relatórios. A situação tende a se agravar quando falamos de relatórios para sistemas web. Isso por que os navegadores trabalham com HTML. A situação natural é montar relatórios utilizando esta linguagem diretamente e isso não é tão trivial assim. Mesmo utilizando alguma outra linguagem que rode do lado do servidor o resultado final deve ser em HTML que é o que os navegadores são capazes de exibir. Para aumentar o poder desses navegadores alguns recursos podem ser utilizados: ActiveX, Plugins, Flash, Applets, etc. Essas e outras tecnologias, além de dar maior poder aos navegadores, aumentam a produtividade dos desenvolvedores já que podem utilizar ferramentas mais completas para gerar os relatórios que serão vistos nos navegadores.</p>
<p>Em .NET não seria diferente. Montar relatórios é um processo muito delicado. A pergunta é qual a melhor forma? Qual a melhor ferramenta? Resposta: EU NÃO SEI. Mas será que existe uma forma dita &#8220;melhor&#8221;?! Mas, como todo programador, eu também tenho a minha forma que pode não ser a melhor nem a mais ortodoxa. Mas é a minha forma e é com ela que tenho resolvido a maioria dos problemas. Vou compartilhar com voces.</p>
<p>A minha primeira experência em .NET foi quando eu tive que migrar um sistema do Delphi para o Visual Studio 2003. Neste sistema existe inúmeros relatórios. Inicialmente fiz as telas de usuário. Como o sistema em delphi utiliza as procedures de banco como regras de negócio não tive muitos problemas. Tive apenas que refazer as telas que iriam chamar as procedures. O problema começou na hora dos relatórios. Inicialmente tentei utilizar o Crystal Reports. Não me identifiquei com ele. Achei muito complicado e etc. A primeira solução que me veio a cabeça foi a seguinte: já que os relatórios estavam todos prontos em Delphi utilizando views e procedures do banco de dados decidi criar em Delphi um servidor de relatórios. O funcionamento era +ou- assim:</p>
<ol>
<li>Um programa executavel criado em delphi e instalado no servidor encapsulava todos os meus relatórios. Este programa tinha a capacidade de exportar relatórios em PDF para a pasta web da minha aplicação.</li>
<li>Este programa era chamado de dentro da minha aplicação asp.net passando alguns parâmetros:  id-relatorio, arq-pdf-saida, param-1, param-2, &#8230; , param-n. O id-relatório identificava o relatório que eu gostaria de imprimir. Os parêmetros, de 1 a n, eram passados de acordo com a necessidade da instrução SQL do relatório.</li>
<li>O programa recebia estes parêmtros, conectava-se ao banco, extraia os dados do banco, montava o relatório e exportava para pdf em uma pasta com nome e path indicado pelo arq-pdf-saida.</li>
<li>A aplicação aguardava o término do processo até um certo limite e redirecionava o browser para o arquivo pdf gerado. Com o Adobe Reader instalado o navegador baixava este pdf e exibia ao usuário.</li>
</ol>
<p>Durante muito tempo este sistema funcionou assim. Principalmente por que eu não tinha muito tempo para refazer toda aplicação inclusive os relatórios em 100% .NET utilizando o Crystal.</p>
<p>Mas, novas versões deste sistema foram surgindo e com elas, a necessidade de utilizar uma forma 100% .NET de fazer relatórios. Fiz algumas buscas e achei algumas ferramentas muito interessantes:</p>
<ol>
<li><a href="http://www.devexpress.com/Products/NET/Reporting/" target="_blank">DevExpress</a></li>
<li><a href="http://www.afalinasoft.com/" target="_blank">Afalinasoft</a></li>
<li><a href="http://www.stimulsoft.com/ReportsWeb.aspx" target="_blank">StimulSoft</a></li>
<li><a href="http://www.perpetuumsoft.com/Downloads.aspx?lang=pt" target="_blank">PerpetuumSoft</a></li>
<li>(&#8230;)</li>
</ol>
<p>Algumas eu testei e gostei. Todas são muito boas e integradas ao IDE do Visual Studio. Cada uma com suas características e diferenciais. Mas todas tem a principal limitação para o tipo de trabalho que eu faço:  não são gratuitas. Porém nada impede de utilizar a versão demo convivendo com algumas situações. Uma coloca o nome DEMO no meio de cada página impressa. Outra limita o número de páginas impressas. Outra coloca uma pequena propaganda no final da página. Enfim&#8230;. Pra mim era inviável.</p>
<p>Há também quem prefira fazer relatórios em HTML para exibir diretamente no navegador. Separei também um link para esses programadores: <a href="http://www.webly.com.br/tutorial/net/8861/aspnet-gerar-relatorio-em-html.htm" target="_blank">http://www.webly.com.br/tutorial/net/8861/aspnet-gerar-relatorio-em-html.htm</a>.</p>
<p>Foi quando eu conheci o <strong>ReportViewer</strong>. Estudei um pouco sobre ele. Dê uma olhada nos endereços abaixo e conheça também um pouco mais:</p>
<ol>
<li><a href="http://www.macoratti.net/aspn_grv.htm" target="_blank">http://www.macoratti.net/aspn_grv.htm</a></li>
<li><a href="http://www.devmedia.com.br/articles/viewcomp.asp?comp=5371" target="_blank">http://www.devmedia.com.br/articles/viewcomp.asp?comp=5371</a></li>
<li><a href="http://blog.adsystems.com.br/2009/04/10/tutorial-c-relatorios-master-detail-com-reportviewer/" target="_blank">http://blog.adsystems.com.br/2009/04/10/tutorial-c-relatorios-master-detail-com-reportviewer/</a></li>
<li><a href="http://www.macoratti.net/08/03/vbn5_rpv.htm" target="_blank">http://www.macoratti.net/08/03/vbn5_rpv.htm</a></li>
<li><a href="http://www.macoratti.net/08/03/vb8_rpv2.htm" target="_blank">http://www.macoratti.net/08/03/vb8_rpv2.htm</a></li>
<li><a href="http://csharpbrasil.com.br/2008/09/11/criando-relatorio-com-reportviewer-em-aspnet/" target="_blank">http://csharpbrasil.com.br/2008/09/11/criando-relatorio-com-reportviewer-em-aspnet/</a></li>
</ol>
<p>Não vou entrar em detalhes do funcionamento. Os links acima são bem explicativos.  Mas duas novas questões surgem:</p>
<ol>
<li>Eu não gostaria de utilizar o visualizador padrão do ReportViewer. Gostaria de exportar os relatórios diretamente para pdf para utilizar o Adobe Reader como visualizador no prórprio navegador.</li>
<li>Gostaria da utilizar o <strong>NHibernate</strong> como minha fonte de dados também. O natural é conectar o banco com algum DataSource. Gostaria que os dados viessem da minha camada de negócio (BO) e não conectando diretamente o banco. Principalmente pelo fato da independência de dados que já comentei e posts anteriores.  Sem falar no fato de obedecer as regras da arquitetura em camadas.</li>
</ol>
<p>Graças a Deus, consegui resolver os dois problemas. Não pretendo construir um tutorial para cada solução.Vou passar a idéia da solução. A implementação da proposta fica como exercício para o leitor.  É necessário ter conhecimento intermediário de OOP, persistência com NHibernate, Visual Studio e arquitetura em camadas. Em posts atenteriores dou uma ajuda nessas questões. Vale a pena dar uma olhada.</p>
<p>Vamos ao que interessa.</p>
<ol>
<li>Os relatórios desenvolvidos com ReportViewer podem ter como fonte de dados os DataTables. Esses DataTables podem ser criados tanto em tempo de execução quanto em tempo de desenvolvimento. Para nossa proposta é legal criá-los em tempo de desenvolvimento. Isso irá facilitar a confecção do arquivo de relatório (.rdlc). Faça isso. Abra um projeto no VS e adicione um item DataSet. Neste DataSet adicione um DataTable. As colunas do DataTable serão os campos que vc irá imprimir. Adicione as colunas com seus respectivos nomes.</li>
<li>Adicione um novo item ao seu projeto. Este item deve ser um Report (.rdlc). Agora voce deverá formatar o relatório de acordo com sua necessidade. Os links acima dão uma ideia de como trabalhar com a IDE. Uma coisa importante: as colunas do seu relatórios devem ser vindas do DataTable que voce criou no item anterior. Mas para que seja possível fazer essa associação voce deve vincular o relatório ao DataTable. No menu Report, selecione o DataSource. Na caixa suspenda selecione o DataTable que voce criou indicando-o como fonte de dados do relatório. A partir daí voce já pode adicionar colunas ao seu relatório.</li>
<li>Talvez vc queria indicar algumas informações no cabeçalho do seu relatório, tais como: nome da empresa, período, setor, etc. Isso deverá ser passado ao relatório através de parâmetros. No menu Report-&gt;Report Parameters voce pode indicar todos os parêmetros que desejar e posicioná-los no cabeçalho do relatório.</li>
</ol>
<p>Neste relatório voce pode definir: grupos, sumários, totais, gráficos, tabelas com números de linhas e colunas variáveis, etc. Consulte documentação do ReportViewer.  Com um pouco de prática tudo vai parecer muito natural. No início eu támbem demorei um pouco a me familiarizar com o ambiente. Há quem diga que no ReportViewer não dá pra fazer relatórios muito complexos. Para os relatórios do dia a dia tenho tido ótimos resultados. Sem falar no fato: ReportViewer é uma solução gratuita. Qualquer relatório mais complexo que sua empresa precise, posivelmente tenha que meter a mão no bolso. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Mas, continuando&#8230; A questão agora é o Nhibernate. Sem problemas! No seu DAO e/ou BO voce deve ter um método que retorne para a camada de apresentação os dados que prentende utilizar no relatório. Esses dados podem ser retornados de diversas formas: IList, IList&lt;&gt; ou o próprio DataTable, inclusive utilizando a estrutura definida no DataSet/DataTable do relatório. Não aconselho usar DataTable nas camadas BO e DAO para retornar dados. Surigo utilizar sempre IList&lt;&gt; nessas camadas e deixar pra conversão em DataTable na camada de apresentação utilizando algum <em>foreach</em>. (Já notou que eu uso C#, não é?) O DataTable destino será aquele mesmo que formatou o relatório do ReportViewer.  Associe o DataTable o relatório, preencha os campos de parâmetros e mande exibir. Vc pode seguir um dos tutoriais que indico acima.</p>
<p>Mas se vc não quiser utilizar o visualizador padrão do ReportViewer? Eu sempre exporto o relatório para PDF e envio  os bytes do arquivo diretamente para o STREAM de tela. No browser do cliente o Adobe Reader captura isso e abre no browser como arquivo PDF. Não há necessidade de gerar arquivo em disco como eu fazia no início.</p>
<p>Mas como fazer esta exportação! Vou dar duas sugestões. A primeira é aprender como se faz consultando os seguintes links: <a href="http://pareshjagatia.wordpress.com/2008/05/03/export-reportviewer-report-to-pdf-excel/" target="_blank">Link 1</a> e <a href="http://stiven.callas.com.br/post/Exportando-um-relatorio-rdl-para-PDF.aspx" target="_blank">Link 2</a>. A outra opção é &#8220;use o que tá pronto&#8221;. Na página de <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/"><strong>Sistemas c/ Fontes</strong></a> deste blog eu disponibilizo uma aplicação que faz exatamente as coisas que eu descrevi aqui. A aplicação é <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/contas-a-pagar-free/">Contas a Pagar on-line</a>. Nele voce pode encontrar os arquivos .rdlc criados, o DataSet com os DataTables criados e o método de exportação em PDF em funcionamento.  Há métodos para exportão para Excel e PDF, em vetor de bytes ou arquivo. Fica a sua escolha. Inclusive mostra como passar parâmetros para o relatório. Esse parâmetros podem ser exibidos, por exemplo, no cabeçalho do relatório como o nome do estabelecimento ou perído. Uma dica: visite esta <a>dica</a> que lá mostra como exportar diretamente para PDF ou Excel sem ter que passar pelo processo de seleção no ReportViewer.</p>
<p>Adiquira o  projeto e veja uma aplicação prontinha utilizando esses conceitos. Além de estar investindo em seu aprendizado está contribuindo para meus estudos e pesquisas. A implementação completa dos métodos fazem parte da Regisoft Library que voce também pode adquirir.</p>
<p>Bom, é isso. Obrigado pela atenção e até a próxima.</p>
<ol></ol>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/289/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=289&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/05/06/relatorios-em-anet-reportviewer-e-nhibernate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>Conversão de documentos para PDF em .NET</title>
		<link>http://reginaldojr.wordpress.com/2009/01/03/conversao-de-documentos-para-pdf-em-net/</link>
		<comments>http://reginaldojr.wordpress.com/2009/01/03/conversao-de-documentos-para-pdf-em-net/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 00:39:56 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Dicas.NET]]></category>
		<category><![CDATA[Todos]]></category>
		<category><![CDATA[convert2pdf]]></category>
		<category><![CDATA[converter para PDF]]></category>
		<category><![CDATA[doc2pdf]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[pps2pdf]]></category>
		<category><![CDATA[ppt2pdf]]></category>
		<category><![CDATA[rtf2pdf]]></category>
		<category><![CDATA[txt2pdf]]></category>
		<category><![CDATA[xls2pdf]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=200</guid>
		<description><![CDATA[Um cliente me solicitou um sistema que permitisse receber documentos via web. O sistema deveria ter uma página que permitisse fazer upload de documentos (.doc, .ppt, .xls, .txt, .pps, .rtf). Até aí, tudo bem. O Visual Studio possui componente para realizar esta operação facilmente. Em consulta no Google é possível encontrar inúmeras sugestões de código [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=200&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Um cliente me solicitou um sistema que permitisse receber documentos via web. O sistema deveria ter uma página que permitisse fazer upload de documentos (.doc, .ppt, .xls, .txt, .pps, .rtf). Até aí, tudo bem. O Visual Studio possui componente para realizar esta operação facilmente. Em consulta no Google é possível encontrar inúmeras sugestões de código e em diversas linguagens. </p>
<p>Acontecesse que o cliente não queria armazenar no banco de dados os arquivos recebidos em seu formato original. Ele gostaria que os arquivos, ao chegarem, fossem convertidos em PDF e, então, fossem armazenados num campo BLOB de uma tabela do banco de dados. Aí começou o problema!</p>
<p>Fiz algumas pesquisas na internet e descobri vários componentes pagos para realizar esta conversão. O cliente não estava disposto a contratar licensas do produto. E agora? Fiz, então,  inúmeras pesquisas afim de encontrar algum componente de código aberto que pudesse fazer conversão de documentos do office. Não encontrei nenhum. Aproveito para solicitar a quem encontrar algum componente gratuito que realize esta operação não deixe de registrar aqui. </p>
<p>Mas nem tudo foi perdido. Um componente .NET eu (ainda) não encontrei (me ajudem). Fui obrigado a apelar para outras soluções e encontrei uma bastante interessante. Vou descrevê-la aqui.</p>
<p>Achei um programa muito interessante que permite converter qualquer documento imprimível no Windows para PDF utilizando uma impressora virtual: <a href="http://www.pdfforge.org/products/pdfcreator" target="_blank">PDF Creator</a>. Conheça mais detalhes da ferramenta no site da comunidade. <a href="http://www.infowester.com/arquivospdf.php" target="_blank">Clique aqui</a> e conheça mais sobre o formato PDF.</p>
<p>Execute o programa de instalação, instalando também os exemplos (samples) quando for solicitado. Após instalado, na pasta de instalação do produto possui uma chamada COM (Isso mesmo. A solução foi usar COM/DCOM.) e nessa pasta possui exemplos de utilização do PDF Creator com várias linguagens, inclusive em .NET. Eu me inspirei no exemplo da pasta &#8220;C:\Arquivos de programas\PDFCreator\COM\Dot Net\VS2005\C#&#8221;. Voce pode abrir esse projeto no Visual Studio, compilar e tirar sua próprias conclusões.Tudo está muito bem explicado. Este exemplo faz uso do ActiveX para permitir a conversão de documentos.</p>
<p>Quanto ao sistema do cliente devo informar que essa solução teve alguns inconvenientes: <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
1) Deve ter instalado no servidor WEB o PDFCreator bem como o programa padrão para o arquivo que deseja converter.<br />
2) Nem todos os arquivos podem ser utilizados para impressão/conversão pelo processo. Pelo menos com os arquivos do Office 2003 (.doc, .ppt, .xls, .txt, .pps, .rtf) que eu testei, foram convertidos sem nenhum problema em um site.<br />
3) Arquivos com macros, links dinâmicos, etc. e arquivos que, quando aberto necessitem de alguma confirmação para continuar abertura no programa também são problemas. Por exemplo, a princípio não há como converter .html por causa da necessidade de escolha da impressora de saída. O esquema só é útil para arquivos que permitam impressão direta pela impressora padrão sem intervenção do usuário.<br />
4) O COM do PDF creator não permite abrir várias instâncias do programa. Isso pode ser um problema em sistema WEB onde vários usuários podem estar efetuando a conversão ao mesmo tempo. Caberá ao programador cuidar disso.<br />
5) As vezes pode ser necessário encerrar (kill) algum processo pendente do PDF Creator na memória. Sem isso outras conversões não poderão ser feitas por causa do motivo do item 4. Também caberá ao programador cuidar disso.<br />
6) Quando tentar executar um módulo web com acesso ao componente COM possivelmente dê esse erro: Retrieving the COM class factory for component with CLSID {3A619AE4-50EC-46C8-B19E-BE8F50DD2F22} failed due to the following error: 80070005. Pra isso também há solução. <a href="http://www.computerperformance.co.uk/Logon/code/code_80070005.htm" target="_blank">Clique aqui</a> e veja como resolver o problema.<br />
7) Por último, não consegui converter arquivos pelo PDFCreator rodando diretamente em uma página hospedada no IIS. Tentei de tudo e nada. O programador deverá buscar formas de contornar essa situação. Eu consegui dar um jeito nisso também.</p>
<p>Esses foram alguns dos problemas que enfrentei e acho que utilizei uma boa solução para alguns desses problemas. Claro que tem situações que, a princípio, não há o que ser feito. Aproveito para indicar um pequeno sistema web que construi baseado no PDF Creator. Ele permite o upload de arquivos e faz a conversão. Tratei alguns os problemas que comento acima (só os passíveis de solução). Quem desejar conhecer, o projeto se chama <strong>Convert2PDF</strong> e faz conversão via web de arquivos do Microsoft Office 2003. <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/">Cliqui aqui</a> e veja mais detalhes.</p>
<p>Quem tiver novidades sobre esse assunto não deixe de registrar aqui.</p>
<p>É isso.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/200/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=200&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2009/01/03/conversao-de-documentos-para-pdf-em-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>
	</item>
		<item>
		<title>Servidor de Aplicação em .NET</title>
		<link>http://reginaldojr.wordpress.com/2008/08/31/servidor-de-aplicacao-em-net/</link>
		<comments>http://reginaldojr.wordpress.com/2008/08/31/servidor-de-aplicacao-em-net/#comments</comments>
		<pubDate>Sun, 31 Aug 2008 14:43:57 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Todos]]></category>
		<category><![CDATA[acesso remoto]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[remoting]]></category>
		<category><![CDATA[servidor de aplicacao]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=161</guid>
		<description><![CDATA[A arquitetura em camadas tem sido amplamente adotada pelos analistas e desenvolvedores de sistemas computacionais. Isso porque esta arquitetura favorece a aplicação de vários conceitos envolvendo a engenharia de software como, por exemplo, modularidade, manutenibilidade, etc. O conceito que motivou a escrita deste post é a escalabilidade, ou seja, o desafio de construir sistemas preparados [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=161&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>A arquitetura em camadas tem sido amplamente adotada pelos analistas e desenvolvedores de sistemas computacionais. Isso porque esta arquitetura favorece a aplicação de vários conceitos envolvendo a engenharia de software como, por exemplo, modularidade, manutenibilidade, etc. O conceito que motivou a escrita deste post é a escalabilidade, ou seja, o desafio de construir sistemas preparados para &#8220;crescer&#8221;. Um sistema e dito escalável, por exemplo, quando seu desempenho aumenta com acréscimo de hardware. Não estou falando em ficar mais rápido por que agora ele está rodando em um servidor mais rápido do que o antigo. Estou falando em potencial de crescimento e adaptação a cenários de produção. Imagine a situação: Uma pequena empresa com poucos recursos financeiros requisitou da equipe de TI um sistema de gestão empresarial. Após levantamento de requisitos, avaliação das condições de infraestrutura, decidiu-se pela seguinte configuração: arquitetura cliente/servidor. Um servidor de banco de dados foi colocado na rede e a aplicação cliente faria solicitações a este servidor. A aplicação cliente implementava todas as regras de negócio do sistema de gestão e o servidor de banco de dados serviria apenas como repositório de dados. A princípio tudo funcionava bem: LAN com poucos usuários, poucos dados no banco&#8230; Mas a empresa cresceu. Mais usuários na rede, maior volume de dados, novas filiais, negócios via internet, novas regras de negócio, etc. Já está claro que o velho sistema precisaria ser reescrito. Talvez até em outra plataforma de desenvolvimento. Sem falar que, possivelmente, novos especialistas em TI precisarão ser contratados ou, pelo menos, os anteriores terão que passar por algum treinamento/reciclagem. Tudo isso porque não se pensou na possibilidade do sistema crescer em necessidades de regras de negócio juntamente com a necessidade de infraestrutura. A pequena empresa, hoje, tem condições para investir em mais computadores-servidores, internet, redes de longa distância. Ela tem alto volume de dados que precisam ser tratados com velocidade dentro e fora do ambiente da empresa.  Eu pergunto: é qualquer sistema que pode se adaptar a esta nova realidade? O grande desafio é <em>CONSTRUIR SISTEMAS PREPARADOS PRA CRESCER</em>. O sistema não precisa nascer grande mas deve possuir características que, com pequenas adaptações, tenha seu potencial aumentado.</p>
<p>Um bom começo para quem prentende trabalhar com escalabilidade é verificar se seu sistema admite a possibilidade de trabalhar utilizando um servidor de aplicação: as aplicações clientes (desktop ou web) fazem requisições a um servidor. Neste servidor estão implementados todas as regras de negócio e esse servidor faz acesso ao banco de dados para, então, responder às solicitações. Para utilizar essa proposta, que modificações voce teria que fazer no seu sistema?</p>
<ol>
<li>Teria que reescrever o sistema em outra plataforma?</li>
<li>Teria que efetuar algumas mudanças sim. Voce acha que dá pra fazer? Em quanto tempo?</li>
<li>Teria que, primeiro ser treinado em ambiente em camadas pra depois pensar nisso?</li>
<li>Teria que, primeiro mudar sua forma de programar?</li>
<li>Teria que colocar as regras de negócio da aplicação em um só lugar para depois pensar no servidor de aplicação?</li>
<li>Teria que modelar o sistema primeiro em orientação a objetos?</li>
<li>Outro &#8220;teria&#8221; qualquer&#8230;.</li>
</ol>
<p>Veja que parece simples responder a esta pergunta mas não é tão imediato assim. Nem todos os sistemas são preparados para isso efetivamente. Outras respostas:</p>
<ol>
<li>Construimos o sistema com esta visão. Foi previsto que o projeto teria grande possibilidade de crescimento tanto em recursos quanto em necessidades.</li>
<li>Sim. É só modificar o arquivo de configurações do sistema para que as aplicações clientes façam solicitações para o servidor.</li>
<li>Sim. Só preciso modificar uma linha do sistema, recompila-lo e recoloca-lo em produção.</li>
<li>Quantos servidores posso utilizar? Pelo menos um servidor para DAO´s e banco de dados e um outro servidor de regra. Poderiam ser mais servidores de aplicação espalhados pela rede. Depende apenas do nível de resposta que a empresa pretende ter e da disponibilidade de recursos físicos.</li>
<li>O sistema permite dividir papéis facilmente.</li>
<li>Outros &#8220;só se for agora&#8221; qualquer&#8230;.</li>
</ol>
<p>Se voce puder utilizar alguma dessas respostas, parabéns. Voce já está no caminho certo. É essa linha que a engenharia de software moderna quer que os novos sistemas sigam. Para aqueles que aindam não perseguem estes objetivos vou tentar passar algumas dicas como roteiro inicial a seguir.</p>
<p>Eu utilizava .NET 1.1 quando me fiz a seguinte pergunta: Em J2EE, pode-se configurar a utilização de um servidor de aplicação através dos EJB containers. JBoss é um exemplo de servidor de aplicação gratuito em Java. Qual o servidor de aplicação para .NET??? Há um tempo atrás fui a uma apresentação sobre .NET 2.0 com Visutal Studio 2005. Na saída fiz essa pergunta ao facilitador e ele me respondeu com uma palavra: &#8220;Remoting&#8221;. Ao chegar em casa me dediquei a pesquisar sobre o assunto. A seguir, deixo indicado um artigo que serviu de base para nossa trajetória sobre o assunto:</p>
<p><a href="http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=691" target="_blank">.NET Remoting – Parte 1 &#8211; Acessando informações remotamente</a><br />
<a href="http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=794" target="_blank">.NET Remoting – Parte 2 &#8211; Acessando informações remotamente</a></p>
<p>Desde então temos trabalhado para que a construção dos nossos sistemas tenham carateríscas que viabilizem a arquitetura de acesso remoto. As pessoas que acompanharam em nosso blog os post entitulados <a href="http://reginaldojr.wordpress.com/2008/06/25/visual-studio-nhibernate-construindo-aplicacoes-em-camadas/" target="_blank"><strong>NHIbernate + Visual Studio: Construindo aplicações em camadas</strong></a> devem ter notado em algumas partes dos códigos e da explanação a presença de flags para utilização de servidor de aplicação. Desenvolvemos uma solução chamada <strong>RemoteServer.NET</strong> em Visual Studio 2005 com 3 projetos que casa perfeitamente com esses indicadores:</p>
<ol>
<li>RemoteServerWin: Um servidor de aplicação utilizando .NET Remoting que roda como aplicação do windows.</li>
<li>RemoteServerService: Um servidor de aplicação, também utilizando .NET Remoting que roda como serviço do windows.</li>
<li>RemoteServerSetup: Um instalador dos projetos anteriores.</li>
</ol>
<p>Vamos entender o esquema abaixo numa proposta didática, porém bem próxima de uma arquitetura ideal:</p>
<p><a href="http://reginaldojr.files.wordpress.com/2008/08/server_aplic.jpg"><img class="aligncenter size-full wp-image-163" src="http://reginaldojr.files.wordpress.com/2008/08/server_aplic.jpg?w=500&#038;h=283" alt="" width="500" height="283" /></a></p>
<p>No ínicio do processo temos um usuário utilizando o seu computador para fazer solicitações ao servidor web através de um navegador. O servidor web é responsável apenas pela apresentação e desenho da página web. Qualquer necessidade de processamento de regras de négocio deverá ser enviada ao servidor de negócio. A linha usuario-navegador-servidor web-servidor de negócio poderia ser subistituida por outras configurações: celular-servidor web-servidor de negócio, aplicativo windows-servidor de negócio, etc. O fato é que o servidor de negócio precisa está preparado para receber e responder a requisições remotas. Neste servidor estaria configurado o <strong>RemoteServer.NET</strong> para responder solicitações da camada de apresentação. Algumas vezes o servidor de aplicação precisaria acessar dados do banco de dados. Esse acesso, de acordo com padrões de projetos e arquitetura em camadas deveria ser através de DAO´s. Logo poderiamos ter um servidor DAO para responder requisições feitas pelo servidor de negócio. Neste servidor DAO também teria instalado o <strong>RemoteServer.NET</strong> para responder requisições remotas. Por fim, temos uma máquina como servidor de banco de dados para acesso a dados.</p>
<p>As possibilidades são inúmeras. Imagine um enorme volume de usuários fazendo acesso ao servidor de regra. Poderiamos colocar novos servidores de negócio pra dividir a carga ou mesmo, mais servidores de acesso a dados fazendo com que as requisições fossem aleatórias a estes servidores evitanto o engarrafamento de requisições no mesmo servidor. Poderiamos também fazer replicação sincrona de dados no banco ou mesmo, utilização de cluster para dividir a carga de acesso ao banco de dados. Tudo dependendo do potencial do parque de informática da empresa e necessidade de acesso rápido ás informações. Adicionemos a tudo isso uma dose de XML Web Service para que outra aplicações possam conectar-se diretamente a seu servidor de regras via web.</p>
<p>As aplicações que voce desenvolve suporta essas possibilidades?  Isso é ESCALABILIDADE.</p>
<p>Na nossa página de <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/" target="_blank">Sistemas c/ Fontes</a> estamos disponbilizando a solução <strong>RemoteServer.NET</strong> para aqueles que desejarem adquirir e ampliar seus horizontes. Vale lembrar que o RemoteServer.NET sozinho não faz milagre. A aplicação como um todo deve ser pensada para suportar esses requisitos. O primeiro passo é repensar seus conceitos em desenvolvimento e pesquisar soluções que sejam multi-utilizáveis.</p>
<p>Quem desejar adiquirir esse e outros produtos entre em <a href="http://reginaldojr.wordpress.com/contato/">contato</a>. Teremos o maior prazer em responder. Voce estará contribuindo para manter nossas pesquisas bem como, a qualidade das nossas publicações.</p>
<p>É isso.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/reginaldojr.wordpress.com/161/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/reginaldojr.wordpress.com/161/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=161&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2008/08/31/servidor-de-aplicacao-em-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>

		<media:content url="http://reginaldojr.files.wordpress.com/2008/08/server_aplic.jpg" medium="image" />
	</item>
		<item>
		<title>Visual Studio + NHibernate: Construindo aplicações em camadas &#8211; (cont. VI)</title>
		<link>http://reginaldojr.wordpress.com/2008/08/10/visual-studio-nhibernate-construindo-aplicacoes-em-camadas-cont-vi/</link>
		<comments>http://reginaldojr.wordpress.com/2008/08/10/visual-studio-nhibernate-construindo-aplicacoes-em-camadas-cont-vi/#comments</comments>
		<pubDate>Sun, 10 Aug 2008 15:05:43 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Todos]]></category>
		<category><![CDATA[BO]]></category>
		<category><![CDATA[camada de apresentacao]]></category>
		<category><![CDATA[camadas]]></category>
		<category><![CDATA[DAO]]></category>
		<category><![CDATA[firebird]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[mygeneration]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[sistemas]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=140</guid>
		<description><![CDATA[No post anterior criamos as classes que vão dar suporte às regras de negócio da nossa aplicação. Neste post, que é o último desta série, vamos criar a nossa camada de apresentação. Não pretendo aqui esgotar o assunto sobre isso, nem mesmo desenvolver todas as telas do sistema. O que iremos fazer é dá uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=140&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>No post anterior criamos as classes que vão dar suporte às regras de negócio da nossa aplicação. Neste post, que é o último desta série, vamos criar a nossa camada de apresentação. Não pretendo aqui esgotar o assunto sobre isso, nem mesmo desenvolver todas as telas do sistema. O que iremos fazer é dá uma idéia inicial sobre a comunicação entre as camadas e criar uma página web que possa servir de base para o trabalho do desenvolvedor.</p>
<p>Até o momento tudo que fizemos foi puramente conceitual. E, de posse dos conceitos, utilizamos scripts para gerar os códigos. Destaque para algumas bibliotecas que encapsulam funcionalidades ligadas ao Hibernate, visando diminuir codificação e ganho em reaproveitamento de código. Daqui pra frente quem manda é a critatividade e a prática do programador para desenvolver a aplicação de acordo com os requisitos de sistemas definidos no projeto. Eu considero que é deste ponto que se inicia o trabalho de codificação efetivamente, visto que, até o momento, utilizamos geradores de código para criar as camadas que darão suporte a nossa aplicação. Eu utilizo essa prática em todo sistema corporativo que desenvolvo. Claro que a medida que vão surgindo outras necessidades, tanto as bibliotecas, quanto os scripts vão sofrendo adaptações. Por exemplo, desde quando comecei a escrever esta série algumas mudanças foram feitas nos scripts bem como na biblioteca. Isso é fácil de entender: a medida que vamos trabalhando, vamos aprendendo e aprimorando nossos hábitos e conceitos. Isso faz parte do ser humano: fazer hoje, melhor que ontém.</p>
<p>Então vamos iniciar os trabalhos. Abra a nossa solução no Visual Studio e adicione um novo projeto. Uma vez me perguntaram se este projeto poderia ser em windows forms. Claro que sim. Pode ser qualquer projeto de GUI: web, windows forms ou  console. A camada de apresentação é o local onde o usuário final irá interagir com seu sistema. Quem define isso é o documento de requisitos. No nosso caso será um projeto web. Adicione um <strong>web site</strong> ou um <strong>web application</strong>. Eu prefiro utilizar<strong> web application</strong> e com suporte a <strong>AJAX</strong>. Qual a diferença? Bom&#8230; Eu começei no VS 2003 e ele já utilizava o conceito de <strong>web application</strong>. Eu gostava porque os arquivos .cs não precisavam ser colocados no site em produção. Ele gerava uma única .dll que implementava todas as classes. No web site, temos que colocar em produção os arquivos .cs que serão compilados, gerando as dll&#8217;s, em tempo de execução. Vantagem e desvantagem: Na web application qualquer modificação precisa ser recompilada. No web site modificações podem ser feitas diretamente no arquivo em produção. A compilação será feita automaticamente. Por outro lado, na web application tem como evitar a ação de pessoas não autorizadas nos códigos-fontes da  sua aplicação, enquanto no web site não tem como impedir diretamente. Teria que ser via sistama operacional. Enfim, veja o que é melhor. Fiquei com web application&#8230; Adicionei projeto web application com nome &#8220;AgendaTelefonica&#8221;. O Visual Studio gerou os arquivos.</p>
<p>Primeira coisa a fazer é configurar o Hibernate. Vamos utilizar o web.config para isso. Essa configuração vai dizer ao NHibernate qual banco de dados estamos utilizando e onde ele está (usuario, senha, dialeto, tipo de banco, etc.). Uma outra informação que eu coloco neste arquivo é o nome do assembly O/R. Quem vai ler esta informação é a bilbioteca <strong>Regisoft.Camadas.dll</strong> para configurar o mapeamento do Hibernate.  Neste arquivo, em nossa aplicação e relacionado ao Hibernate, não mexeremos mais neste arquivo. A menos que desejemos fazer alguma mudança ou adicionar algum recurso novo, como por exemplo, se desejarmos trabalhar como servidor remoto. Mas isso é assunto de outros posts.</p>
<p>Precisamos adicionar algumas referências em nossa aplicação web. Clique no botão direito do mouse sobre o nome do projeto que acabamos de adicionar e selecione &#8220;Add Reference&#8230;&#8221;. Selecione a guia project e, nessa guia, selecione os projetos BO, Interface e OR (não selecione o DAO) e clique em &#8216;OK&#8217;.. Lembre da obediência a hierarquia em cadamas que discutimos anteriormente. A camada de apresentação só pode fazer requisições à camada de negócio. Nunca à camada DAO. Lembra da biblioteca <strong>Regisoft.dll</strong>? Adicione ela também. Mas duas bibliotecas serão necessárias: <strong>Regisoft.web.dll</strong> e <strong>Regisoft.Web.UI.WebControls</strong>. A primeira possui recursos para manipulação de javascript, limpeza automática de campos da tela, atribuição automática de valores dos objetos O/R a campos da tela, etc. A segunda são alguns componentes da toolbox que eu adicionei alguns novos recursos.  Como voce já sabe, todas essas bibliotecas são encontradas na pasta &#8216;<strong>Bibliotecas</strong>&#8216; no local onde voce instalou o <strong>RSClass</strong>.</p>
<p>Para quem tiver alguma dúvida, o arquivo <strong>web.config</strong> pode ser encontrado no site do tutorial (<a href="http://tutorialagendatelefonica.googlecode.com" target="_blank">http://tutorialagendatelefonica.googlecode.com</a>). A Regisoft.Web.UI.WebControls.dll deve ser adicionada também na Toolbox do Visual Studio para facilitar. Para fazer isso clique com botão direito do mouse em qualquer lugar da Toolbox e selecione &#8220;<strong>Add Tab</strong>&#8220;. Dê um nome: &#8220;Regisoft&#8221;. Clique ainda com botão direito dentro da tab criada e selecione &#8220;<strong>Choose Items&#8230;</strong>&#8220;. Quando a janela aparecer clique em &#8220;<strong>Browse</strong>&#8221; e localize a biblioteca <strong>Regisoft.Web.UI.WebControls.dll</strong> (na pasta &#8216;Bibliotecas&#8217; no local de instalação do <strong>RSClas</strong>. Confirme&#8230; Pronto! Os componentes foram adicionados. Abra a página Default.aspx e veja que na tab &#8220;Regisoft&#8221; possui alguns componentes. Inclusive essa é a maneira de adicionar webcontrols na Toolbox. Toda vez que voce baixar um componente visual pode adicioná-lo na toolbox dessa forma &#8211; Dica.NET <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Mas algumas considerações na configuração do NHibernate. No web.config há informações sobre o banco de dados (driver, dialect, conecctionstring, etc.). Como estamos utilizando o Firebird precisamos adicionar o driver do banco ao sistema. Clique no projeto web com botão direito do mouse e selecione &#8216;<strong>Add Reference&#8230;</strong>&#8216;. Localize o arquivo <strong>FirebirdSql.Data.FirebirdClient.dll</strong> que está na pasta &#8216;Bibliotecas&#8217; no local de instalação do <strong>RSClass</strong> e adicione ao projeto. Outro arquivo que também terá que adicionar ao projeto web é o <strong>NHibernate.ByteCode.Castle.dll</strong>. Nessa nova versão do NHibernate ele precisa desse arquivo. Ainda não li sobre a utilidade. Mas devemos adicionar se não o NHibernate não irá funcionar. Quem souber da utilidade deste arquivo e quiser contribuir eu agradeço.</p>
<p>Se tudo foi feito corretamente teremos a seguinte tela (mais ou menos assim):</p>
<p><a href="http://reginaldojr.files.wordpress.com/2008/08/camada_apresent.jpg"><img class="aligncenter size-medium wp-image-141" src="http://reginaldojr.files.wordpress.com/2008/08/camada_apresent.jpg?w=300&#038;h=187" alt="" width="300" height="187" /></a></p>
<p>Já estamos com nosso ambiente preparado para iniciar os trabalhos. Vamos criar nossa primeira página web. Faremos uma página para inclusão de UF. Há quem ache que não precisa. Basta popular o banco de dados com essas informações, já que as UF não mudam constantemente. Eu concordo. Mas vamos construir para fins didáticos. Pra não perder a prática utilizaremos o <strong>RSClass</strong> pra facilitar o trabalho. Não iremos nos preocupar com aparência da página fica como exercício para os interessados.</p>
<p>Como não é uma tabela com muitos dados vamos gerar como tabela simples. No RSClass acesse o menu <em>Webform-&gt;Tabela</em>. Configure como mostrado abaixo.</p>
<p><a href="http://reginaldojr.files.wordpress.com/2008/08/gerar_webformtabela.jpg"><img class="aligncenter size-full wp-image-368" title="gerar_webformtabela" src="http://reginaldojr.files.wordpress.com/2008/08/gerar_webformtabela.jpg?w=500&#038;h=182" alt="gerar_webformtabela" width="500" height="182" /></a></p>
<p>Algumas informações importantes sobre essa geração de páginas:</p>
<ol>
<li>Na pasta destino voce pode selecionar o local do deu projeto onde quer que seja gerado os arquivos. Pode ser na principal ou em subpastas do seu projeto;</li>
<li>Atenção para isso: o título da página deve ser informado sem acentuação e cedilhas. Os acentos só devem ser colocados quando a página for incluída no projeto e convertida em web application. Veremos isso mais tarde;</li>
<li>No campo arquivo é o nome do arquivo a ser gerado. Não coloque extensão. O próprio RSClass irá fazer isso.</li>
<li>A namespace é formada pelo nome do projeto (no nosso caso AgendaTelefonica) e pelas pastas internas onde o arquivo será gerado separado por ponto(.). Exemplo se voce gerar dentro de um projeto <em>Estoque</em> na pasta interna <em>Almoxarifado</em> a namespace deve ser <em>Estoque.Almoxarifado</em>;</li>
<li>Selecione a tabela;</li>
<li>Se voce pretende usar uma master page na página geraada marque a última caixa. A página será gerada com estrutura de WebForm Content. No nosso exemplo não estamos utilizando.</li>
</ol>
<p>No Visual Studio, clique em &#8220;<strong>Show All Files</strong>&#8220;, selecione os dois arquivos gerados, clique em um deles com o botão direito do mouse e selecione &#8220;<strong>Include In Project</strong>&#8220;. Agora, clique em UnidadesFederacao.aspx com o botão direito do mouse e selecione &#8220;<strong>Convert to Web Application</strong>&#8220;.</p>
<p>Vamos gerar agora a classe de acesso aos BO´s. Como já dissemos anteriormente vamos utilizar uma arquitetura em camadas sendo que os acessos aos componentes da camada inferior serão feitos por uma única via. Abra o <strong>RSClass</strong> e no menu <strong>Gerar-&gt;BOAccess.cs</strong> gere o arquivo.  Usando o mesmo procedimento do parágrafo acima inclua o arquivo no projeto (<em>Include in Project</em>).</p>
<p>Defina a página UnidadesFederacao.aspx como &#8220;<strong>Set As Start Page</strong>&#8221; e execute a aplicação. Vamos ver se funciona&#8230;</p>
<p>Pra variar, PROBLEMAS!!!!! Vamos as correções:</p>
<ol>
<li>Normalmente eu crio sistema com controle de acessos. E este, como foi definido nos requisitos inicias, também deve ter. Deveriamos ter feito primeiro o controle de acesso ao sistema num tela de login. Mas como o objetivo é didático pulamos esta etapa. Então vamos comentar algumas lihas da nossa primeira página. No método <span style="color:#ff0000;">protected void Page_Load(object sender, EventArgs e) </span>da página comente as linhas <span style="color:#ff0000;">if (u == null)</span> e<br />
<span style="color:#ff0000;"> Response.Redirect(&#8220;~/Index.aspx&#8221;)<span style="color:#000000;">; Voce sabe. Comentar é adicionar duas barras (//) na frente da linha</span><span style="color:#000000;">.</span></span></li>
<li><span style="color:#ff0000;"><span style="color:#000000;">Eu também constumo desenvolver sistemas que eu chamo multi-empresa. São sistemas que podem ser utilizados por várias empresa ao mesmo tempo. Uma sem acessar os dados da outra. Nesse caso no cadastro do usuário é definido a que empresa ele pertence. Assim no momento das listagens e outra operações é informado ao sistema a empresa do usuário e as operações só serão executadas em dados dessa empresa. Esse não é o nosso caso. Então localize no sistema a o método </span></span><span style="color:#ff0000;">protected DataTable getDataTable()</span>. Altere a linha <span style="color:#ff0000;">IList&lt;AgendaTelefonica.OR.Uf&gt; lst = BOAccess.getBOFactory().UfBO().Listar(u.IdEmpresa)</span> para <span style="color:#ff0000;">IList&lt;AgendaTelefonica.OR.Uf&gt; lst = BOAccess.getBOFactory().UfBO().Listar(&#8220;Sigla&#8221;)</span>. Veja que a única coisa que mudou foi o parâmetro do método &#8216;<strong>Listar</strong>&#8216; que era &#8216;<strong>u.IdEmpresa</strong>&#8216; e passou a ser &#8216;<strong>Sigla</strong>&#8216;.</li>
</ol>
<p>Depois dessas modificações a página já pode ser testada. Note e a página é bem simples e complatemente funcional. Seria interessante adicionar alguns recursos visuais com CSS ou coisas do tipo. Mas não é objetivo deste material.</p>
<p>A verdade é que os geradores de código não resolvem todos os problemas. Mas adiantam bastantes. Com algumas modificações podemos ter ótimos resultados. Imagine se tívessemos que escrever tudo do zero&#8230;</p>
<p>Vamos agora ilustrar a adição de métodos de acesso a dados no DAO. Abra o UfDAO.cs e adicione as seguintes linhas:</p>
<p><span style="color:#0000ff;">public Uf SelecionarPorSigla(string sigla)<br />
{<br />
return this.SelecionarPor(&#8220;Sigla&#8221;, sigla);<br />
}<br />
public IList&lt;Uf&gt; ListarPorDescricao(string descricao)<br />
{<br />
string hql = @&#8221;select uf from Uf uf<br />
where uf.Descricao like :descricao<br />
order by uf.Descricao&#8221;;<br />
IQuery query = Get&lt;ISession&gt;().CreateQuery(hql);<br />
query.SetAnsiString(&#8220;descricao&#8221;, descricao + &#8220;%&#8221;);<br />
return query.List&lt;Uf&gt;();<br />
}<br />
public IList&lt;Uf&gt; ListarPorSigla(string sigla)<br />
{<br />
ICriteria crit = Get&lt;ICriteria&gt;()<br />
.Add(Expression.InsensitiveLike(&#8220;Sigla&#8221;, sigla, MatchMode.Start))<br />
.AddOrder(Order.Asc(&#8220;Descricao&#8221;));<br />
return crit.List&lt;Uf&gt;();<br />
}<br />
</span><br />
Veja que criamos 03 métodos DAO´s. Um com critéria, outro com HQL (Hibernate Query Language) e outro utilizando um método nativo da classe BaseDAO. Veja que o controle da sessão do Hibernate vem do <strong>Get&lt;ISession&gt;()</strong> e o critéria vem do <strong>Get&lt;ICriteria&gt;()</strong>. Ambos implementados no BaseDAO. Veja também que com a utilização da nossa bilbioteca a construção de métodos de acesso a dados com Hibernate é bem facilitada. Abra tambem a interface IUfDAO.cs e adicione as seguintes linhas:</p>
<p>Uf SelecionarPorSigla(string sigla);<br />
IList&lt;Uf&gt; ListarPorDescricao(string descricao);<br />
IList&lt;Uf&gt; ListarPorSigla(string sigla);</p>
<p>Qualquer novo método que for adicionado nos DAO´s deverá também adicionar a declaração na interface correspondente. Agora abra o UfBO.cs e adicione as seguintes linhas:</p>
<p><span style="color:#0000ff;"> public Uf SelecionarPorSigla(string sigla)<br />
{<br />
if (sigla == string.Empty || sigla == null)<br />
throw new ExceptionRS(&#8220;Necessário informa a sigla&#8221;);<br />
return ufDAO.SelecionarPorSigla(sigla);<br />
}<br />
public IList&lt;Uf&gt; ListarPorDescricao(string descricao)<br />
{<br />
if (descricao == string.Empty || descricao == null)<br />
throw new ExceptionRS(&#8220;Necessário informa a descricao&#8221;);<br />
return ufDAO.ListarPorDescricao(descricao);<br />
}</span><br />
Na regra de negócio nos fazemos chamadas aos nóvos métodos do DAO. Adicionamos uma pequena regra que determina que os parêmetros de entrada não podem ser vazio ou nulos. Todas essas validações podem ser colocadas aqui. Eu diria que DEVEM. Mas há quem coloquem apenas na página web através dos componentes ASP.NET de validações. Eu costumo validar os dados de entrada tanto na tela com os componentes de validação, quanto no objeto de négocio. Isso por que caso eu esqueça de validar na tela de entrada certamente no objeto de negócio uma excessão será gerada.</p>
<p>Como fizemos no IUfDAO.cs, vamos fazer com IUfBO.cs. Abra-o e adicione as seguintes linhas:</p>
<p><span style="color:#0000ff;">Uf SelecionarPorSigla(string sigla);<br />
IList&lt;Uf&gt; ListarPorDescricao(string descricao);<br />
IList&lt;Uf&gt; ListarPorSigla(string sigla);<br />
</span><br />
Note que algumas linhas já estão lá definidas assim como no UfBO.cs e IUfBO.cs. Essas linhas foram adicionadas pelo <strong>RSClass</strong>.</p>
<p>Se desejarmos utilizar esses novos métodos na camada de apresentação precisamos primeiro declará-los na camada de negócio. Isso para obedecer a hirerarquia entre as camadas. Vamos faze isso. Abra o UfBO.cs e adicione os seguintes métodos:</p>
<p><span style="color:#0000ff;">public Uf SelecionarPorSigla(string sigla)<br />
{<br />
return ufDAO.SelecionarPorSigla(sigla);<br />
}<br />
public IList&lt;Uf&gt; ListarPorDescricao(string descricao)<br />
{<br />
return ufDAO.ListarPorDescricao(descricao);<br />
}<br />
public IList&lt;Uf&gt; ListarPorSigla(string sigla)<br />
{<br />
return ufDAO.ListarPorSigla(sigla);<br />
}<br />
</span></p>
<p>Também será necessário acrescentar algumas linhas na interface IUfBO.cs:</p>
<p><span style="color:#0000ff;">Uf SelecionarPorSigla(string sigla);<br />
IList&lt;Uf&gt; ListarPorDescricao(string descricao);<br />
IList&lt;Uf&gt; ListarPorSigla(string sigla);</span></p>
<p>Lá já tem várias métodos declarados. São os métodos que podem ser chamados na camada de apresentação. Agora nós adicionamos mais 03 métodos para serem utilizados. Após estes procedimentos, os novos métodos já estão disponíveis para utilização na página. Fica como exercício: modificar a página para localizar dados por descrição. Dica: O <strong>RSClass</strong> possui outros layouts de página para serem gerados. Cada layout tem uma finalidade bem definida. Para mais informações acesse <a href="http://rsclass.wordpress.com" target="_blank">http://rsclass.wordpress.com</a>.</p>
<p>É possível modificar os arguivos gerados para que os DAO´s, BO´s e banco de dados possam rodar em um servidor de aplicação, enquanto que o servidor web e/ou outros programas desktop rodam em outras máquinas fazendo solicitações ao servidor. Mas isso é assunto de posts futuro.</p>
<p>Deixo como exercício para o leitor implementar as outras páginas e recursos do site de acordo com a especificação inicial. Também me coloco a disposição para tirar dúvidas, dar treinamento, sugestões,  etc. Veja a página de <a href="http://reginaldojr.wordpress.com/contato/" target="_self"><strong>Contato</strong></a> e sabia como me localizar. Acesse <a href="http://tutorialagendatelefonica.googlecode.com" target="_blank">http://tutorialagendatelefonica.googlecode.com</a> para baixar o código-fonte completo deste tutorial.</p>
<h2>CONCLUSÃO</h2>
<p>Desenvolver sistema é um trabalho desgastante. Mas este desgaste pode ser bem diminuido. Padrões de projetos, geradores de código, pesquisas e toda a engenharia de software podem ser aliados nessa tarefa de desenvolver bons programas.</p>
<p>Aproveito para indicar nossa área de <a href="http://reginaldojr.wordpress.com/sistemas-c-codigo-fonte/">Sistemas c/ Fontes</a>. Adiquira um projeto completo para auxiliar no seu estudo e contribuir em nossas pesquisas.</p>
<p>Desde já agradeço a todos e até os próximos.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/reginaldojr.wordpress.com/140/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/reginaldojr.wordpress.com/140/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/140/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/140/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/140/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=140&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2008/08/10/visual-studio-nhibernate-construindo-aplicacoes-em-camadas-cont-vi/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>

		<media:content url="http://reginaldojr.files.wordpress.com/2008/08/camada_apresent.jpg?w=300" medium="image" />

		<media:content url="http://reginaldojr.files.wordpress.com/2008/08/gerar_webformtabela.jpg" medium="image">
			<media:title type="html">gerar_webformtabela</media:title>
		</media:content>
	</item>
		<item>
		<title>Visual Studio + NHibernate: Construindo aplicações em camadas &#8211; (cont. V)</title>
		<link>http://reginaldojr.wordpress.com/2008/07/26/visual-studio-nhibernate-construindo-aplicacoes-em-camadas-cont-v/</link>
		<comments>http://reginaldojr.wordpress.com/2008/07/26/visual-studio-nhibernate-construindo-aplicacoes-em-camadas-cont-v/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 14:22:19 +0000</pubDate>
		<dc:creator>reginaldojr</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Todos]]></category>
		<category><![CDATA[BO]]></category>
		<category><![CDATA[camadas]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[mygeneration]]></category>
		<category><![CDATA[NHibernate]]></category>
		<category><![CDATA[visual studio]]></category>

		<guid isPermaLink="false">http://reginaldojr.wordpress.com/?p=103</guid>
		<description><![CDATA[No post anterior desta série discutimos sobre a criação da camada DAO. Geramos as classes e interfaces, além de preparar um DAOFactory que é o caminho por onde serão feitos acessos às funcionalidades dos DAO´s. Vimos também como utilizar uma classe abstrata BaseDAO que, combinada com o MyGeneration, pode facilitar bastante no uso dos recursos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=103&subd=reginaldojr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>No post anterior desta série discutimos sobre a criação da camada DAO. Geramos as classes e interfaces, além de preparar um DAOFactory que é o caminho por onde serão feitos acessos às funcionalidades dos DAO´s. Vimos também como utilizar uma classe abstrata <em>BaseDAO</em> que, combinada com o MyGeneration, pode facilitar bastante no uso dos recursos do Hibernate.</p>
<p>Neste post vamos discutir sobre a camada de regras de negócio (BO). Vamos acessar os DAO´s através de um DAOAccess e criar um BOFactory para que a camada de apresentação possa utilizar este caminho para fazer acessos ou requisições às regras de negócio.</p>
<p>Como o próprio nome já diz a camada de regras de negócio define as regras ou comportamentos que a aplicação terá durante o processamento de requisições oriundas da camada de apresentação. Esta camada pode ser formada por uma ou várias classes que serão responsáveis por controlar a entrada e saída de informações. Não acho legal criar uma única classe para controlar todas as regras de negócio da aplicação. Procuro agrupar em classes, separando as operações relacionadas. Dessa forma consigo ter melhor visão dos módulos da aplicação.</p>
<p>Mas o que tem numa classe de negócio?! Como sabemos uma classe é formada basicamente por métodos e propriedades. Os métodos irão ser chamados na camada de apresentação para realizar as operações de negócio. As porpriedades irão formar parâmetros de entrada ou saída da classe para determinar algum comportamento do método. Vamos conhecer algumas métodos e propriedades que podemos colocar numa classe de negócio:</p>
<ol>
<li>Inclusão e alteração de dados. Esses métodos são os mais comuns em qualquer aplicação que utilize banco de dados. Eles serão chamados pela camada de apresentação para realizar a devida operação no banco de dados (através dos DAO´s); Nesses métodos podemos encontrar procedimentos comuns em operações de inclusões e alterações. E, por exemplo:
<ul>
<li>validação de permissões de usuário;</li>
<li>validação de campos;</li>
<li>verificações de relacionamentos entre tabelas do banco;</li>
<li>verificações de violação de índices ou chaves;</li>
<li>abertura e fechamento de transações;</li>
<li>inserções e/ou alterações em tabelas;</li>
<li>outros processos durante a operação.</li>
</ul>
</li>
<li>Exclusões. Esses métodos realizam operações de exclusão de dados do banco. Internamente também possui procedimentos comuns ao processo:
<ul>
<li>validação de permissões;</li>
<li>verificação de violação de relacionamentos;</li>
<li>verificações de violação de índices ou chaves;</li>
<li>abertura e fechamento de transações;</li>
<li>eliminações de dados em tabelas</li>
<li>outros processos durante a operação.</li>
</ul>
</li>
<li>Seleções de linhas da tabela. Esses métodos vão dar suporte a consultas e listagens que a camada de apresentação possa necessitar e também para outros objetos de negócio:
<ul>
<li>Seleção de uma linha da tabela por chave primária ou índice único;</li>
<li>Listagem de registros das tabelas controlada ou não por filtro;</li>
</ul>
</li>
</ol>
<p>Acredito que, no mínimo, todas as aplicações realizam alguma ou todas as operações e sub-processos citados acima. Já que esses processos são comuns a maioria das aplicações em camadas e que fazem acesso a banco de dados, seria interessante que pudessemos automatizar a criação desses métodos. Foi exatamente o que eu fiz criando o <strong>RSClass</strong>. Vamos utilizá-lo para gerar as classes da nossa camada de negócio.</p>
<p>Claro que, obedecendo a hierarquia em camadas, as classes de negócio fazem chamadas às classes DAO´s. E essas chamadas são feitas atravéz do DAOFactory por um DAOAccess. Parece complicado mas não é. Apenas estou determinando que nenhuma classe DAO seja instanciada com <em>new</em> diretamente na camada de negócio. Quem terá essa responsabilidade será o DAOAccess e quem irá responder a essas solicitações de instanciamento dos objetos é o DAOFactory.</p>
<p>O processo de criação dos BO´s e das interfaces usando o <strong>RSClass</strong> é similar ao que fizemos na criação dos DAO´s e suas interfaces. Inclusive sei que alguns leitores já se adiantaram e geraram essas classes por conta própria, através de nossa explicação anterior. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Só irei fazer alguns comentários sobre este processo:</p>
<ol>
<li>As intefaces devem ser geradas na pasta BO da biblioteca AgendaTelefonica.Interface. O RSClass já sabe disso e gera os arquivos no local correto de acordo com as configurações realizadas anteriormente.</li>
<li>De maneira similar, os BO´s serão gerados na pasta da biblioteca AgendaTelefonica.BO.</li>
<li>No Visual Studio, após ter sido gerado os arquivos, selecione as classes e, clicando com o botão direito do mouse em algum dos arquivos selecionados, selecione a opção &#8220;<strong>Include In Project</strong>&#8220;. Isso deve ser feito em cada biblioteca onde os arquivos foram gerados.</li>
<li>Tembém será necessário <strong>&#8220;Add Reference&#8230;</strong>&#8221; no projeto AgendaTelefonica.BO para os arquivos <strong>Regisoft.dll</strong> e <strong>Regisoft.Camadas.Interface.dll</strong>. Normal. Afinal de contas toda essa estrutura utiliza a <strong>Regisoft Library</strong> pra agilizar o processo. Esses arquivos podem ser encontrados na pasta &#8216;<strong>Bibliotecas</strong>&#8216; no local onde voce instalou o <strong>RSClass</strong>. Se voce quiser adiquirir os fontes para estudar, guardar, aprimorar&#8230; acesse a página &#8220;<strong>Sistema c/ Fontes</strong>&#8221; e saiba como.</li>
<li>Após a realização dos procedimentos o Solution Explorer estará assim:</li>
</ol>
<p><a href="http://reginaldojr.files.wordpress.com/2008/07/solution_explorer_8.png"><img class="aligncenter size-full wp-image-107" src="http://reginaldojr.files.wordpress.com/2008/07/solution_explorer_8.png?w=250&#038;h=582" alt="" width="250" height="582" /></a></p>
<p>É importante conhecer o conteúdo dos arquivos gerados e entender seu funcionamento. Destaque para os arquivos</p>
<ul>
<li>DAOAccess.cs, que se comunica com a camada DAO através do DAOFactory.cs;</li>
<li>BOFactory.cs que será a via de comunicação entre a camada de apresentação e a regra de negócio.</li>
<li>IBOFactory.cs que é a interface de exposição do BOFactory.cs</li>
</ul>
<p>Aproveite e olhe a estrutura dos arquivos BO´s gerados, por exemplo CidadeBO.cs. Veja que nele e em todos os outros BO´s existe uma estrutura inicial com aquelas funcionalidades principais e comuns a todos os arquivos de regra de negócio (valiação, inserção, exclusão, etc.).  Note também que no construtor do BO existe a ligação com o DAO correspondente e todos os métodos fazem uso desta instãncia do DAO.</p>
<p>Não é necessário ter um BO para cada DAO correspondente. Voce pode agrupá-los em funcionalidades próximas na sua aplicação, criando assim uma visão de módulo. Por exemplo, voce pode embutir num único BO as funcionalidades para controlar endereços. Neste BO irá conter todos os métodos para gerenciar endereços: UF, Cidade, CEP, etc.  Assim, na camada de apresentação, voce pode fazer uso de um certo <em>EnderecoBO</em> e nele já possuir tudo que se precisa pra controle de endereço: seleções, inclusões, alterações, etc. de Uf&#8217;s, cidades, ceps, etc&#8217;s. Inclusive está é a atitude mais comum no que diz respeito a criação de BO&#8217;s.</p>
<p>Certamente durante o desenvolvimento da camada de apresentação será necessário criar vários novos métodos para operações de seleção de dados e/ou persistência, tanto nos DAO&#8217;s quanto nos BO&#8217;s. Paralelamente, alterações nas respectivas interfaces também serão necessárias. Tudo para que os BO&#8217;s realizem com exatidão seu papel de controlar a regra do negócio. Montamos o esqueleto principal que dará suporte a aplicação. No próximo e último post estaremos criando o projeto do site para camada de apresentação. Vamos criar uma tela que servirá de base para entendimento do processo e criação das outras. Vamos criar também novos métodos em alguns DAO´s e BO´s para mostrar um pouco do potencial do Hibernate nesta questão.</p>
<p>Os arquivos gerados até o momento podem ser baixados no site <a href="http://tutorialagendatelefonica.googlecode.com" target="_blank">http://tutorialagendatelefonica.googlecode.com</a>.</p>
<p>Fiquem a vontade para comentar. Espero que estejam gostando e até o próximo!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/reginaldojr.wordpress.com/103/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/reginaldojr.wordpress.com/103/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/reginaldojr.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/reginaldojr.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/reginaldojr.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/reginaldojr.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/reginaldojr.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/reginaldojr.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/reginaldojr.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/reginaldojr.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/reginaldojr.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/reginaldojr.wordpress.com/103/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=reginaldojr.wordpress.com&blog=2045084&post=103&subd=reginaldojr&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://reginaldojr.wordpress.com/2008/07/26/visual-studio-nhibernate-construindo-aplicacoes-em-camadas-cont-v/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/716d3e8262500b91f982d2128c16159c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">reginaldojr</media:title>
		</media:content>

		<media:content url="http://reginaldojr.files.wordpress.com/2008/07/solution_explorer_8.png" medium="image" />
	</item>
	</channel>
</rss>