<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6919314286166182197</id><updated>2011-11-20T09:38:47.896-03:00</updated><category term='Skin'/><category term='qualidade de software'/><category term='LINQ'/><category term='Visual Studio'/><category term='testes'/><category term='JPAjaxControlToolkit'/><category term='CSS'/><category term='GridView'/><category term='SQL Server 2005'/><category term='AJAX'/><category term='migração'/><category term='Theme'/><category term='ASP.Net'/><category term='T-SQL'/><category term='Visual Basic 9.0'/><category term='Team Foundation'/><category term='Team Foundation Web Access'/><category term='WPF'/><category term='CodePlex'/><category term='C# 3.0'/><title type='text'>JP dotNet</title><subtitle type='html'>Blog sem qualquer pretensão porém com conteúdo de qualidade. Você encontra aqui as mais variadas dicas, artigos e links sobre programação em .Net, banco de dados SQL Server, processos de desenvolvimento, novidades da área e tudo que girar ao redor desta maravilhosa tecnologia.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-720464990930031611</id><published>2009-09-25T19:39:00.002-03:00</published><updated>2009-09-25T19:49:34.674-03:00</updated><title type='text'>CustomValidator e PageMethods</title><content type='html'>Olá,&lt;br /&gt;&lt;br /&gt;Hoje precisei utilizar uma rotina antiga criada por mim (ainda da época do ATLAS) para usar CustomValidator com PageMethods.&lt;br /&gt;&lt;br /&gt;Acontece que, ao testar mais profundamente a página, encontrei alguns bugs oriundos do fato das chamadas serem assíncronas.&lt;br /&gt;Não que minha rotina antiga não previsse isso, mas fazia um workarround (para não dizer gato) que falhava em algumas situações específicas.&lt;br /&gt;&lt;br /&gt;Bom, após alguma pesquisa encontrei um artigo no CodeProject (&lt;a href="http://www.codeproject.com/KB/ajax/SynchronousAJAX.aspx"&gt;http://www.codeproject.com/KB/ajax/SynchronousAJAX.aspx&lt;/a&gt;) que solucionava isto fazendo uma chamada síncrona ao servidor.&lt;br /&gt;O código está abaixo e minha customização foi mínima, apenas para facilitar a utilização final:&lt;br /&gt;&lt;br /&gt;// Chama um webmethod.   &lt;br /&gt;function GetWebValidationMethod(metodo, argumentos) {&lt;br /&gt;        var pagina = '&lt;%=Page.Request.Url.AbsolutePath%&gt;';&lt;br /&gt;        metodo = pagina + '\\' + metodo;&lt;br /&gt;        var result = GetSynchronousJSONResponse(metodo, argumentos);&lt;br /&gt;        result = eval('(' + result + ')');&lt;br /&gt;        return result.d;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Realiza chamadas síncronas.   &lt;br /&gt;function GetSynchronousJSONResponse(url, postData) {&lt;br /&gt;        var xmlhttp = null;&lt;br /&gt;        if (window.XMLHttpRequest)&lt;br /&gt;            xmlhttp = new XMLHttpRequest();&lt;br /&gt;        else if (window.ActiveXObject) {&lt;br /&gt;            if (new ActiveXObject("Microsoft.XMLHTTP"))&lt;br /&gt;                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;            else&lt;br /&gt;                xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;        }&lt;br /&gt;        // to be ensure non-cached version of response&lt;br /&gt;        url = url + "?rnd=" + Math.random();&lt;br /&gt;        xmlhttp.open("POST", url, false); //false means synchronous&lt;br /&gt;        xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");&lt;br /&gt;        xmlhttp.send(postData);&lt;br /&gt;        var responseText = xmlhttp.responseText;&lt;br /&gt;        return responseText;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Para usar as rotinas, bastar seguir o exemplo abaixo para o script executado pelo CustomValidator:&lt;br /&gt;&lt;br /&gt;function OnValidarFormatoCNPJCPF(source, args) {&lt;br /&gt;        var argumentos = '{"CNPJ":"' + args.Value + '"}';&lt;br /&gt;        args.IsValid = GetWebValidationMethod('ValidarCNPJ', argumentos);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Neste caso, os argumentos devem ser construídos como um objeto JSON e, ao chamar o método, passa-se o nome do webmethod e os argumentos.&lt;br /&gt;&lt;br /&gt;Até a próxima, JP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-720464990930031611?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/720464990930031611/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=720464990930031611' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/720464990930031611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/720464990930031611'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2009/09/customvalidator-e-pagemethods.html' title='CustomValidator e PageMethods'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-8731964375975096289</id><published>2009-06-25T20:37:00.003-03:00</published><updated>2009-06-25T20:51:16.528-03:00</updated><title type='text'>Windows 7 VHD Boot</title><content type='html'>&lt;div&gt;&lt;div&gt;Fala-se muito sobre a recurso de boot a partir de um VHD (disco virtual do Virtual PC e do Hyper-V) no Windows 7.&lt;/div&gt;&lt;div&gt;A maioria dos passos não é tão simples para usuários não familiarizados uma vez que usa as ferramentas diskpart,  imagex e bcdedit que não possuem interface gráfica, exigindo, assim, o uso do prompt de comando.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Encontrei no site da Microsoft uma demonstração passo-a-passo, em um vídeo de pouco mais de 20 minutos, que vale muito a pena assistir.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=80EDE31D-3509-407B-A896-0BEEA8705589&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=80EDE31D-3509-407B-A896-0BEEA8705589&amp;amp;displaylang=en&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-8731964375975096289?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/8731964375975096289/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=8731964375975096289' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8731964375975096289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8731964375975096289'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2009/06/windows-7-vhd-boot.html' title='Windows 7 VHD Boot'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-1241649629519564229</id><published>2009-05-12T18:55:00.003-03:00</published><updated>2009-05-12T19:20:02.256-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>Split e join de strings em T-SQL</title><content type='html'>Olá,&lt;br /&gt;&lt;br /&gt;Um das maiores necessidades dos desenvolvedores que trabalham com T-SQL é o de passar uma string com separadores como parâmetro em uma stored procedure, por exemplo, e usá-la como argumento em uma cláusula where como um conjunto, utilizando a palavra reservada IN.&lt;br /&gt;&lt;br /&gt;A necessidade inversa também é importante, ou seja, concatenar o resultado de um campo de uma select em uma string separada por um determinado delimitador.&lt;br /&gt;&lt;br /&gt;Estas tarefas, tão comuns em qualquer linguagem de programação, são também conhecidas como split e join.&lt;br /&gt;&lt;br /&gt;Para executá-las em T-SQL, existem várias maneiras e muitos já postaram milhares de modos, no entanto, segue minha contribuição que creio ser uma das mais simples e eficientes pois usa dos recursos de XML do T-SQL para seu fim.&lt;br /&gt;&lt;br /&gt;Para fazer o split:&lt;br /&gt;&lt;br /&gt;DELCARE @string VARCHAR(200)&lt;br /&gt;SET @string = '124, 456, 789, 121212, 3256 '&lt;br /&gt;DECLARE @xmlAuxiliar XML&lt;br /&gt;SET @xmlAuxiliar = '&lt;i&gt;' + REPLACE(@string, ',', '&lt;/i&gt;&lt;i&gt;') + '&lt;/i&gt;'&lt;br /&gt;SELECT x.i.value('.', 'INT') FROM @xmlAuxiliar.nodes('//i') x(i)&lt;br /&gt;&lt;br /&gt;Observação: pode-se substituir o INT da última instrução por outro tipo, como VARCHAR. Neste caso a lista seria algo como 'João, Pedro, Marcos, Lucas'&lt;br /&gt;&lt;br /&gt;Para fazer o join:&lt;br /&gt;&lt;br /&gt;SELECT NomeDoCampo + ', '&lt;br /&gt;FROM NomeDaTabela&lt;br /&gt;FOR XML PATH('')&lt;br /&gt;&lt;br /&gt;Observação: seu separador pode ser outro que não ', '. Caso o retorno do campo não seja um tipo caractere, é necessário converter.&lt;br /&gt;&lt;br /&gt;Abraços e até a próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-1241649629519564229?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/1241649629519564229/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=1241649629519564229' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/1241649629519564229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/1241649629519564229'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2009/05/split-e-join-de-strings-em-t-sql.html' title='Split e join de strings em T-SQL'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-5678843056981771551</id><published>2009-02-13T20:14:00.005-03:00</published><updated>2009-02-13T20:29:15.310-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JPAjaxControlToolkit'/><title type='text'>JPAjaxControlToolkit Release 0.5</title><content type='html'>Bom, tomei coragem.&lt;br /&gt;&lt;br /&gt;Finalmente abri meu Visual Studio, realizei um build completo e mandei a DLL para o CodePlex.&lt;br /&gt;Demorou e neste longo tempo quem queria algum dos componentes tinha de baixar o código e compilar por conta própria.&lt;br /&gt;Isto não é nada que se espere de um componente que você quer baixar e sair usando, até porque a necessidade à qual ele vai ser útil muitas vezes é "para ontem".&lt;br /&gt;&lt;br /&gt;Agora deixe-me justificar: não queria colocar uma DLL incompleta, pois queria pelo menos que os três componentes prometidos estivessem nela.&lt;br /&gt;Também não queria um código instável, mesmo sabendo que poderia liberar uma versão alfa, beta, etc.&lt;br /&gt;&lt;br /&gt;De toda forma é isso que quero com este post: anunciar a liberação de um release para o JPAjaxControlToolkit e agradecer às 427 pessoas que se interessaram pelo projeto, àquelas que baixaram seu código e, principalmente, àquelas que deram algum feedback.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/jpajaxcontroltoolkit"&gt;http://www.codeplex.com/jpajaxcontroltoolkit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Abraços, JP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-5678843056981771551?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/5678843056981771551/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=5678843056981771551' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/5678843056981771551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/5678843056981771551'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2009/02/jpajaxcontroltoolkit-release-05.html' title='JPAjaxControlToolkit Release 0.5'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-2582235014338997479</id><published>2009-02-02T10:29:00.004-03:00</published><updated>2009-02-02T10:59:36.872-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation Web Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation'/><title type='text'>Alterando a URL padrão da tela de login do Team System Web Access</title><content type='html'>Olá pessoal,&lt;br /&gt;&lt;br /&gt;Venho hoje expor um pequeno problema (e solução, claro!) que surgiu quando estava montando um ambiente completo para o Team Foundation Server (TFS), incluindo o TFS, um TFS proxy, um TFS Build e instalação do TFS Web Access.&lt;br /&gt;&lt;br /&gt;Como instalei o TFS Web Access em um servidor diferente do servidor do Team Foundation, ao entrar no Web Access era apresentada a tela de login com o campo “Team Foundation URL” preenchida, por padrão, com o nome do servidor diferente do servidor do Team Foundation.&lt;br /&gt;&lt;br /&gt;Após pesquisas rápidas, vejam o que encontrei:&lt;br /&gt;&lt;br /&gt;1 – Para mudar o nome padrão do servidor do TFS na tela do login do Web Access:&lt;br /&gt;&lt;br /&gt;- Edite o arquivo “web.config” que está no caminho “&lt;arquivodeprogramas&gt;\Microsoft Visual Studio [2005 ou 2008] Team System Web Access\Web”.&lt;br /&gt;- Em “tfServers” edite o nome do servidor e a porta.&lt;br /&gt;- Caso queira, acicione outras tags “add” para outros servidores. Ao colocar mais de um endereço o login do Web Access vai exibir uma dropdown ao invés de um textbox. A ordem que eles aparecerão no dropdown é a mesma ordem que estão no arquivo de configuração.&lt;br /&gt;&lt;br /&gt;2 – Para obrigar o usuário a usar sempre o mesmo servidor:&lt;br /&gt;&lt;br /&gt;- Na pasta “&lt;arquivodeprogramas&gt;\Microsoft Visual Studio [2005 ou 2008] Team System Web Access” entre em "Web\UI\Controls".&lt;br /&gt;- Edite o arquivo “Login.ascx”.&lt;br /&gt;- No elemento “tswa:EditableDropDown” altere sua propriedade “EditMode” para false.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-2582235014338997479?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/2582235014338997479/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=2582235014338997479' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2582235014338997479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2582235014338997479'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2009/02/tela-de-login-do-team-system-web-access.html' title='Alterando a URL padrão da tela de login do Team System Web Access'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-2964413446300289079</id><published>2009-01-05T16:04:00.005-03:00</published><updated>2009-01-06T09:07:15.875-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='qualidade de software'/><category scheme='http://www.blogger.com/atom/ns#' term='testes'/><title type='text'>Um guia para qualidade em aplicações WPF</title><content type='html'>Olá a todos,&lt;br /&gt;&lt;br /&gt;Quem quer ter o mínimo de sobrevivência (nem estou falando em sucesso) em nossa área não pode deixar de atualizar-se. Nosso caso especial é que estas atualizações não são periódicas, são constantes e, a todo instante, os mais “antenados” são bombardeados por informações de todos os lados.&lt;br /&gt;E não adianta pensar: “Já que uso a plataforma Microsoft, vou esperar as novidades virem da Microsoft”. Isto é um grande engano. Primeiro porque as novidades na plataforma não são exclusivas da Microsoft e, em segundo lugar, só o conhecimento gerado diretamente pela empresa já deixa qualquer biblioteca tradicional comendo poeira.&lt;br /&gt;O grande problema é que a velocidade e a quantidade de novas informações e tecnologias são grandes de tal forma que nos vemos estudando continuamente, preocupando-nos em saber “de tudo um pouco” e, volta e meia, esquecemo-nos de realizar um estudo mais profundo de algumas tecnologias que vêem (ainda no português do ano passado) para ficar.&lt;br /&gt;Periodicamente devemos reservar um espaço para refletirmos sobre tudo o que temos aprendido e verificar se existe alguma coisa que negligenciamos nesta caminhada e que valha a pena um aprofundamento. É ai que mora a qualidade, pois não basta aprender a fazer. Tem-se que aprender a fazer bem feito.&lt;br /&gt;Nesta esteira venho apresentar um excelente guia de qualidade para aplicações WPF. Tal guia foi escrito pelo próprio time de desenvolvimento do WPF.&lt;br /&gt;Além de indicar boas práticas no desenvolvimento destas aplicações, o guia traça um roteiro completo de como realizar testes nestas aplicações, principalmente no que se refere aos testes automatizados, o que de certa forma sempre foi uma carência para desenvolvedores “não-ASP.Net”. O guia aborda os vários aspectos dos testes, dentre outros: de interface com o usuário, de desempenho, de segurança, de globalização e localização, de acessibilidade e de stress.&lt;br /&gt;&lt;br /&gt;WPF Application Quality Guide&lt;br /&gt;&lt;a href="http://windowsclient.net/wpf/white-papers/wpf-app-quality-guide.aspx"&gt;http://windowsclient.net/wpf/white-papers/wpf-app-quality-guide.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fecho este post informando que terminei meus últimos testes com o RSAEncryptExtender e, no máximo até amanhã a noite, disponibilizarei no CodePlex pelo link &lt;a href="http://www.codeplex.com/jpajaxcontroltoolkit"&gt;http://www.codeplex.com/jpajaxcontroltoolkit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Abraços, JP.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-2964413446300289079?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/2964413446300289079/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=2964413446300289079' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2964413446300289079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2964413446300289079'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2009/01/um-guia-para-qualidade-em-aplicaes-wpf.html' title='Um guia para qualidade em aplicações WPF'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-7863926506657709286</id><published>2008-07-25T09:46:00.004-03:00</published><updated>2009-01-06T10:19:49.402-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JPAjaxControlToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='CodePlex'/><title type='text'>JPAjaxControlToolkit no CodePlex</title><content type='html'>&lt;p&gt;Olá a todos,&lt;br /&gt;&lt;br /&gt;Dando continuidade à evolução da biblioteca de controles AJAX que estou desenvolvendo, publiquei-a no CodePlex a fim de melhorar a distribuição, versionamento e colaboração entre os interessados.&lt;br /&gt;&lt;br /&gt;O projeto foi publicado com o nome JPAjaxControlToolkit sob a licença BSD.&lt;br /&gt;Escolhi a “New BSD License” pois não tenho qualquer pretensão de restringir o acesso e distribuição de seu código fonte, bem como sua utilização em projetos comerciais (este último, restrito pela licença GPL).&lt;br /&gt;&lt;br /&gt;O endereço do projeto é &lt;a href="http://www.codeplex.com/jpajaxcontroltoolkit"&gt;http://www.codeplex.com/jpajaxcontroltoolkit&lt;/a&gt; e, além do download de releases, terei um canal de comunicação com os usuários para discussões, aviso sobre bugs e solicitação de funcionalidades. O projeto também pode ser acessado via Visual Studio por meio do Team Foundation Server Explorer pelos colaboradores.&lt;br /&gt;&lt;br /&gt;Inicialmente a biblioteca terá três componentes: HierarchicalGridExtender, WizardSideBarExtender e RSAEncryptExtender.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;O HierarchicalGridExtender já foi explicado em um post do dia 2 de maio (&lt;a href="http://jpdotnet.blogspot.com/2008/05/hierarchicalgridextender-um-controle.html"&gt;http://jpdotnet.blogspot.com/2008/05/hierarchicalgridextender-um-controle.html&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;O WizardSideBarExtender está disponível no projeto do CodePlex mas vou escrever sobre ele aqui no blog no próximo post. Seu objetivo é bem simples: proporcionar ao usuário do controle Wizard do ASP.Net a possibilidade de posicionar sua sidebar no topo, no rodapé, a direita ou a esquerda do Wizard, sendo esta última opção a única possível originalmente no controle da framework.&lt;/li&gt;&lt;li&gt;Já o RSAEncryptExtender é um controle que estende uma TextBox a fim de criptografar seu conteúdo antes de enviar para o servidor HTTP. A criptografia é feita em JavaScript e a decriptografia é feita no lado do servidor usando as classes de segurança da framework. Esta solução é extremamente útil quando utilizamos, por exemplo, autenticação Forms sem SSL. Neste caso pode-se criptografar o campo senha que o usuário digitou no browser antes de enviá-la ao servidor.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Creio que o RSAEncryptExtender seja meu controle mais complexo até agora e, por isso mesmo, preciso terminar alguns testes antes de publicar uma versão minimamente estável. Estou testando em um de nossos sistemas e em breve disponibilizarei seu código e um post explicando sua utilização.&lt;/p&gt;&lt;p&gt;Bom, por enquanto é isso ai.&lt;br /&gt;&lt;br /&gt;Aguardem o próximo post com exemplo de uso do WizardSideBarExtender.&lt;br /&gt;&lt;br /&gt;Abraços, JP.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-7863926506657709286?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/7863926506657709286/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=7863926506657709286' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/7863926506657709286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/7863926506657709286'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2008/07/jpajaxcontroltoolkit-no-codeplex.html' title='JPAjaxControlToolkit no CodePlex'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-2285625740924237099</id><published>2008-05-02T11:10:00.009-03:00</published><updated>2009-01-06T10:10:34.212-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JPAjaxControlToolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='GridView'/><title type='text'>HierarchicalGridExtender - Um controle ASP.NET Ajax para adicionar hierarquia aos GridViews</title><content type='html'>Olá.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Hoje venho apresentar a primeira versão de uma coleção de controles ASP.Net Ajax que pretendo implementar baseado na AjaxControlToolKit e em seu template para desenvolvimento de Extender Controls. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Chamarei esta biblioteca de JPAjaxControlToolKit e distribuirei o código fonte de tudo o que desenvolver. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Nesta primeira versão apresento um controle que chamei de HierarchicalGridExtender que tem por finalidade adicionar o comportamento de grid hierárquico ao controle GridView nativo do ASP.Net. A imagem abaixo resume bem o objetivo deste extender:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://bp0.blogger.com/_hRXH_1JVRu4/SBsjPYYeNwI/AAAAAAAAAA8/TVbd7zLOoy8/s1600-h/ScreenHunter_002.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5195785342252103426" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_hRXH_1JVRu4/SBsjPYYeNwI/AAAAAAAAAA8/TVbd7zLOoy8/s400/ScreenHunter_002.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align="left"&gt;Propriedades do HierarchicalGridExtender: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="left"&gt;&lt;strong&gt;TargetControlID&lt;/strong&gt;: ID do objeto Image que deverá responder ao click do mouse e provocar o Collapse e Expand;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="left"&gt;&lt;strong&gt;PanelToCollapse&lt;/strong&gt;: ID do objeto Painel que comporta o conteúdo a ser escondido e exibido;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="left"&gt;&lt;strong&gt;ImageURLCollapsed &lt;/strong&gt;e &lt;strong&gt;ImageURLExpanded&lt;/strong&gt;: URLs para configurar a imagem em TargetControlID quando o painel estiver escondido e exibido, respectivamente. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p align="left"&gt;Alguns pontos importantes a considerar: &lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;O HierarchicalGridExtender deve ser colocado em uma coluna do GridView, no caso, uma TemplateField; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;O HierarchicalGridExtender não é um grid para substituir o GridView, ele apenas adiciona um comportamento ao GridView existente na framework. Você não precisa se preocupar em substituir os objetos GridView que já possui em sua aplicação, basta adicioná-lo ao GridView conforme item anterior;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O HierarchicalGridExtender não é um controle visual. Você pode configurar o seu GridView, Image, Panel e quaisquer outros objetos contidos neste com suas cores, comportamentos e demais recursos existentes, da mesma maneira que faz normalmente;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;O Panel em PanelToCollapse pode conter qualquer conteúdo, inclusive outro GridView, o que permite um design bem interessante como o mostrado na figura abaixo: &lt;/li&gt;&lt;/ul&gt;&lt;a href="http://bp1.blogger.com/_hRXH_1JVRu4/SBsjPoYeNxI/AAAAAAAAABE/8gPniCrQjkY/s1600-h/ScreenHunter_003.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5195785346547070738" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_hRXH_1JVRu4/SBsjPoYeNxI/AAAAAAAAABE/8gPniCrQjkY/s400/ScreenHunter_003.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;a href="http://bp0.blogger.com/_hRXH_1JVRu4/SBshuYYeNuI/AAAAAAAAAAs/BfVrWfhvNP4/s1600-h/ScreenHunter_003.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;div&gt;A imagem acima representa o uso que dei ao HierarchicalGridExtender em um de nossos sistemas. Como o conteúdo do GridView interno é relacionado a uma linha do GridView externo (o que creio ser padrão na maioria dos casos), eu adotei a seguinte estratégia:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Faço a consulta de todos os dados montando um DataSet e seus relacionamentos;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Coloco este DataSet em uma variável local da página;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No GridView externo faço o bind com a tabela pai;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No evento RowDataBound do GridView externo eu utilizo os métodos disponibilizados pelo próprio DataSet para retornar os “registros filhos”. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Exemplo:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Dim gvConsultasFilhas As GridView = CType(e.Row.FindControl("gvConsultasFilhas"), GridView)&lt;br /&gt;gvConsultasFilhas.DataSource = _dsConsultasPendentes.FLX_Fluxo.Rows.Find(e.Row.DataItem("FLX_Codigo")).GetChildRows("FluxoFluxoFilho")&lt;br /&gt;gvConsultasFilhas.DataBind()&lt;br /&gt;&lt;br /&gt;Você também pode querer ocultar a imagem e desabilitar o HierarchicalGridExtender quando não houver registros filhos. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Exemplo: &lt;/p&gt;&lt;br /&gt;&lt;p&gt;If gvConsultasFilhas.Rows.Count = 0 Then&lt;br /&gt;CType(e.Row.FindControl("hgeExpandir"), DPRAjaxControlToolkit.DPRAjaxControlToolkit.HierarchicalGridExtender).Enabled = False&lt;br /&gt;CType(e.Row.FindControl("imgIcone"), WebControls.Image).Visible = False&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Estas foram apenas algumas dicas de uso do HierarchicalGridExtender porém, como ele foi projetado para dar total flexibilidade no desenvolvimento, você pode usá-lo de variadas maneiras em diferentes problemas.&lt;br /&gt;&lt;br /&gt;Melhorias neste controle podem ser sugeridas. Prometo estudar cada uma e verificar sua viabilidade, porém não garanto a implementação das mesmas nem o prazo para tal, logo fiquem a vontade para modificar o componente. Caso também queiram compartilhar uma melhoria feita no controle, podem contatar-me que terei prazer em adicionar e compartilhar tal melhoria.&lt;/p&gt;&lt;p&gt;Até o próximo post.&lt;/p&gt;&lt;p&gt;Download: &lt;a href="http://www.codeplex.com/jpajaxcontroltoolkit"&gt;www.codeplex.com/jpajaxcontroltoolkit&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-2285625740924237099?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/2285625740924237099/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=2285625740924237099' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2285625740924237099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2285625740924237099'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2008/05/hierarchicalgridextender-um-controle.html' title='HierarchicalGridExtender - Um controle ASP.NET Ajax para adicionar hierarquia aos GridViews'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_hRXH_1JVRu4/SBsjPYYeNwI/AAAAAAAAAA8/TVbd7zLOoy8/s72-c/ScreenHunter_002.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-8612754765281313342</id><published>2008-04-23T09:43:00.003-03:00</published><updated>2009-01-06T10:18:21.401-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2005'/><title type='text'>Copiando um diagrama do SQL Server 2005 para outro banco de dados</title><content type='html'>Olá,&lt;br /&gt;&lt;br /&gt;A muito tempo não atualizo o blog e em conseqüência disso creio que perdi o público que havia conquistado.&lt;br /&gt;Pena... meu público já estava em quase 3 pessoas. :-)&lt;br /&gt;&lt;br /&gt;O blog é para mim, além de uma ferramenta de distribuição de conhecimento, uma ferramenta de preservação de conhecimento.&lt;br /&gt;Isto quer dizer que eu o uso como uma biblioteca para referência futura e o post de hoje tem basicamente este último objetivo.&lt;br /&gt;&lt;br /&gt;Antes de seguir uma das dicas aqui apresentadas, é importante que a estrutura do banco de dados de destino esteja igual ao banco de origem, pelo menos as tabelas que fazem parte do diagrama que se quer importar.&lt;br /&gt;&lt;br /&gt;Segue script que encontrei prontinho em &lt;a href="http://www.sharpdeveloper.net/content/archive/2008/04/19/copy-a-database-diagram-to-another-database.aspx"&gt;C# articles and tutorials on SharpDeveloper.NET&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;use&lt;/span&gt; Old_Database&lt;br /&gt;go&lt;br /&gt;--this will copy your database diagrams into a temporary table&lt;br /&gt;select * into dbo.#tempsysdiagrams from sysdiagrams&lt;br /&gt;&lt;br /&gt;use New_Database&lt;br /&gt;go&lt;br /&gt;insert into sysdiagrams ([name],principal_id,version,definition)&lt;br /&gt;select [name],principal_id,version,definition from dbo.#tempsysdiagrams where [name] = 'Name_of_your_Diagram'&lt;br /&gt;&lt;br /&gt;O script acima usa uma tabela temporária para armazenar o conteúdo da SysDiagrams do banco de origem e, após mudar para o banco de destino, realizar o insert neste.&lt;br /&gt;Em meu caso os bancos estavam em servidores diferentes, logo precisei usar o nosso amigo Integration Services (ferramenta ETL do SQL Server 2005).&lt;br /&gt;O caminho mais curto para realizar esta exportação/importação é clicar com o botão direito do mouse no banco de origem ou destino e selecionar “Tasks” -&gt; “Export Data” ou “Import Data”, conforme o caso.&lt;br /&gt;&lt;br /&gt;O importante aqui é lembrar que na tela “Select Source Table and Views” você deve selecionar a tabela “SysDiagrams” e clicar no botão “Edit mappings”. Na tela que se abre, ignore o campo “diagram_id”. O resto vai funcionar perfeitamente.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post. Daqui a um ano. :-)&lt;br /&gt;Brincadeira.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-8612754765281313342?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/8612754765281313342/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=8612754765281313342' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8612754765281313342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8612754765281313342'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2008/04/copiando-um-diagrama-do-sql-server-2005.html' title='Copiando um diagrama do SQL Server 2005 para outro banco de dados'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-2551615777383162642</id><published>2007-07-04T17:35:00.000-03:00</published><updated>2007-07-05T09:43:11.190-03:00</updated><title type='text'>Entendendo, executando e agendando as atualizações do data warehouse do Team Foundation Server</title><content type='html'>Olá.&lt;br /&gt;&lt;br /&gt;Depois de quase um mês sem escrever para o blog, venho trazer uma dica muito boa para quem está trabalhando com o Team Foundation Server.&lt;br /&gt;&lt;br /&gt;Após instalarmos o TFS e criar nossos primeiros projetos percebemos que os relatórios exibidos nos portais dos projetos estavam desatualizados.&lt;br /&gt;&lt;br /&gt;Antes de prosseguirmos com o artigo, dê uma olhada na figura abaixo. Ela representa como estão estruturados os bancos de dados do TFS bem como sua relação com o warehouse de onde os relatórios do Reporting Service acessam os dados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://bp0.blogger.com/_hRXH_1JVRu4/RowFuU25EAI/AAAAAAAAAAc/q-EUqxND1lw/s1600-h/imagem.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5083444372825509890" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_hRXH_1JVRu4/RowFuU25EAI/AAAAAAAAAAc/q-EUqxND1lw/s320/imagem.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Todo relatório do TFS possui em seu cabeçalho a informação “Last Warehouse Update” e percebemos que se iam vários dias sem que o warehouse fosse atualizado.&lt;br /&gt;&lt;br /&gt;Após estudar mais a fundo a documentação do TFS descobri que, por padrão, o warehouse deveria ser atualizado automaticamente a cada 3.600 segundos, ou seja, 1 hora.&lt;br /&gt;Para verificar o tempo deste agendamento, consulte a tabela _WarehouseConfig no banco de dados TFSWarehouse em seu servidor SQL Server do Team Foundation Server.&lt;br /&gt;O campo RunIntervalSeconds informa a quantidade de segundos do agendamento.&lt;br /&gt;&lt;br /&gt;Exemplo:&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;select * from _WarehouseConfig&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Não aconselho alterar diretamente as tabelas dos bancos de dados do TFS. Caso necessitemos alterar a freqüência de execução da atualização do warehouse podemos fazer isso por meio dos web services expostos pelo TFS.&lt;br /&gt;O web service responsável pelo gerenciamento do warehouse é o&lt;br /&gt;http://localhost:8080/Warehouse/v1.0/warehousecontroller.asmx&lt;br /&gt;e este web service expõe, dentre outros métodos, o método “ChangeSetting”.&lt;br /&gt;Este método possui dois parâmetros: settingID e newValue.&lt;br /&gt;Para alterar o intervalo de atualização do warehouse passe como parâmetros, respectivamente, RunIntervalSeconds e o número de segundos desejado.&lt;br /&gt;&lt;br /&gt;Este web service também expõe o método “Run” que pode ser chamado a qualquer momento e não necessita de parâmetros. Ao executar este método as atualizações do warehouse são executadas imediatamente.&lt;br /&gt;Caso você force a as atualizações do warehouse chamando o método “Run”, saiba que não necessariamente você terá seu portal de projetos atualizado imediatamente. Isto ocorre porque, por padrão, os relatórios do TFS no Reporting Service estão configurados para armazenar cache de 30 minutos. Isto quer dizer que, ou você aguarda no máximo mais meia hora para ver os novos dados ou altera as configurações do relatório desejado no Reporting Service.&lt;br /&gt;&lt;br /&gt;Porém o problema pode não estar na execução do web method. Você chama o “Run” e tudo é atualizado normalmente só que esta atualização continua não acontecendo no intervalo de segundos configurado.&lt;br /&gt;&lt;br /&gt;Este problema pode ser originado por várias razões. Aconselho uma visita a este link:&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms244674(VS.80).aspx"&gt;Troubleshooting the Data Warehouse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Também sugiro uma visita a &lt;a href="http://msdn2.microsoft.com/en-us/library/ms400797(VS.80).aspx"&gt;How to: Use Web Services to Enable and Configure Trace for Team Foundation Server Components&lt;/a&gt; que orienta sobre como ativar o trace de um componente do Team Foundation Server.&lt;br /&gt;&lt;br /&gt;Porém o nosso problema aqui era outro e não constava dos links que indiquei acima.&lt;br /&gt;&lt;br /&gt;Quem realiza a atualização periódica do warehouse é um serviço do TFS chamado TFSServiceScheduler. Este serviço pode ser gerenciado pelo Services na área administrativa do Windows. Seu executável está localizado em &lt;"diretório do TFS"&gt;&lt;tfs_install_path&gt;\TFSServerScheduler.&lt;br /&gt;&lt;br /&gt;Dentro desta pasta existe também um arquivo de configuração chamado TFSServerScheduler.exe.config. No nosso caso, neste arquivo, existia uma tag de configuração chamada “BisDomainUrl”. Verificando a documentação percebi que esta tag deveria ser trocada por “TFSNameUrl”.&lt;br /&gt;&lt;br /&gt;Apensas alterei esta chave e o agendamento começou a funcionar perfeitamente, de acordo com o tempo determinado pelo RunIntervalSeconds.&lt;/p&gt;&lt;p&gt;Por enquanto é só.&lt;br /&gt;&lt;br /&gt;Até o próximo post. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-2551615777383162642?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/2551615777383162642/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=2551615777383162642' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2551615777383162642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/2551615777383162642'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/07/entendendo-executando-e-agendando-as.html' title='Entendendo, executando e agendando as atualizações do data warehouse do Team Foundation Server'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_hRXH_1JVRu4/RowFuU25EAI/AAAAAAAAAAc/q-EUqxND1lw/s72-c/imagem.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-4694244435349033569</id><published>2007-06-11T14:30:00.001-03:00</published><updated>2009-01-06T10:18:43.584-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>Mantendo a rolagem da página entre postbaks usando MaintainScrollPositionOnPostback</title><content type='html'>Olá.&lt;br /&gt;&lt;br /&gt;Hoje venho apenas trazer uma dica rápida.&lt;br /&gt;&lt;br /&gt;Supondo que tenhamos um formulário muito grande, que extrapola o tamanho vertical da tela, ele será exibido no navegador com a barra de rolagem do lado direito da tela.&lt;br /&gt;Ao preencher as informações do formulário a aplicação muitas vezes necessita realizar algum ou vários postbacks.&lt;br /&gt;Logo, é necessário mantermos o foco no local onde o usuário está trabalhando, sem que ele seja obrigado a rolar a página todas as vezes que a página for recarregada.&lt;br /&gt;&lt;br /&gt;No ASP.Net 1.0 e 1.1 utilizávamos a opção “SmartNavigation” da diretiva Page em cada página que desejássemos adicionar este comportamento.&lt;br /&gt;Caso desejável poderíamos incluir uma opção no web.config para habilitar tal opção para toda a aplicação:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;&lt;span style="color:#663300;"&gt;page&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;smartNavigation&lt;/span&gt;="true" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O SmartNavigation trabalhava com IFrames para conseguir tal comportamento.&lt;br /&gt;&lt;br /&gt;No ASP.Net 2.0 o SmartNavigation foi substituído pela opção “MaintainScrollPositionOnPostback”.&lt;br /&gt;&lt;br /&gt;MaintainScrollPositionOnPostback aceita true ou false e mantém a posição da rolagem da página entre os pastbacks da mesma sem usar o recurso de IFrame.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-4694244435349033569?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/4694244435349033569/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=4694244435349033569' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/4694244435349033569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/4694244435349033569'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/06/mantendo-rolagem-da-pgina-entre.html' title='Mantendo a rolagem da página entre postbaks usando MaintainScrollPositionOnPostback'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-7878790444130781723</id><published>2007-06-08T09:03:00.001-03:00</published><updated>2009-01-06T10:20:23.983-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Skin'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Theme'/><title type='text'>Definindo Media Type usando Themes, Skins e CSS</title><content type='html'>Olá.&lt;br /&gt;&lt;br /&gt;Quem já trabalha com Themes e Skins provavelmente sabe como o ASP.Net 2.0 se comporta.&lt;br /&gt;&lt;br /&gt;Basicamente, o que acontece é que, quando uma página utiliza um certo Theme, o ASP.Net automaticamente registra todos os Cascading Style Sheets (CSS) do Theme em questão.&lt;br /&gt;Não há necessidade de usarmos a tag “link” do HTML para todas as folhas de estilo que temos em nossa aplicação.&lt;br /&gt;&lt;br /&gt;Isso é particularmente importante quanto temos mais de uma folha de estilo definindo classes com o mesmo nome mas que devem ser carregadas condicionalmente, de acordo com o Theme utilizado. Basta que coloquemos cada folha de estilo correspondente ao Theme dentro de sua respectiva pasta.&lt;br /&gt;&lt;br /&gt;Quando o ASP.Net constrói a página, além de aplicar o Theme desejado, ele registra todos os “.css” que estão na pasta do respectivo Theme.&lt;br /&gt;&lt;br /&gt;Seria perfeito não fosse o fato de que, muitas vezes necessitamos ter estilos distintos para cada tipo de mídia como, por exemplo, um estilo para exibição na tela e outro para impressão.&lt;br /&gt;&lt;br /&gt;Normalmente registraríamos o “.css” desta maneira:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;&lt;span style="color:#663300;"&gt;link&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;="App_Themes/Default/Print.css" &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;="text/css" &lt;span style="color:#ff0000;"&gt;rel&lt;/span&gt;="stylesheet" &lt;span style="color:#ff0000;"&gt;media&lt;/span&gt;="print" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;&lt;span style="color:#663300;"&gt;link&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;="App_Themes/Default/Screen.css" &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;="text/css" &lt;span style="color:#ff0000;"&gt;rel&lt;/span&gt;="stylesheet" &lt;span style="color:#ff0000;"&gt;media&lt;/span&gt;="screen" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Acontece que, ao registrar a folha de estilo automaticamente, o ASP.Net não permite que definamos o Media Type.&lt;br /&gt;&lt;br /&gt;Ele simplesmente registra os “.css” como abaixo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;&lt;span style="color:#663300;"&gt;link&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;="App_Themes/Default/Print.css" &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;="text/css" &lt;span style="color:#ff0000;"&gt;rel&lt;/span&gt;="stylesheet" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;&lt;span style="color:#663300;"&gt;link&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;href&lt;/span&gt;="App_Themes/Default/Screen.css" &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;="text/css" &lt;span style="color:#ff0000;"&gt;rel&lt;/span&gt;="stylesheet" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma das soluções que encontramos foi criar uma classe herdada de HTMLHead que adicionasse alguma lógica para que o registro das folhas de estilo fosse feito corretamente.&lt;br /&gt;Quem quiser se aventurar por esta solução visite o link &lt;a href="http://adam.kahtava.com/journal/63d6c2f3-4cd9-4a7d-ab5a-2796033cb3a1.aspx"&gt;The Problems with Themes, Skins, and Cascading Style Sheets (CSS) in ASP.NET 2.0 – Defining a Media Type(s)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Os problemas que vejo nesta solução, apesar de funcionar de maneira esperada, é que tiramos a decisão do registro dos estilos das mãos dos designers e levamos para o programador.&lt;br /&gt;&lt;br /&gt;A solução que mais se aproxima do mundo ideal é dada pela própria W3C na definição dos &lt;a href="http://www.w3.org/TR/REC-CSS2/media.html#at-media-rule"&gt;Media Types&lt;/a&gt; em seu site.&lt;br /&gt;&lt;br /&gt;Pela definição do W3C, uma folha de estilo pode possuir rules do tipo @media.&lt;br /&gt;&lt;br /&gt;Desta forma, trabalharíamos da seguinte maneira:&lt;br /&gt;&lt;br /&gt;@media print {&lt;br /&gt;BODY { font-size: 10pt }&lt;br /&gt;}&lt;br /&gt;@media screen {&lt;br /&gt;BODY { font-size: 12pt }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Na verdade, nem precisamos separar os estilos para tela e para impressão em dois arquivos. Eles podem ser definidos em um único “.css”, onde os estilos referentes a “screen” e “print” estão em suas respectivas rules.&lt;br /&gt;Talvez valha separar os estilos em arquivos por mídia apenas por uma questão de organização, mas não por obrigação.&lt;br /&gt;&lt;br /&gt;Por enquanto é só.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-7878790444130781723?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/7878790444130781723/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=7878790444130781723' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/7878790444130781723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/7878790444130781723'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/06/definindo-media-type-usando-themes.html' title='Definindo Media Type usando Themes, Skins e CSS'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-8710428445918878949</id><published>2007-05-29T17:49:00.001-03:00</published><updated>2009-01-06T10:16:18.452-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Team Foundation'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Get Latest Version automático no CheckOut</title><content type='html'>Olá.&lt;br /&gt;&lt;br /&gt;Muitas empresas já estão implantando o Team Foundation Server e, pelo que tenho percebido, as grandes dificuldades são principalmente quanto à diferença de paradigma e cultura, principalmente no que se refere ao Source Control.&lt;br /&gt;Um dos pontos que mais incomodam os desenvolvedores acostumados ao Visual Source Safe é o fato do Visual Studio não pegar automaticamente a última versão do arquivo quando da realização do check out.&lt;br /&gt;&lt;br /&gt;Os desenvolvedores do Team Foundation têm argumentos bem sólidos para este comportamento:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;It turns out that this is by design, so let me explain the reasoning behind&lt;br /&gt;it. When you perform a get operation to populate your workspace with a set&lt;br /&gt;of files, you are setting yourself up with a consistent snapshot from source&lt;br /&gt;control. Typically, the configuration of source on your system represents&lt;br /&gt;a point in time snapshot of files from the repository that are known to work&lt;br /&gt;together, and therefore is buildable and testable.&lt;br /&gt;As a developer working in&lt;br /&gt;a workspace, you are isolated from the changes being made by other&lt;br /&gt;developers. You control when you want to accept changes from other&lt;br /&gt;developers by performing a get operation as appropriate. Ideally when you&lt;br /&gt;do this, you'll update the entire configuration of source, and not just one or&lt;br /&gt;two files. Why? Because changes in one file typically depend on&lt;br /&gt;corresponding changes to other files, and you need to ensure that you've still&lt;br /&gt;got a consistent snapshot of source that is buildable and testable.&lt;br /&gt;This is&lt;br /&gt;why the checkout operation doesn't perform a get latest on the files being&lt;br /&gt;checked out. Updating that one file being checked out would violate the&lt;br /&gt;consistent snapshot philosophy and could result in a configuration of source&lt;br /&gt;that isn't buildable and testable. As an alternative, Team Foundation&lt;br /&gt;forces users to perform the get latest operation at some point before they&lt;br /&gt;checkin their changes. That's why if you attempt to checkin your changes,&lt;br /&gt;and you don't have the latest copy, you'll be prompted with the resolve&lt;br /&gt;conflicts dialog. &lt;/em&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;Porém, muitas vezes, eles não têm conseguindo convencer a comunidade muito bem.&lt;br /&gt;&lt;br /&gt;Por isso existem algumas iniciativas de confecção de plug-in para o Visual Studio que adicionam o comportamento ao mesmo.&lt;br /&gt;&lt;br /&gt;Após instalar e testar alguns, percebemos que o melhor é o TFS GetLatest (&lt;a href="http://blogs.microsoft.co.il/files/folders/leon/entry10828.aspx"&gt;http://blogs.microsoft.co.il/files/folders/leon/entry10828.aspx&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;O melhor deste plug-in é que, configurados o servidor e a porta do Team Foundation Server, toda a ação de Get Latest Version é transparente quando o usuário realiza algum Check Out.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-8710428445918878949?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/8710428445918878949/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=8710428445918878949' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8710428445918878949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8710428445918878949'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/05/get-latest-version-automtico-no.html' title='Get Latest Version automático no CheckOut'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-5298890870551603034</id><published>2007-05-24T11:09:00.001-03:00</published><updated>2009-01-06T10:15:44.678-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>No symbols have been loaded for this document</title><content type='html'>Olá.&lt;br /&gt;&lt;br /&gt;Venho hoje falar rapidamente sobre um problema que vez ou outra ocorre quando queremos depurar nosso projeto e utilizarmos breakpoints.&lt;br /&gt;O que o ocorre é que o Visual Studio simplesmente não para em algum breakpoint e este fica com o símbolo vazado e um ícone de alerta.&lt;br /&gt;Ao passarmos o mouse sobre o ícone do breakpoint podemos notar a mensagem: “No symbols have been loaded for this document”.&lt;br /&gt;&lt;br /&gt;O que ocorre é que o timestamp do arquivo “.pdb” gerado é diferente do timestamp da DLL ou exe.&lt;br /&gt;Na maioria das vezes basta utilizarmos o recurso “Rebuild Solution” da solução ou “Rebuild” do projeto, para solucionarmos o problema.&lt;br /&gt;Outras vezes é necessário que acessemos o diretório Debug do projeto e apaguemos o arquivo “. pdb".&lt;br /&gt;Ao apagarmos este arquivo, o compilador, é obrigado a gerar um novo.&lt;br /&gt;&lt;br /&gt;Por hoje é só.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-5298890870551603034?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/5298890870551603034/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=5298890870551603034' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/5298890870551603034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/5298890870551603034'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/05/no-symbols-have-been-loaded-for-this.html' title='No symbols have been loaded for this document'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-7005272493653026350</id><published>2007-05-17T17:20:00.002-03:00</published><updated>2009-01-06T10:17:54.068-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>Referência circular usando Master Page e User Control</title><content type='html'>Olá.&lt;br /&gt;&lt;br /&gt;Depois que a Microsoft nos disponibilizou as master pages nossa vida melhorou bastante. Mesmo com alguns contratempos a simples possibilidade de realizarmos herança visual em nossas páginas já é recompensador e, como todo bom recurso, tenho usado e abusado do mesmo.&lt;br /&gt;&lt;br /&gt;Dentre os “abusos” posso citar a confecção de master pages de outras master pages (tenho casos de quatro níveis de herança) e controles que estão tanto na master page quanto na página que a implementa.&lt;br /&gt;&lt;br /&gt;Este último “abuso” me causou bastante dor de cabeça.&lt;br /&gt;Ainda não sei exatamente onde estava o problema, pois necessito estudar a fundo o modelo de compilação do ASP.NET 2.0.&lt;br /&gt;&lt;br /&gt;Lembremos que houve uma mudança no sistema de compilação do ASP.NET.&lt;br /&gt;Nas versões anteriores ao Visual Studio 2005 nossos sites eram projetos do tipo Web Project e agora temos o conceito de Web Site. Por haver material farto na internet sobre este assunto, vou diretamente ao meu problema, mas antes, segue link para quem quiser se aprofundar:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linhadecodigo.com.br/artigos.asp?id_ac=957"&gt;Compilando aplicações ASP.NET 2.0 - Mudanças no Modelo de Código e Compilação&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nota importante: para quem sente saudades ou necessita trabalhar como antigamente, o Service Pack 1 do Visual Studio 2005 adiciona um novo, porém velho conhecido, tipo de projeto: o Web Project. Mas ao trabalhar com este tipo de projeto você perderá uma série de vantagens dos Web Sites, como por exemplo, mudar algo no codebehind ou outra classe e não precisar recompilar.&lt;br /&gt;&lt;br /&gt;Quando necessitei usar um mesmo controle de usuário (user control) na master page e na página (content place holder) recebi erros de referência circular.&lt;br /&gt;&lt;br /&gt;Depois de algum tempo pesquisando postei minha dúvida no fórum da MSDN e obtive uma resposta quase que imediatamente. A sugestão era, ao invés de registrar o controle em cada página (na master page e na página), eu o registrasse no web.config, desta forma:&lt;br /&gt;&lt;br /&gt;&lt;configuration&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;lt;pages&amp;gt;&lt;br /&gt;&amp;lt;controls&amp;gt;&lt;br /&gt;&amp;lt;add tagPrefix="IW" tagName="ctrPesquisas" src="~/Controles/ctrPesquisas.ascx"/&amp;gt;&lt;br /&gt;&amp;lt;/controls&amp;gt;&lt;br /&gt;&amp;lt;/pages&amp;gt;&lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/configuration&gt;&lt;br /&gt;&lt;br /&gt;Tal solução funcionou perfeitamente para o meu problema.&lt;br /&gt;&lt;br /&gt;De maneira básica, os problemas de referência circular não necessariamente ocorrem diretamente entre páginas, controles e master pages.&lt;br /&gt;Segundo o modelo de compilação padrão as classes em uma mesma pasta são compiladas em uma mesma DLL.&lt;br /&gt;Vejam o exemplo visual abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_hRXH_1JVRu4/Rky6pMNPurI/AAAAAAAAAAU/Fz8e5NjbsAQ/s1600-h/Referencias.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5065628897699150514" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_hRXH_1JVRu4/Rky6pMNPurI/AAAAAAAAAAU/Fz8e5NjbsAQ/s320/Referencias.jpg" border="0" /&gt;&lt;/a&gt; No caso apresentado a ClasseA possui uma referência à ClasseC e a ClasseD possui uma referência para a ClasseB. Note que não há qualquer referência circular direta entre as classes, porém há uma referência circular entre as dll’s geradas porque a DLL1 referencia a DLL2 e a DLL2 referencia a DLL1.&lt;br /&gt;&lt;br /&gt;Conhecendo este comportamento podemos adotar estratégias para evitar tais referências, como, por exemplo, movendo alguma das classes para outra pasta provocando assim a criação de uma terceira DLL e evitando a referência circular.&lt;br /&gt;&lt;br /&gt;De maneira mais radical, poderemos utilizar a diretiva batch da tag compilation do web.config que força a criação de uma DLL para cada classe, página, controle e demais componentes.&lt;br /&gt;&lt;br /&gt;&lt;configuration&gt;&lt;system.web&gt;&lt;compilation batch="false"&gt;&lt;/compilation&gt;&lt;/SYSTEM.WEB&gt;&lt;/configuration&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;lt;compilation batch="false"&amp;gt;&lt;br /&gt;&amp;lt;/compilation&amp;gt;&lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://www.linhadecodigo.com.br/artigos.asp?id_ac=957"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-7005272493653026350?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/7005272493653026350/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=7005272493653026350' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/7005272493653026350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/7005272493653026350'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/05/referncia-circular-usando-master-page-e.html' title='Referência circular usando Master Page e User Control'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_hRXH_1JVRu4/Rky6pMNPurI/AAAAAAAAAAU/Fz8e5NjbsAQ/s72-c/Referencias.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-1155846172831774658</id><published>2007-04-26T17:41:00.001-03:00</published><updated>2009-01-06T10:15:22.832-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2005'/><title type='text'>Usando try...catch no SQL Server 2005</title><content type='html'>&lt;p&gt;Olá.&lt;br /&gt;Venho hoje falar sobre este novo recurso da linguagem Transact-SQL (T-SQL) do SQL Server 2005.&lt;br /&gt;&lt;br /&gt;Nas versões anteriores do SQL Server a única maneira de se trabalhar com exceções era o famoso @@ERROR.&lt;br /&gt;Usávamos este recurso principalmente quando tínhamos uma transação. Era comum que, após iniciarmos a transação, tivéssemos que incluir abaixo de cada linha com potencial de erro o seguinte código:&lt;br /&gt;&lt;br /&gt;IF @@ERROR &gt; 0&lt;br /&gt;ROLLBACK TRANSACTION&lt;br /&gt;&lt;br /&gt;O tratamento de erros desta maneira possuía várias desvantagens, dentre elas posso citar:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Ter de escrever este código em cada linha que poderia ocasionar em um erro;&lt;/li&gt;&lt;li&gt;A variável @@ERROR era reinicializada após qualquer outro comando;&lt;/li&gt;&lt;li&gt;Os erros não poderiam ser capturados e tratados pelo próprio código (procedure), ou seja, após realizarmos o “ROLLBACK” o erro era lançado para a próxima procedure ou para a aplicação da pilha;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;A grande mudança no T-SQL é que agora podemos tratar os erros de um trecho de código quase da mesma forma que fazemos no VB.Net ou no C#.&lt;br /&gt;&lt;br /&gt;O procedimento é bem simples:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Iniciamos o bloco que pode retornar um erro que queremos tratar com “BEGIN TRY”;&lt;/li&gt;&lt;li&gt;Escrevemos nosso código normalmente, inclusive com a inicialização da transação e o “COMMIT TRANSACTION” no final;&lt;/li&gt;&lt;li&gt;Finalizamos o bloco com “END TRY”;&lt;/li&gt;&lt;li&gt;Abrimos o bloco de tratamento de erros com “BEGIN CATCH”;&lt;/li&gt;&lt;li&gt;Escrevemos nosso código de tratamento do erro;&lt;/li&gt;&lt;li&gt;Fechamos o bloco de tratamento de erros com “END CATCH”;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;É muito importante atentar para o fato de que, ao capturar uma exceção em um bloco CATCH, o SQL Server não a lança para quem chamou o código. Isto quer dizer que, se você necessitar que o erro seja lançado para o &lt;em&gt;caller&lt;/em&gt; é necessário utilizar do nosso velho conhecido RAISERROR.&lt;br /&gt;&lt;br /&gt;Veja um exemplo de código de como isto pode ser feito:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;begin try&lt;br /&gt;begin transaction&lt;br /&gt;&lt;/span&gt;&lt;em&gt;&lt;strong&gt;seu código vem aqui&lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;span style="color:#3366ff;"&gt;commit transaction&lt;br /&gt;end try&lt;br /&gt;begin catch&lt;br /&gt;declare&lt;/span&gt; @ErrorMessage &lt;span style="color:#3366ff;"&gt;nvarchar&lt;/span&gt;(4000)&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;declare&lt;/span&gt; @ErrorSeverity &lt;span style="color:#3366ff;"&gt;int&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;declare&lt;/span&gt; @ErrorState &lt;span style="color:#3366ff;"&gt;int&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;select&lt;/span&gt;&lt;br /&gt;@ErrorMessage = ERROR_MESSAGE(),&lt;br /&gt;@ErrorSeverity = ERROR_SEVERITY(),&lt;br /&gt;@ErrorState = ERROR_STATE()&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;rollback transaction&lt;br /&gt;&lt;br /&gt;RAISERROR&lt;/span&gt; (@ErrorMessage, @ErrorSeverity, @ErrorState)&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;end catch&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Você notou as novas funções de erro?&lt;br /&gt;Bem mais informativas que a antiga @@ERROR.&lt;br /&gt;&lt;br /&gt;No SQL Server 2005, as seguintes funções são utilizadas para obter mais detalhes dos erros:&lt;br /&gt;&lt;br /&gt;ERROR_NUMBER()&lt;br /&gt;ERROR_SEVERITY()&lt;br /&gt;ERROR_STATE()&lt;br /&gt;ERROR_PROCEDURE()&lt;br /&gt;ERROR_LINE()&lt;br /&gt;ERROR_MESSAGE()&lt;br /&gt;&lt;br /&gt;Além de fornecer detalhes sobre o erro ocorrido, estas funções têm como vantagem o fato de não serem reinicializadas após uma linha qualquer de comando executado, como acontecia com o @@ERROR.&lt;br /&gt;&lt;br /&gt;A grande vantagem do TRY...CATCH é que, além de deixar o código mais robusto, podemos separar o que é a lógica do negócio do tratamento dos possíveis erros.&lt;br /&gt;&lt;br /&gt;Diminuímos a quantidade de código escrito e temos uma melhor legibilidade.&lt;/p&gt;&lt;p&gt;Mais informações em &lt;a href="http://www.codeproject.com/useritems/try_catch.asp"&gt;Using TRY...CATCH in Transact-SQL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Abraços e até o próximo post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-1155846172831774658?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/1155846172831774658/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=1155846172831774658' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/1155846172831774658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/1155846172831774658'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/04/usando-trycatch-no-sql-server-2005.html' title='Usando try...catch no SQL Server 2005'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-5720475377876416939</id><published>2007-04-20T10:40:00.003-03:00</published><updated>2009-01-06T10:21:08.238-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migração'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Método Page_Load é disparado duas vezes</title><content type='html'>Olá. Venho hoje compartilhar uma solução para um problema muito estranho ocorrido após a migração de alguns projetos web do Visual Studio 2003 para o Visual Studio 2005.&lt;br /&gt;Basicamente o que ocorria é que os webforms migrados disparavam seu método Page_Load duas vezes em uma requisição.&lt;br /&gt;Após algumas pesquisas no Google e na própria MSDN todas as soluções apontavam que o problema estava na propriedade “AutoEventWireup” da página. Esta propriedade, segundo os posts, estaria configurada como “True” quando na verdade o correto seria “False”.&lt;br /&gt;Estaria tudo resolvido não fosse o fato de que nas minhas páginas esta propriedade já estava em “False”.&lt;br /&gt;O mais interessante é que as novas páginas criadas já no Visual Studio 2005 não apresentavam o mesmo problema.&lt;br /&gt;Por algum tempo fiquei a tentar contornar este problema até que, por fim, notei uma pequena diferença na declaração do método Page_Load.&lt;br /&gt;&lt;br /&gt;Vejam a diferença:&lt;br /&gt;&lt;br /&gt;- Método Page_Load de uma página migrada do VS2003 para o VS2005&lt;br /&gt;&lt;br /&gt;Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, Me.Load&lt;br /&gt;&lt;br /&gt;- Método Page_Load de uma página nova no VS2005&lt;br /&gt;&lt;br /&gt;Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br /&gt;&lt;br /&gt;Notaram que no primeiro caso o método Page_Load “escuta” dois eventos, um referente ao Load do MyBase e outro referente ao Load da própria página?&lt;br /&gt;&lt;br /&gt;Para tentar chegar à raiz do problema, criei um novo projeto web no VS2003 e notei que nele, uma nova página criada, o Page_Load escuta o MyBase.Load, enquanto que no VS2005 o Page_Load escuta o Me.Load.&lt;br /&gt;Isto se dá basicamente por causa da mudança que houve no modelo de compilação do ASP.Net 2.0. Enquanto no VS2003 uma nova página era criada com duas classes, uma para a página e outra para o codebehind, no VS2005 a página e o codebehind são a mesma classe.&lt;br /&gt;No VS2003 era usado o sistema de herança entre as duas classes, daí a necessidade de se escutar o evento Load do MyBase. Já o VS2005 usa o novo recurso de classes parciais onde ambos, página e codebehind, pertencem à mesma classe.&lt;br /&gt;O recurso de classes parciais nada mais é que poder escrever uma mesma classe em diversos arquivos. Este recurso soluciona vários problemas ocorridos até então como, por exemplo, a separação de um código gerado automaticamente (por uma ferramenta qualquer) de um código criado pelo desenvolvedor. Até então, quando gerávamos novamente o código automático, tínhamos que tomar o cuidado de separar e reescrever no novo arquivo o código criado pelo desenvolvedor.&lt;br /&gt;&lt;br /&gt;Para mais informações sobre classes parciais, acesse este artigo da MSDN: &lt;a href="http://www.microsoft.com/brasil/msdn/Tecnologias/vbnet/vs04k1.mspx#EFB"&gt;http://www.microsoft.com/brasil/msdn/Tecnologias/vbnet/vs04k1.mspx#EFB&lt;/a&gt;. Além de classes parciais são abordadas outras mudanças ocorridas no Visual Basic 2005.&lt;br /&gt;&lt;br /&gt;Outros problemas encontrados com a migração de projetos VS2003 para o VS2005 são relatados por Ben Aminnia em &lt;a href="http://www.pointercorp.com/Convert_ASPDOTNET_11_20.htm"&gt;http://www.pointercorp.com/Convert_ASPDOTNET_11_20.htm&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Boa migração e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-5720475377876416939?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/5720475377876416939/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=5720475377876416939' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/5720475377876416939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/5720475377876416939'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/04/mtodo-pageload-disparado-duas-vezes.html' title='Método Page_Load é disparado duas vezes'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-8321137304014357697</id><published>2007-04-16T22:53:00.001-03:00</published><updated>2009-01-06T10:16:48.887-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Basic 9.0'/><category scheme='http://www.blogger.com/atom/ns#' term='C# 3.0'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>O projeto LINQ</title><content type='html'>Hoje, arrumando os livros de minha estante, deparei-me com uma publicação que recebi do Alexandre Nardi, Arquiteto de Soluções da Microsoft Brasil, em um evento realizado aqui em Brasília no ano passado.&lt;br /&gt;Nesta publicação estão textos cuidadosamente selecionados pela equipe da MSDN Brasil que abordam desde expansão do Agile para adequação ao CMMI Nível 3, até os novos recursos de segurança dos dados com o SQL Server 2005.&lt;br /&gt;Todos estes textos podem ser encontrados em &lt;a href="http://www.microsoft.com/brasil/msdn/arquitetura"&gt;www.microsoft.com/brasil/msdn/arquitetura&lt;/a&gt;, porém o que mais me chamou a atenção neste momento foi o artigo “O Projeto LINQ - .NET Language Integrated Query” (&lt;a href="http://www.microsoft.com/brasil/msdn/Tecnologias/arquitetura/LINQ.mspx"&gt;www.microsoft.com/brasil/msdn/Tecnologias/arquitetura/LINQ.mspx&lt;/a&gt;).&lt;br /&gt;O artigo foi exemplarmente escrito em setembro de 2005 e, apesar do tempo passado, continua sendo uma excelente fonte para compreensão do que vem a ser o LINQ e de como esta tecnologia vai impactar na maneira como programamos e tratamos os dados relacionais.&lt;br /&gt;Neste processo de compreensão do LINQ tem-se como conseqüência a compreensão da dimensão e da importância de alguns novos recursos das linguagens C# e VB.Net, como por exemplo os tipos genéricos, métodos e classes anônimas e operadores de consulta ou agregação. Alguns destes recursos já estão a nossa disposição (principalmente em C#), mas para todos os outros deveremos esperar o Visual Basic 9.0 e o C# 3.0.&lt;br /&gt;Boa leitura e até o próximo post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-8321137304014357697?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/8321137304014357697/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=8321137304014357697' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8321137304014357697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/8321137304014357697'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/04/o-projeto-linq.html' title='O projeto LINQ'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6919314286166182197.post-6133298088162523409</id><published>2007-04-16T22:33:00.000-03:00</published><updated>2007-04-16T22:47:45.320-03:00</updated><title type='text'>Estréia</title><content type='html'>Olá, esta é a primeira postagem de muitas que virão.&lt;br /&gt;Como citado na apresentação do blog, este espaço não possui qualquer pretensão maior a não ser trazer informações relevantes nas áreas as quais se propõe. Não esperem encontrar aqui textos que já foram exaustivamente explorados por outros sites. Também não esperem uma periodicidade alemã na publicação dos textos porque nem sempre terei algo tão relevante que mereça virar um post. Mas podem contar que cada informação, cada parágrafo e cada dica possuirão relevância e, de preferência, abordarão uma solução para um problema real sofrido por mim como desenvolvedor no dia-a-dia.&lt;br /&gt;Desde já agradeço a atenção e a paciência e espero contribuir um pouquinho que seja para esta grande comunidade. Abraços e até o primeiro texto técnico.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6919314286166182197-6133298088162523409?l=jpdotnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdotnet.blogspot.com/feeds/6133298088162523409/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6919314286166182197&amp;postID=6133298088162523409' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/6133298088162523409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6919314286166182197/posts/default/6133298088162523409'/><link rel='alternate' type='text/html' href='http://jpdotnet.blogspot.com/2007/04/estria.html' title='Estréia'/><author><name>João Paulo Barbosa Fernandes</name><uri>http://www.blogger.com/profile/12717226839248067990</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
