<?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-1990437216154842225</id><updated>2012-01-10T05:13:47.134-08:00</updated><category term='C#'/><category term='CRM 4.0'/><category term='CRM 2011'/><category term='JQuery'/><category term='Mobile'/><category term='Microsoft Office'/><category term='Exchange'/><category term='Visual Studio.NET'/><category term='Web Services'/><category term='ASP.NET 1.1'/><category term='JavaScript'/><category term='.NET Framework 3.5'/><category term='IIS'/><title type='text'>[{"GTezini":".NET"}]</title><subtitle type='html'>&lt;a href="https://www.mcpvirtualbusinesscard.com/VBCServer/Gilberto%20Tezini/interactivecard"&gt;View my Business Card&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-2298373510453205495</id><published>2012-01-10T04:42:00.000-08:00</published><updated>2012-01-10T05:13:47.142-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 2011'/><title type='text'>CRM 2011 &gt;&gt; SubGrid - Totalização de Valor (via JScript)</title><content type='html'>No CRM 2011 temos a possibilidade de explorar muito bem desenvolvimentos em JScript, jQuery, jSon (ou REST OData).&lt;br /&gt;&lt;br /&gt;Seguindo esta linha, segue um código, pequeno inclusive, que faz uma Totalização de Valores, buscando as informações em um SubGrid!&lt;br /&gt;&lt;br /&gt;Para a execução do código, basta adicioná-lo no formulário, e chamá-lo no método OnLoad.&lt;br /&gt;Importante adicionar os JScripts prontos da Microsoft, para execução de chamadas jQuery, sendo eles [jquery1.4.1.min.js] e [jqueryrestdataoperationfunctions.js].&lt;br /&gt;&lt;br /&gt;Importante também adicionar o campo de moeda do CRM (TransactionCurrencyId), quando existir na tela do CRM algum campo do tipo moeda. Neste caso usaremos e o script abaixo preenche o campo automaticamente.&lt;br /&gt;&lt;br /&gt;Estes arquivos podem ser encontrados no SDK do CRM (quando descompactado em qualquer diretório), no caminho [\SDK\samplecode\js\restendpoint\jqueryrestdataoperations\jqueryrestdataoperations\scripts].&lt;br /&gt;&lt;br /&gt;Segue Script:&lt;br /&gt;&lt;div style="padding: 0px 0px 15px 15px; color: black; font-family: Courier New; font-size: 12px; background-color: rgb(214, 232, 255);"&gt;&lt;br /&gt;&lt;br /&gt;var timeOutVar;&lt;br /&gt;function PrepareAddUpValue() { &lt;br /&gt;var grid = document.getElementById('GRIDNAME');&lt;br /&gt; if (grid == null) &lt;br /&gt; { &lt;br /&gt; // delay one second and try again. &lt;br /&gt; timeOutVar = setTimeout(PrepareAddUpValue, 1000); &lt;br /&gt; return; &lt;br /&gt; }&lt;br /&gt;clearTimeout(timeOutVar);&lt;br /&gt;grid.attachEvent("onrefresh", AddUpValue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function AddUpValue(){&lt;br /&gt;var gridControl = document.getElementById("GRIDNAME").control;&lt;br /&gt;var ids = gridControl.get_allRecordIds();&lt;br /&gt;var new_total = 0.0;&lt;br /&gt;&lt;br /&gt;for(var i = 0; i &amp;lt; ids.length; i++) &lt;br /&gt; { &lt;br /&gt;  str_value = gridControl.getCellValue("NOME_COLUNA_GRID", ids[i]).replace("R$", "").replace(" ", "");&lt;br /&gt;  new_total += parseFloatString(str_value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Xrm.Page.getAttribute("new_total").setValue(new_total);&lt;br /&gt;Xrm.Page.data.entity.save();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function parseFloatString(str){&lt;br /&gt;str = String(str);&lt;br /&gt;var strNew = "";&lt;br /&gt;for(var i=0; i &amp;lt; str.length; i++){&lt;br /&gt;if (isNaN(parseInt(str.charAt(i))) == false) strNew +=str.charAt(i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return parseFloat(strNew);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function SetCurrency(){&lt;br /&gt;   if (Xrm.Page.getAttribute("transactioncurrencyid") != null) return;&lt;br /&gt;   var filter = "?$select=TransactionCurrencyId,CurrencyName";&lt;br /&gt;   retrieveMultiple("TransactionCurrencySet", filter, retrieveMultipleCurrencyCompleted, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function retrieveMultipleCurrencyCompleted(data, textStatus, XmlHttpRequest){&lt;br /&gt;   if (data == null) return;   &lt;br /&gt;   var idValue = data[0].TransactionCurrencyId;&lt;br /&gt;   var textValue = data[0].CurrencyName;&lt;br /&gt;   var thisEntityType = 'transactioncurrency';&lt;br /&gt;   Xrm.Page.getAttribute("transactioncurrencyid").setValue([{ id: idValue, name: textValue, entityType: thisEntityType }]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;SetCurrency();&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Veja uma tela de exemplo. Note que, ao adicionar um novo registro, o Script é acionado, totalizando o valor em um campo do formulário. Isto acontece porque o Script atua no evento [OnRefresh] do SubGrid do CRM.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-F7ATTFpCHJ0/Tww475BqvwI/AAAAAAAAAKk/im_atWpfICg/s1600/jsAddUp.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 124px;" src="http://4.bp.blogspot.com/-F7ATTFpCHJ0/Tww475BqvwI/AAAAAAAAAKk/im_atWpfICg/s400/jsAddUp.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5695990230288088834" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-2298373510453205495?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/2298373510453205495/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=2298373510453205495' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/2298373510453205495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/2298373510453205495'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2012/01/crm-2011-subgrid-totalizacao-de-valor.html' title='CRM 2011 &gt;&gt; SubGrid - Totalização de Valor (via JScript)'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-F7ATTFpCHJ0/Tww475BqvwI/AAAAAAAAAKk/im_atWpfICg/s72-c/jsAddUp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-414828500249696840</id><published>2011-11-01T09:40:00.000-07:00</published><updated>2011-11-01T10:41:50.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>&gt;&gt; VS.NET 2010 - Snippet Designer Plugin</title><content type='html'>Realmente facilita a "vida" ter a possibilidade de inserção de um código template complexo e longo com apenas uma chamada de [Shortcut no Code View] do Visual Studio. Este conceito é muito usado e se chama [Code Snippet].&lt;br /&gt;&lt;br /&gt;Basicamente para criar um [fragmento de código] efetuarmos os seguintes passos:&lt;br /&gt;&lt;br /&gt;1 - Criamos um arquivo XML;&lt;br /&gt;2 - Primeiro adicionamos o Elemento CodeSnippets;&lt;br /&gt;3 - Logo após adicionamos a seção Header;&lt;br /&gt;4 - Depois adicionamos mais um elemento (&amp;lt;Snippet&amp;gt;) que conterá o Código Template;&lt;br /&gt;5 - E por fim, salvamos o arquivo com a extensão .SNIPPET, no diretório de snippets no Visual Studio, geralmente em [C:\Users\[UserName]\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets].&lt;br /&gt;&lt;br /&gt;Segue exemplo dos passos seguidos acima: &lt;br /&gt;&lt;br /&gt;&lt;div style="padding: 0px 0px 15px 15px; color: black; font-family: Courier New; font-size: 12px; background-color: rgb(214, 232, 255);"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;CodeSnippets&lt;br /&gt;    xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"&amp;gt;&lt;br /&gt;    &amp;lt;CodeSnippet Format="1.0.0"&amp;gt;&lt;br /&gt;        &amp;lt;Header&amp;gt;&lt;br /&gt;            &amp;lt;Title&amp;gt;&lt;br /&gt;                My Snippet&lt;br /&gt;            &amp;lt;/Title&amp;gt;&lt;br /&gt;        &amp;lt;/Header&amp;gt;&lt;br /&gt;        &amp;lt;Snippet&amp;gt;&lt;br /&gt;            &amp;lt;Code Language="CSharp"&amp;gt;&lt;br /&gt;                &amp;lt;![CDATA[MessageBox.Show("Hello World");]]&amp;gt;&lt;br /&gt;            &amp;lt;/Code&amp;gt;&lt;br /&gt;        &amp;lt;/Snippet&amp;gt;&lt;br /&gt;    &amp;lt;/CodeSnippet&amp;gt;&lt;br /&gt;&amp;lt;/CodeSnippets&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Porém, para facilitar ainda mais a vida do desenvolvedor, segue a dica do &lt;a href="http://snippetdesigner.codeplex.com/"&gt;[Snippet Designer]&lt;/a&gt; que aumenta mais ainda a produtividade de criação de snippets, usando a IDE do Visual Studio.&lt;br /&gt;&lt;br /&gt;Por exemplo, uma vez que você criou um código reutilizável, e gostaria de transformá-lo em um Snippet, com este Plugin basta selecionar seu código e exportá-lo como um snippet, como mostra a imagem abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-xD5bVvWK0s0/TrAtDrejW0I/AAAAAAAAAJM/5O_rzFBaOps/s1600/SnippetExport.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 352px;" src="http://4.bp.blogspot.com/-xD5bVvWK0s0/TrAtDrejW0I/AAAAAAAAAJM/5O_rzFBaOps/s400/SnippetExport.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5670081472093182786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem mais recursos interessantes, que estão documentados no link para baixar o Plugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-414828500249696840?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/414828500249696840/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=414828500249696840' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/414828500249696840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/414828500249696840'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2011/11/vsnet-2010-snippet-designer-plugin.html' title='&gt;&gt; VS.NET 2010 - Snippet Designer Plugin'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-xD5bVvWK0s0/TrAtDrejW0I/AAAAAAAAAJM/5O_rzFBaOps/s72-c/SnippetExport.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-9152595033687971915</id><published>2011-09-13T05:46:00.001-07:00</published><updated>2011-09-14T06:46:46.543-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 2011'/><title type='text'>&gt;&gt; CRM 2011 - Busca de Dados do CRM via JScript-JQuery</title><content type='html'>Segue os procedimentos para utilizar este poderoso recurso do CRM 2011:&lt;br /&gt;&lt;br /&gt;1 - Baixar o &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=24004"&gt;SDK&lt;/a&gt; do produto;&lt;br /&gt;&lt;br /&gt;2 - Após extrair o SDK em qualquer diretório, ir até o sub-diretório [sdk\samplecode\js\restendpoint\jqueryrestdataoperations\jqueryrestdataoperations\scripts] e importar o arquivo [jquery1.4.1.min.js] como um [Web Resource] no CRM;&lt;br /&gt;&lt;br /&gt;3 - Efetuar o mesmo procedimento do passo 2, para o arquivo [jqueryrestdataoperationfunctions.js];&lt;br /&gt;&lt;br /&gt;4 - Ao associar estes Web Resources a entidade do CRM desejada, atente para a ordem, pois é relevante no carregamento da página:&lt;br /&gt; 4.1 - primeiro [jquery1.4.1.min.js];&lt;br /&gt; 4.2 - depois [jqueryrestdataoperationfunctions.js];&lt;br /&gt; 4.3 - por último, seu próprio JS, que utilizará os recursos acima.&lt;br /&gt;&lt;br /&gt;P.S.: Apenas para lembrar o caminho, para efetuar o passo 4, abrir o formulário da entidade desejada e clicar no botão [Propriedades do Formulário], como exemplifica a tela abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-hwHLjYHRJ1c/Tm9V18U9t2I/AAAAAAAAAHA/Mkes-I5tv70/s1600/pf.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://2.bp.blogspot.com/-hwHLjYHRJ1c/Tm9V18U9t2I/AAAAAAAAAHA/Mkes-I5tv70/s400/pf.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5651830442588747618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5- No sub-diretório citado no passo 2, existe uma arquivo chamado [jqueryrestdataoperationactions.js] que contém diversos exemplos de uso. Segue abaixo um deles:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding: 0px 0px 15px 15px; text-align: left; color: black; font-family: Courier New; font-size: 12px; background-color: rgb(214, 232, 255);"&gt;&lt;br /&gt;&lt;br /&gt;function retrieveAccount(id) {&lt;br /&gt; // [retrieveRecord] está presente na biblioteca [jqueryrestdataoperationfunctions.js].&lt;br /&gt; retrieveRecord(id, "AccountSet", retrieveAccountCompleted, null);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function retrieveAccountCompleted(data, textStatus, XmlHttpRequest) {&lt;br /&gt;alert(data.Name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para trabalhar com buscas mais complexas, existe a função [retrieveMultiple]. Porém, infelizmente, não existe exemplo no SDK. Consegui achar um artigo muito bom chamado [&lt;a href="http://gtcrm.wordpress.com/2011/02/22/adding-selection-criteria-to-rest-queries/"&gt;Adding Selection Criteria to REST Queries in CRM 2011&lt;/a&gt;]. Testei um caso com sucesso. Vale realmente a pena checar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-9152595033687971915?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/9152595033687971915/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=9152595033687971915' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/9152595033687971915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/9152595033687971915'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2011/09/crm-2011-busca-de-dados-do-crm-via.html' title='&gt;&gt; CRM 2011 - Busca de Dados do CRM via JScript-JQuery'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-hwHLjYHRJ1c/Tm9V18U9t2I/AAAAAAAAAHA/Mkes-I5tv70/s72-c/pf.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-1869934040013927629</id><published>2011-09-13T05:09:00.000-07:00</published><updated>2011-09-13T05:39:53.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - FetchXML via JScript</title><content type='html'>Segue código aprimorado (extraído do SDK - &lt;a href="http://technet.microsoft.com/en-us/library/cc677073.aspx"&gt;http://technet.microsoft.com/en-us/library/cc677073.aspx&lt;/a&gt;) para busca de qualquer informação do CRM, via JScript.&lt;br /&gt;&lt;br /&gt;&lt;div style="padding: 0px 0px 15px 15px; text-align: left; color: black; font-family: Courier New; font-size: 12px; background-color: rgb(214, 232, 255);"&gt;&lt;br /&gt;&lt;br /&gt;window.ExecFetchXML = function (entityName, column, conditionAttribute, operator, value, fieldOrderName, fieldOrderValue, page, count) {&lt;br /&gt;&lt;br /&gt;    var fetchMapping = "logical";&lt;br /&gt;    var filterType = "and";&lt;br /&gt;    var authenticationHeader = GenerateAuthenticationHeader();&lt;br /&gt;    var columnSplit = column.split(",");&lt;br /&gt;    var conditionAttributeSplit = conditionAttribute.split(",");&lt;br /&gt;    var operatorSplit = operator.split(",");&lt;br /&gt;    var valueSplit = value.split(",");&lt;br /&gt;&lt;br /&gt;    var xml = "&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;" +&lt;br /&gt;    "&amp;lt;soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'" +&lt;br /&gt;    " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +&lt;br /&gt;    " xmlns:xsd='http://www.w3.org/2001/XMLSchema'&amp;gt;" +&lt;br /&gt;    authenticationHeader +&lt;br /&gt;    "&amp;lt;soap:Body&amp;gt;" +&lt;br /&gt;    "&amp;lt;Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'&amp;gt;" +&lt;br /&gt;    "&amp;lt;fetchXml&amp;gt;&amp;lt;fetch mapping='" + fetchMapping + "'";&lt;br /&gt;&lt;br /&gt;    if (page != null) xml += " page='" + page + "' ";&lt;br /&gt;    if (count != null) xml += " count='" + count + "' ";&lt;br /&gt;&lt;br /&gt;    xml += "&amp;gt;&amp;lt;entity name='" + entityName + "'&amp;gt;";&lt;br /&gt;&lt;br /&gt;    if (columnSplit.length &amp;gt; 1) {&lt;br /&gt;        for (i = 0; i &amp;lt; columnSplit.length; i++) {&lt;br /&gt;            xml += "&amp;lt;attribute name='" + String(columnSplit[i]) + "'/&amp;gt;";&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        xml += "&amp;lt;attribute name='" + column + "'/&amp;gt;";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (fieldOrderName != null &amp;amp;&amp;amp; fieldOrderValue != null) {&lt;br /&gt;        xml += "&amp;lt;order attribute='" + fieldOrderName +&lt;br /&gt;        "' descending='" + fieldOrderValue + "'/&amp;gt;";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (conditionAttribute != null &amp;amp;&amp;amp; operator != null &amp;amp;&amp;amp; value != null) {&lt;br /&gt;        xml += "&amp;lt;filter type='" + filterType + "'&amp;gt;";&lt;br /&gt;&lt;br /&gt;        if (conditionAttributeSplit.length &amp;gt; 1) {&lt;br /&gt;            for (i = 0; i &amp;lt; conditionAttributeSplit.length; i++) {&lt;br /&gt;                xml += "&amp;lt;condition attribute='" + conditionAttributeSplit[i] + "'" +&lt;br /&gt;                " operator='" + operatorSplit[i] + "' value='" + valueSplit[i] + "'/&amp;gt;";&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            xml += "&amp;lt;condition attribute='" + conditionAttribute + "'" +&lt;br /&gt;            " operator='" + operator + "' value='" + value + "'/&amp;gt;";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        xml += "&amp;lt;/filter&amp;gt;";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    xml += "&amp;lt;/entity&amp;gt;" +&lt;br /&gt;    "&amp;lt;/fetch&amp;gt;&amp;lt;/fetchXml&amp;gt;" +&lt;br /&gt;    "&amp;lt;/Fetch&amp;gt;" +&lt;br /&gt;    "&amp;lt;/soap:Body&amp;gt;" +&lt;br /&gt;    "&amp;lt;/soap:Envelope&amp;gt;";&lt;br /&gt;&lt;br /&gt;    // Prepare the xmlHttpObject and send the request.&lt;br /&gt;    var xHReq = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;    xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);&lt;br /&gt;    xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");&lt;br /&gt;    xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");&lt;br /&gt;    xHReq.setRequestHeader("Content-Length", xml.length);&lt;br /&gt;    xHReq.send(xml);&lt;br /&gt;&lt;br /&gt;    // Capture the result.&lt;br /&gt;    var resultXml = xHReq.responseXML;&lt;br /&gt;&lt;br /&gt;    // Check for errors.&lt;br /&gt;    var errorCount = resultXml.selectNodes('//error').length;&lt;br /&gt;    if (errorCount == 0) {&lt;br /&gt;        // Capture the result and UnEncode it.&lt;br /&gt;        var resultSet = new String();&lt;br /&gt;        resultSet = resultXml.text;&lt;br /&gt;&lt;br /&gt;        resultSet = resultSet.replace("&amp;lt;resultset morerecords=\"0\" /&amp;gt;", "");&lt;br /&gt;&lt;br /&gt;        if (resultSet != "") {&lt;br /&gt;            // Create an XML document that you can parse.&lt;br /&gt;            var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");&lt;br /&gt;            oXmlDoc.async = false;&lt;br /&gt;            // Load the XML document that has the UnEncoded results.&lt;br /&gt;            oXmlDoc.loadXML(resultSet);&lt;br /&gt;&lt;br /&gt;            var retValue = null;&lt;br /&gt;&lt;br /&gt;            if (oXmlDoc.getElementsByTagName('result') != null) {&lt;br /&gt;&lt;br /&gt;                var objLen = oXmlDoc.getElementsByTagName('result').length;&lt;br /&gt;                retValue = new Array(objLen);&lt;br /&gt;&lt;br /&gt;                // Loop nas Linhas&lt;br /&gt;                for (j = 0; j &amp;lt; objLen; j++) {&lt;br /&gt;&lt;br /&gt;                    retValue[j] = new Object();&lt;br /&gt;&lt;br /&gt;                    if (columnSplit.length &amp;gt; 1) {&lt;br /&gt;                        for (i = 0; i &amp;lt; columnSplit.length; i++) {&lt;br /&gt;                            if (oXmlDoc.getElementsByTagName('result')[j].selectSingleNode(String(columnSplit[i])))&lt;br /&gt;                                eval("retValue[" + String(j) + "]." + String(columnSplit[i]) + "= '" + oXmlDoc.getElementsByTagName('result')[j].selectSingleNode('./' + String(columnSplit[i])).text + "'");&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    else {&lt;br /&gt;&lt;br /&gt;                        if (oXmlDoc.getElementsByTagName('result')[j].selectSingleNode(column))&lt;br /&gt;                            eval("retValue[" + String(j) + "]." + column + "= '" + oXmlDoc.getElementsByTagName('result')[j].selectSingleNode(column).text + "'");&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return retValue;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E as formas de utilização:&lt;br /&gt;&lt;br /&gt;&lt;div style="padding: 0px 0px 15px 15px; text-align: left; color: black; font-family: Courier New; font-size: 12px; background-color: rgb(214, 232, 255);"&gt;&lt;br /&gt;&lt;br /&gt;var result1 = window.ExecFetchXML('account', 'accountid, name', 'name', 'like', '%TESTE%', null, null, null, null);&lt;br /&gt;alert(result1[0].accountid);&lt;br /&gt;alert(result1[0].name);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;- Ordenado por [name];&lt;br /&gt;- Ascendente [true];&lt;br /&gt;- Retorna 2 páginas, com 10 clientes por página.&lt;br /&gt;*/&lt;br /&gt;var result2 = window.ExecFetchXML('account', 'accountid, name', 'name', 'eq', 'TESTE', 'name', 'true', 2, 10);&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;- Busca por vários campos (name like '%TESTE%' e cnpj='12345678900');&lt;br /&gt;*/&lt;br /&gt;var result3 = window.ExecFetchXML('account', 'accountid, name', 'name,cnpj', 'like,eq', '%TESTE%,12345678900', null, null, null, null);&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-1869934040013927629?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/1869934040013927629/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=1869934040013927629' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1869934040013927629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1869934040013927629'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2011/09/crm-40-fetchxml-via-jscript.html' title='&gt;&gt; CRM 4.0 - FetchXML via JScript'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-3604102283318101713</id><published>2011-03-31T12:34:00.000-07:00</published><updated>2011-03-31T13:56:18.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Erro de Abertura de Popups</title><content type='html'>Se você está se deparando com o seguinte erro no CRM:&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;Não foi possível abrir uma janela do Microsoft Dynamics CRM. É possível que ela tenha sido bloqueada por um bloqueador de pop-ups. Adicione este servidor Microsoft Dynamics CRM a lista de sites aos quais o seu bloqueador de pop-ups permite abrir novas janelas: &amp;lt;servidorcrm&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-PxZJc6vA72Q/TZTZaBNU5xI/AAAAAAAAAGw/gR9ap9wUoGs/s1600/erroStringPlugin.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 108px;" src="http://3.bp.blogspot.com/-PxZJc6vA72Q/TZTZaBNU5xI/AAAAAAAAAGw/gR9ap9wUoGs/s400/erroStringPlugin.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5590332078497785618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;e já revisou (muitas vezes) as configurações do Internet Explorer, porém não encontrou a solução, segue mais uma dica importante:&lt;br /&gt;&lt;br /&gt;- Pode acontecer que, ao tentar salvar um registro na entidade do CRM, algum [PLUGIN] esteja sendo executado; e se este plugin estiver usando a função:&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;// Gera um retorno de mensagem para o usuário do CRM (em um Popup).&lt;br /&gt;throw new InvalidPluginExecutionException(MensagemErro);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pode acontecer que a variável [MensagemErro] exceda o tamanho de [1900] caracteres, o que vai impossibilitar a passagem desta mensagem para a camada de [interface] do CRM, a qual deveria mostrá-la para o usuário.&lt;br /&gt;&lt;br /&gt;Portanto, uma cadeia de caracteres muito grande, gera um erro "mentiroso" para o usuário!&lt;br /&gt;&lt;br /&gt;Fiquem atentos CRM Developers!&lt;br /&gt;&lt;br /&gt;[]s&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-3604102283318101713?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/3604102283318101713/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=3604102283318101713' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/3604102283318101713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/3604102283318101713'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2011/03/crm-40-erro-de-abertura-de-popups.html' title='&gt;&gt; CRM 4.0 - Erro de Abertura de Popups'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-PxZJc6vA72Q/TZTZaBNU5xI/AAAAAAAAAGw/gR9ap9wUoGs/s72-c/erroStringPlugin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-558178240870152005</id><published>2011-03-22T08:30:00.000-07:00</published><updated>2011-03-28T19:03:54.216-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>&gt;&gt; DICA: Internet Information Services EXPRESS!</title><content type='html'>&lt;div&gt;Quem desenvolve aplicações WEB, e já teve a necessidade de executar este tipo de aplicação em uma máquina [não-servidora], ou seja, que não contenha o [Internet Information Services] da Microsoft, deve estar familiarizado com o termo &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc188791.aspx"&gt;[Cassini Web Server]&lt;/a&gt;, que justamente faz o papel do IIS.&lt;br /&gt;&lt;br /&gt;Porém, como se sabe, esta aplicação é limitada, e consegue gerenciar aplicações que rodam sob o .NET Framework, até a versão 2.0 .&lt;br /&gt;&lt;br /&gt;A boa notícia é que a Microsoft lançou uma versão [gratuita] do IIS, chamada IIS Express. Inclusive, nesta versão, é possível rodar aplicações que utilizam o .NET Framework 4.0 .&lt;br /&gt;&lt;br /&gt;O blog do &lt;a href="http://weblogs.asp.net/scottguportuguese/archive/2011/01/04/vs-2010-service-pack-sp1-beta-e-servidor-web-iss-express.aspx"&gt;[Scott Guthrie]&lt;/a&gt; explica muito bem esta tecnologia.&lt;br /&gt;&lt;br /&gt;[]s&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-558178240870152005?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/558178240870152005/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=558178240870152005' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/558178240870152005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/558178240870152005'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2011/03/dica-internet-information-services.html' title='&gt;&gt; DICA: Internet Information Services EXPRESS!'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-7543227877154329236</id><published>2010-12-09T05:33:00.000-08:00</published><updated>2010-12-09T07:05:24.627-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft Office'/><title type='text'>&gt;&gt; Microsoft Office - Tecnologia OpenXML</title><content type='html'>Olá Pessoal,&lt;br /&gt;&lt;br /&gt;Gostaria de partilhar com vocês uma nova tecnologia desenvolvida pela Microsoft para manipulação de qualquer documento do Office, chamada [Office Open XML - OOXML]. Quem ainda não usou vai realmente se surpreender, principalmente se está acostumado a usar a tecnologia anterior, chamada [Office Interop Automation].&lt;br /&gt;&lt;br /&gt;Veja alguma das principais vantagens desta nova tecnologia:&lt;br /&gt;&lt;br /&gt;- Manipula documentos do Office no formato ZIP [XML-based]. Para comprovar isto, basta renomear algum documento Office para [.zip] e notar que seu conteúdo é representado por um pacote de XMLs e outros arquivos de recursos relacionados;&lt;br /&gt;&lt;br /&gt;- Esta tecnologia foi padronizada pela [ECMA], que regulariza e organiza padrões [mundiais] no uso de softwares;&lt;br /&gt;&lt;br /&gt;- OOXML pode ser usado a partir da versão 2007 do Office;&lt;br /&gt;&lt;br /&gt;- E o que considero como principal vantagem, possui a melhor performance já vista na manipulação de documentos.&lt;br /&gt;Por exemplo, foi feita uma comparação pela Microsoft no uso da tecnologia anterior com a OOXML (&lt;a href="http://msdn.microsoft.com/en-us/library/ff191178.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff191178.aspx&lt;/a&gt;). Foi desenvolvido um código para inserir uma imagem em cada uma das 300 linhas em uma [tabela do Word]. Na tecnologia anterior o tempo gasto para realizar esta tarefa foi de [60 segundos]. Na tecnologia OOXML este tempo caiu para incríveis [5 segundos]!.&lt;br /&gt;&lt;br /&gt;- Diferentemente da versão anterior, OOXML NÃO EXIGE a instalação do Microsoft Office no servidor onde seu código será instalado. Enorme vantagem!...&lt;br /&gt;&lt;br /&gt;A utilização deste componente no seu projeto .NET é muito simples, basta adicionar uma referência do arquivo [Document.OpenXml.dll] no seu projeto e sair codificando.&lt;br /&gt;&lt;br /&gt;Para ilustrar o uso deste componente, note o código abaixo, que usa [Linq To Object] do .NET Framework para recuperar todas as [tables] de um documento do Office Word:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;using DocumentFormat.OpenXml;&lt;br /&gt;using DocumentFormat.OpenXml.Packaging;&lt;br /&gt;using DocumentFormat.OpenXml.Wordprocessing;&lt;br /&gt;&lt;br /&gt;using (WordprocessingDocument wordDocument = WordprocessingDocument.Open('c:\WordDoc.docx', true))&lt;br /&gt;{&lt;br /&gt;List&amp;lt;Table&amp;gt; listTable = wordDocument.MainDocumentPart.Document.Body.Elements&amp;lt;Table&amp;gt;().ToList&amp;lt;Table&amp;gt;();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;É claro que, quando você começa a estudar mais a fundo esta tecnologia, nota que, para algumas tarefas, o desenvolvimento se torna mais complexo, até porque você vai manipular uma estrutura de arquivos proprietários do pacote ZIP-XML-Based. Por exemplo, se precisar adicionar um texto em uma célula de uma tabela do Office Word, vai notar que precisa seguir algumas regras de uso de objetos dentro da célula. Veja o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;using DocumentFormat.OpenXml;&lt;br /&gt;using DocumentFormat.OpenXml.Packaging;&lt;br /&gt;using DocumentFormat.OpenXml.Wordprocessing;&lt;br /&gt;&lt;br /&gt;using (WordprocessingDocument doc = WordprocessingDocument.Open('c:\WordDoc.docx', true))&lt;br /&gt;{&lt;br /&gt;Table table = doc.MainDocumentPart.Document.Body.Elements&amp;lt;table&amp;gt;().First();&lt;br /&gt;TableRow row = table.Elements&amp;lt;tablerow&amp;gt;().ElementAt(1);&lt;br /&gt;TableCell cell = row.Elements&amp;lt;tablecell&amp;gt;().ElementAt(2);&lt;br /&gt;Paragraph p = cell.Elements&amp;lt;paragraph&amp;gt;().First();&lt;br /&gt;Run r = p.Elements&amp;lt;run&amp;gt;().First();&lt;br /&gt;Text t = r.Elements&amp;lt;text&amp;gt;().First();&lt;br /&gt;t.Text = 'Some Text';&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No exemplo acima, o código realiza os seguintes passos:&lt;br /&gt;- Acessa a [primeira table] que encontrar no documento;&lt;br /&gt;- Acessa a [segunda] linha;&lt;br /&gt;- E altera o conteúdo da [terceira] coluna.&lt;br /&gt;&lt;br /&gt;Notamos também que existe uma [hierarquia] de objetos a serem acessados, como por exemplo, a classe [Paragraph] que contém a classe [Run], que por sua vez contém a classe [Text].&lt;br /&gt;&lt;br /&gt;Assim como em outros produtos Microsoft, a documentação referente ao OOXML é muito boa. Basta baixar o SDK, acessando:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/en/details.aspx?FamilyId=C6E744E5-36E9-45F5-8D8C-331DF206E0D0&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note que existem dois tipos de instalador:&lt;br /&gt;&lt;br /&gt;1 - OpenXMLSDKTool.msi&lt;br /&gt;&lt;br /&gt;Esta ferramenta é muito útil porque permite a visualização do conteúdo de qualquer documento Office, e um incrível recurso que possibilita gerar [código .NET] a partir de qualquer parte do documento aberto. Desta forma o processo de aprendizado é acelerado, pois você analisa um código pronto.&lt;br /&gt;&lt;br /&gt;Segue tela do OpenXMLTool, com a utilização do [Reflect Code]:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pnbueR6U8m8/TQDs-K1NHII/AAAAAAAAAF8/EWikiH49EIY/s1600/OpenXmlSDKTool.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 204px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5548695293724007554" border="0" alt="" src="http://4.bp.blogspot.com/_pnbueR6U8m8/TQDs-K1NHII/AAAAAAAAAF8/EWikiH49EIY/s400/OpenXmlSDKTool.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2 - OpenXMLSDKv2.msi&lt;br /&gt;&lt;br /&gt;Possui a documentação completa do OOXML, com diversos exemplos práticos.&lt;br /&gt;&lt;br /&gt;Tela principal do SDK:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pnbueR6U8m8/TQDuK9fVJaI/AAAAAAAAAGE/7j3ocq90IrM/s1600/OpenXmlSDK.jpg"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 205px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5548696612992525730" border="0" alt="" src="http://3.bp.blogspot.com/_pnbueR6U8m8/TQDuK9fVJaI/AAAAAAAAAGE/7j3ocq90IrM/s400/OpenXmlSDK.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That´s It!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-7543227877154329236?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/7543227877154329236/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=7543227877154329236' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7543227877154329236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7543227877154329236'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2010/12/microsoft-office-tecnologia-openxml.html' title='&gt;&gt; Microsoft Office - Tecnologia OpenXML'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pnbueR6U8m8/TQDs-K1NHII/AAAAAAAAAF8/EWikiH49EIY/s72-c/OpenXmlSDKTool.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-227085306485457831</id><published>2010-10-21T10:01:00.000-07:00</published><updated>2010-10-21T13:07:28.177-07:00</updated><title type='text'>&gt;&gt; CRM 4.0 - Link Dinâmico no Corpo do Email</title><content type='html'>Olá Pessoal,&lt;br /&gt;&lt;br /&gt;Pouco tempo atrás me surgiu uma necessidade interessante, a criação de um [Link Dinâmico] no corpo de um email no CRM.&lt;br /&gt;&lt;br /&gt;Eu consegui criar uma solução simples e funcional que gostaria de partilhar com vocês.&lt;br /&gt;&lt;br /&gt;Para esta solução existem diversos cenários possíveis para a configuração do Link Dinâmico, porém, vamos usar um cenário em que deveremos enviar um email para um contato que foi criado no CRM.&lt;br /&gt;&lt;br /&gt;No corpo do email enviaremos um link que apontará para o formulário do CRM, no registro daquele contato criado.&lt;br /&gt;&lt;br /&gt;Para o envio do email utilizaremos o recurso do CRM de Workflow. Veja como deverá ficar o workflow completo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pnbueR6U8m8/TMCbG_-gBkI/AAAAAAAAAFo/gToqlo0WjG0/s1600/wkcrm0.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 202px;" src="http://2.bp.blogspot.com/_pnbueR6U8m8/TMCbG_-gBkI/AAAAAAAAAFo/gToqlo0WjG0/s400/wkcrm0.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530590886966068802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1 - Como primeiro passo, vamos criar dois campos na entidade de Contato, por exemplo, [new_url_ctt] e [new_url_link] do tipo [ntext] e adicioná-los no formulário do Contato (importante adicionar no formulário para podermos utilizá-los nos passos a frente);&lt;br /&gt;&lt;br /&gt;2 - Adicione no [OnLoad] do Formulário de Contato o JScript abaixo, para preenchimento do campo [new_url_ctt]:&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;if(crmForm.FormType != 1)&lt;br /&gt;{&lt;br /&gt;if(crmForm.all.new_url_ctt.DataValue == null)&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_url_ctt.DataValue = 'http://localhost:5555/sfa/conts/edit.aspx?id='&lt;br /&gt;+ crmForm.ObjectId;&lt;br /&gt;&lt;br /&gt;crmForm.Save();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;3 - Vamos agora desenvolver um workflow para preencher o campo [new_url_link] e enviar o email;&lt;br /&gt;3.1 - Crie, portanto, um workflow para ser disparado no evento de [criação de novo registro];&lt;br /&gt;3.2 - Clique no botão [Adicionar Etapa] e escolha [Aguardar Condição]; para a condição coloque [até que url_ctt "contenha dados"];&lt;br /&gt;3.3 - Uma vez que a condição foi satisfeita, adicione a etapa [Atualizar Registro]. No botão [Definir Propriedades], atualize o campo [new_url_link] conforme mostra a imagem abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pnbueR6U8m8/TMCZqHFnbOI/AAAAAAAAAFI/86hduNTf934/s1600/wkcrm_urlctt.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 211px;" src="http://2.bp.blogspot.com/_pnbueR6U8m8/TMCZqHFnbOI/AAAAAAAAAFI/86hduNTf934/s400/wkcrm_urlctt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530589291147128034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3.4 - E como passo final adicione a etapa [Enviar Email], usando o campo [new_url_link] que foi preenchido no passo anterior, conforme a imagem:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pnbueR6U8m8/TMCaWiutkjI/AAAAAAAAAFQ/i3EdxhIYxu4/s1600/wkcrmEmailLink.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 179px;" src="http://2.bp.blogspot.com/_pnbueR6U8m8/TMCaWiutkjI/AAAAAAAAAFQ/i3EdxhIYxu4/s400/wkcrmEmailLink.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530590054481498674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quando o email for criado pelo CRM, o link aparecerá no corpo do email, como mostra a figura:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pnbueR6U8m8/TMCcJakdZyI/AAAAAAAAAFw/fUQ1RNZsuxc/s1600/wkcrmEmailLink2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 150px;" src="http://1.bp.blogspot.com/_pnbueR6U8m8/TMCcJakdZyI/AAAAAAAAAFw/fUQ1RNZsuxc/s400/wkcrmEmailLink2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530592027975968546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That´s It!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-227085306485457831?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/227085306485457831/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=227085306485457831' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/227085306485457831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/227085306485457831'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2010/10/crm-40-link-dinamico-no-corpo-do-email.html' title='&gt;&gt; CRM 4.0 - Link Dinâmico no Corpo do Email'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pnbueR6U8m8/TMCbG_-gBkI/AAAAAAAAAFo/gToqlo0WjG0/s72-c/wkcrm0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-3904364217357034482</id><published>2010-07-07T07:16:00.000-07:00</published><updated>2010-07-07T08:04:58.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Dica para Esconder uma Opção do Menu Vertical do Formulário</title><content type='html'>Uma dica rápida!&lt;br /&gt;&lt;br /&gt;Segue código JScript para desabilitar uma opção de menu vertical do formulário do CRM.&lt;br /&gt;&lt;br /&gt;A idéia é colar o código abaixo no [OnLoad] do formulário e usar a função, passando como parâmetro o [nome] do item do menu que deseja esconder. Por exemplo, para esconder a opção [mais endereços], use a função da seguinte maneira:&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;crmForm.disableVerticalMenuItem("crmNavBar", "mais endereços");&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="TEXT-ALIGN: left; PADDING-BOTTOM: 15px; BACKGROUND-COLOR: #d6e8ff; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 12px; PADDING-TOP: 0px"&gt;&lt;br /&gt;crmForm.disableVerticalMenuItem = function (navBar, menuItem)&lt;br /&gt;{&lt;br /&gt;   menuItem = menuItem.toLowerCase().replace(/^\s+|\s+$/g, '');&lt;br /&gt;   il=document.getElementById(navBar).getElementsByTagName('li');&lt;br /&gt;&lt;br /&gt;   for(i=0;i &amp;lt; il.length;i++)&lt;br /&gt;   {&lt;br /&gt;      liItem = il[i].innerText.toLowerCase().replace(/^\s+|\s+$/g, '');&lt;br /&gt;&lt;br /&gt;      if (liItem == menuItem)&lt;br /&gt;      {&lt;br /&gt;         anchor = il[i].getElementsByTagName('a')[0];&lt;br /&gt;         anchor.parentNode.removeChild(anchor);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;crmForm.disableVerticalMenuItem("crmNavBar", "mais endereços");&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-3904364217357034482?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/3904364217357034482/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=3904364217357034482' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/3904364217357034482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/3904364217357034482'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2010/07/crm-40-dica-para-esconder-uma-opcao-do.html' title='&gt;&gt; CRM 4.0 - Dica para Esconder uma Opção do Menu Vertical do Formulário'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-8587938418975280999</id><published>2010-03-26T08:23:00.001-07:00</published><updated>2010-08-29T16:11:32.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Exibição de Relatórios no IFRAME (OnLine e OffLine Access)</title><content type='html'>Sem dúvida alguma, um dos grandes recursos do Dynamics CRM para o desenvolvedor é a possibilidade de integração do [Reporting Services] no produto. Inclusive, o processo de publicação dos relatórios desenvolvidos no Dynamics CRM fica fácil, pois utilizamos a própria interface do produto para isto.&lt;br /&gt;&lt;br /&gt;Pensando nisto, imagine o desenvolvimento de um relatório para o Dynamics CRM, porém, com a necessidade de visualização deste relatório em um [IFrame]; e mais, o relatório deve funcionar para as versões do Dynamics CRM [OnLine] e para [Outlook OFFLine]!.&lt;br /&gt;&lt;br /&gt;Pois bem, segue uma forma [simples] de resolver esta questão:&lt;br /&gt;&lt;br /&gt;1 - Desenvolva normalmente seu relatório (usando, é claro, as FilteredViews);&lt;br /&gt;2 - Efetue o Upload do relatório no Dynamics CRM;&lt;br /&gt;3 - Adicione o [IFrame] na entidade que deseja visualizar o relatório;&lt;br /&gt;&lt;br /&gt;A idéia agora é preencher o IFrame dinamicamente, no [OnLoad] do formulário.&lt;br /&gt;&lt;br /&gt;Usando o importante recurso do Dynamics CRM chamado [URL Addressable Forms], também podemos nos utilizar disto para os relatórios.&lt;br /&gt;&lt;br /&gt;Portanto, no [OnLoad] do formulário, adicione o seguinte código:&lt;br /&gt;&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; text-align:left; padding:0px 0px 15px 15px; color:black;'&gt;&lt;br /&gt;var reportID = getReportIDByName("NOMEDOSEURELATORIO");&lt;br /&gt;&lt;br /&gt;var urlReport = SERVER_URL + "/crmreports/viewer/viewer.aspx?action=run&amp;id=" + reportID + "&amp;context=records&amp;recordstype=1&amp;records=" + crmForm.ObjectId + "&amp;helpID=NOMEDOSEURELATORIO.rdl";&lt;br /&gt;&lt;br /&gt;crmForm.all.IFRAME_report.src=urlReport;&lt;br /&gt;&lt;br /&gt;function getReportIDByName(reportname)&lt;br /&gt;{&lt;br /&gt;   return ExecFetchXML('report', 'reportid', 'name', 'eq', reportname);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ExecFetchXML(entityName, column, conditionAttribute, operator, value)&lt;br /&gt;{&lt;br /&gt; var guid = "";&lt;br /&gt; var fetchMapping = "logical";&lt;br /&gt; var filterType = "and";&lt;br /&gt; var authenticationHeader = GenerateAuthenticationHeader();&lt;br /&gt;&lt;br /&gt; // Prepare the SOAP message.&lt;br /&gt; var xml = "&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;"+ &lt;br /&gt; "&amp;lt;soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"+&lt;br /&gt; " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"+&lt;br /&gt; " xmlns:xsd='http://www.w3.org/2001/XMLSchema'&amp;gt;"+ &lt;br /&gt; authenticationHeader+ &lt;br /&gt; "&amp;lt;soap:Body&amp;gt;"+ &lt;br /&gt; "&amp;lt;Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'&amp;gt;"+ &lt;br /&gt; "&amp;lt;fetchXml&amp;gt;&amp;lt;fetch mapping='"+fetchMapping+"'&amp;gt;"+ &lt;br /&gt; "&amp;lt;entity name='"+entityName+"'&amp;gt;"+ &lt;br /&gt; "&amp;lt;attribute name='"+column+"'/&amp;gt;"+ &lt;br /&gt;                     "&amp;lt;filter type='"+filterType+"'&amp;gt;"+ &lt;br /&gt;                     "&amp;lt;condition attribute='"+conditionAttribute+"'"+&lt;br /&gt;                     " operator='"+operator+"' value='"+value+"'/&amp;gt;"+ &lt;br /&gt;                     "&amp;lt;/filter&amp;gt;"+ &lt;br /&gt; "&amp;lt;/entity&amp;gt;"+ &lt;br /&gt; "&amp;lt;/fetch&amp;gt;&amp;lt;/fetchXml&amp;gt;"+ &lt;br /&gt; "&amp;lt;/Fetch&amp;gt;"+ &lt;br /&gt; "&amp;lt;/soap:Body&amp;gt;"+ &lt;br /&gt; "&amp;lt;/soap:Envelope&amp;gt;";&lt;br /&gt; // Prepare the xmlHttpObject and send the request.&lt;br /&gt; var xHReq = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt; xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);&lt;br /&gt; xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch");&lt;br /&gt; xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");&lt;br /&gt; xHReq.setRequestHeader("Content-Length", xml.length);&lt;br /&gt; xHReq.send(xml);&lt;br /&gt; // Capture the result.&lt;br /&gt; var resultXml = xHReq.responseXML;&lt;br /&gt;&lt;br /&gt; // Check for errors.&lt;br /&gt; var errorCount = resultXml.selectNodes('//error').length;&lt;br /&gt; if (errorCount == 0)&lt;br /&gt; {&lt;br /&gt; // Capture the result and UnEncode it.&lt;br /&gt; var resultSet = new String();&lt;br /&gt; resultSet = resultXml.text;&lt;br /&gt;&lt;br /&gt; // Create an XML document that you can parse.&lt;br /&gt;    var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");&lt;br /&gt;    oXmlDoc.async = false; &lt;br /&gt; // Load the XML document that has the UnEncoded results.&lt;br /&gt;    oXmlDoc.loadXML(resultSet);&lt;br /&gt;&lt;br /&gt;                        if (oXmlDoc.getElementsByTagName('result') != null)&lt;br /&gt;       guid = oXmlDoc.getElementsByTagName('result')[0].selectSingleNode('./' + column).nodeTypedValue;    &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return guid;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Note o uso dos seguintes recursos:&lt;br /&gt;&lt;br /&gt;- Obtenção do [ID] do relatório adicionado no CRM, através da função [getReportIDByName];&lt;br /&gt;&lt;br /&gt;- URL de relatórios do CRM: [/crmreports/viewer/viewer.aspx]. Note os parâmetros preenchidos para a execução dinâmica do relatório;&lt;br /&gt;&lt;br /&gt;- O relatório será também executado no modo OFFLINE (através do uso da variável Global [SERVER_URL] do CRM);&lt;br /&gt;&lt;br /&gt;- E a utilização de um FetchXML (função ExecFetchXML) para busca de informação na Entidade [ReportBase] do CRM.&lt;br /&gt;&lt;br /&gt;Segue exemplo, em uma Conta, da execução de um relatório em um IFrame:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pnbueR6U8m8/S6zc34ldNNI/AAAAAAAAAEA/pR1MI4ZD6NA/s1600/crmreportpane.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://3.bp.blogspot.com/_pnbueR6U8m8/S6zc34ldNNI/AAAAAAAAAEA/pR1MI4ZD6NA/s400/crmreportpane.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5452976101479232722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That´s It!&lt;br /&gt;&lt;br /&gt;Abraços.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-8587938418975280999?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/8587938418975280999/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=8587938418975280999' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/8587938418975280999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/8587938418975280999'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2010/03/crm-40-exibicao-de-relatorios-no-iframe.html' title='&gt;&gt; CRM 4.0 - Exibição de Relatórios no IFRAME (OnLine e OffLine Access)'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pnbueR6U8m8/S6zc34ldNNI/AAAAAAAAAEA/pR1MI4ZD6NA/s72-c/crmreportpane.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5594723494431019468</id><published>2009-02-17T12:26:00.000-08:00</published><updated>2009-02-19T09:06:59.348-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework 3.5'/><title type='text'>.NET Framework 3.5 - LINQ</title><content type='html'>&lt;strong&gt;Introdução ao LINQ (Language-Integrated Query)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;LINQ é realmente um passo inovador no Visual Studio 2008 e .NET Framework 3.5, servindo como [ponte] entre o mundo dos objetos e o mundo dos dados.&lt;br /&gt;&lt;br /&gt;O interessante deste recurso é o fato de construir suas [Queries] usando coleções fortemente tipadas de objetos, como uma linguagem de programação.&lt;br /&gt;&lt;br /&gt;A ilustração abaixo mostra uma [LINQ Query] parcialmente completa, efetuando uma busca no banco de dados Sql Server, com total checagem de tipo e suporte a IntelliSense:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pnbueR6U8m8/SZqvZSO7bFI/AAAAAAAAADw/zjYD3PV2saE/s1600-h/LINQ1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303744360108223570" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 316px" alt="" src="http://1.bp.blogspot.com/_pnbueR6U8m8/SZqvZSO7bFI/AAAAAAAAADw/zjYD3PV2saE/s400/LINQ1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No Visual Studio você pode escrever LINQ Queries no [Visual Basic] ou [C#] com Sql Server, XML Documents, ADO.NET DataSets, e qualquer coleção de objetos que suporta [IEnumerable] ou a Interface Genérica [IEnumerable(T)].&lt;br /&gt;&lt;br /&gt;Para aprendermos mais sobre a Tecnologia LINQ, segue artigos sobre suas quatro principais atuações:&lt;br /&gt;&lt;br /&gt;- LINQ to SQL (&lt;a href="http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-sql.html"&gt;http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-sql.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;- LINQ to XML (&lt;a href="http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-xml.html"&gt;http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-xml.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;- LINQ to DataSet (&lt;a href="http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-dataset.html"&gt;http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-dataset.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;- LINQ to Objects (&lt;a href="http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-objects.html"&gt;http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-objects.html&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5594723494431019468?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5594723494431019468/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5594723494431019468' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5594723494431019468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5594723494431019468'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/net-framework-35-linq_17.html' title='.NET Framework 3.5 - LINQ'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pnbueR6U8m8/SZqvZSO7bFI/AAAAAAAAADw/zjYD3PV2saE/s72-c/LINQ1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-7445342520109243211</id><published>2009-02-17T09:22:00.000-08:00</published><updated>2009-02-17T12:22:40.236-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework 3.5'/><title type='text'>.NET Framework 3.5 - LINQ to Objects</title><content type='html'>O termo [LINQ to Objects] se refere ao uso de LINQ queries diretamente com qualquer coleção IEnumerable ou IEnumerable(T) sem o uso de qualquer provedor intermediário ou API, como no caso do [LINQ to SQL] ou [LINQ to XML].&lt;br /&gt;&lt;br /&gt;Assim como no uso dos outros recursos do LINQ (SQL, XML e DataSet) LINQ to Objects proporciona uma mudança significativa no desenvolvimento, de forma a simplificar a codificação, comparando por exemplo, ao uso do &lt;strong&gt;foreach&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Em adição, LINQ queries oferecem três vantagens principais sobre os tradicionais &lt;strong&gt;foreach loops&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;1 - Eles são mais concisos e legíveis, especialmente quando filtram múltiplas condições;&lt;br /&gt;2 - Eles provêem mais poder de filtragem, ordenação e agrupamento com um mínimo de codificação;&lt;br /&gt;3 - Eles podem ser portados para outras fontes de dados com pequena ou nenhuma modificação.&lt;br /&gt;&lt;br /&gt;O exemplo a seguir mostra uma query sobre um ArrayList. Note que este exemplo usa inicializadores de objeto quando o código chama o método [Add], mas isto não é requerido.&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;Imports System.Collections&lt;br /&gt;Imports System.Linq&lt;br /&gt;&lt;br /&gt;Module Module1&lt;br /&gt;&lt;br /&gt;    Public Class Student&lt;br /&gt;        Public FirstName As String&lt;br /&gt;        Public LastName As String&lt;br /&gt;        Public Scores As Integer()&lt;br /&gt;    End Class&lt;br /&gt;&lt;br /&gt;    Sub Main()&lt;br /&gt;&lt;br /&gt;        Dim student1 As New Student With {.FirstName = "Svetlana", _&lt;br /&gt;                                     .LastName = "Omelchenko", _&lt;br /&gt;                                     .Scores = New Integer() {98, 92, 81, 60}}&lt;br /&gt;        Dim student2 As New Student With {.FirstName = "Claire", _&lt;br /&gt;                                    .LastName = "O'Donnell", _&lt;br /&gt;                                    .Scores = New Integer() {75, 84, 91, 39}}&lt;br /&gt;        Dim student3 As New Student With {.FirstName = "Cesar", _&lt;br /&gt;                                    .LastName = "Garcia", _&lt;br /&gt;                                    .Scores = New Integer() {97, 89, 85, 82}}&lt;br /&gt;        Dim student4 As New Student With {.FirstName = "Sven", _&lt;br /&gt;                                    .LastName = "Mortensen", _&lt;br /&gt;                                    .Scores = New Integer() {88, 94, 65, 91}}&lt;br /&gt;&lt;br /&gt;        Dim arrList As New ArrayList()&lt;br /&gt;        arrList.Add(student1)&lt;br /&gt;        arrList.Add(student2)&lt;br /&gt;        arrList.Add(student3)&lt;br /&gt;        arrList.Add(student4)&lt;br /&gt;&lt;br /&gt;        ' Use an explicit type for non-generic collections&lt;br /&gt;        Dim query = From student As Student In arrList _&lt;br /&gt;                    Where student.Scores(0) &gt; 95 _&lt;br /&gt;                    Select student&lt;br /&gt;&lt;br /&gt;        For Each student As Student In query&lt;br /&gt;            Console.WriteLine(student.LastName &amp; ": " &amp; student.Scores(0))&lt;br /&gt;        Next&lt;br /&gt;        ' Keep the console window open in debug mode.&lt;br /&gt;        Console.WriteLine("Press any key to exit.")&lt;br /&gt;        Console.ReadKey()&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;End Module&lt;br /&gt;' Output:&lt;br /&gt;'   Omelchenko: 98&lt;br /&gt;'   Garcia: 97&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;[C#]&lt;br /&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Linq;&lt;br /&gt;&lt;br /&gt;namespace NonGenericLINQ&lt;br /&gt;{&lt;br /&gt;    public class Student&lt;br /&gt;    {&lt;br /&gt;        public string FirstName { get; set; }&lt;br /&gt;        public string LastName { get; set; }&lt;br /&gt;        public int[] Scores { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            ArrayList arrList = new ArrayList();&lt;br /&gt;            arrList.Add(&lt;br /&gt;                new Student&lt;br /&gt;                    {&lt;br /&gt;                        FirstName = "Svetlana", LastName = "Omelchenko", Scores = new int[] { 98, 92, 81, 60 }&lt;br /&gt;                    });&lt;br /&gt;            arrList.Add(&lt;br /&gt;                new Student&lt;br /&gt;                    {&lt;br /&gt;                        FirstName = "Claire", LastName = "O’Donnell", Scores = new int[] { 75, 84, 91, 39 }&lt;br /&gt;                    });&lt;br /&gt;            arrList.Add(&lt;br /&gt;                new Student&lt;br /&gt;                    {&lt;br /&gt;                        FirstName = "Sven", LastName = "Mortensen", Scores = new int[] { 88, 94, 65, 91 }&lt;br /&gt;                    });&lt;br /&gt;            arrList.Add(&lt;br /&gt;                new Student&lt;br /&gt;                    {&lt;br /&gt;                        FirstName = "Cesar", LastName = "Garcia", Scores = new int[] { 97, 89, 85, 82 }&lt;br /&gt;                    });&lt;br /&gt;&lt;br /&gt;            var query = from Student student in arrList&lt;br /&gt;                        where student.Scores[0] &gt; 95&lt;br /&gt;                        select student;&lt;br /&gt;&lt;br /&gt;            foreach (Student s in query)&lt;br /&gt;                Console.WriteLine(s.LastName + ": " + s.Scores[0]);&lt;br /&gt;&lt;br /&gt;            // Keep the console window open in debug mode.&lt;br /&gt;            Console.WriteLine("Press any key to exit.");&lt;br /&gt;            Console.ReadKey();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;/* Output: &lt;br /&gt;    Omelchenko: 98&lt;br /&gt;    Garcia: 97&lt;br /&gt;*/&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;________________________________&lt;br /&gt;101 Visual Basic LINQ Samples! - &lt;a href="http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx"&gt;http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-7445342520109243211?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/7445342520109243211/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=7445342520109243211' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7445342520109243211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7445342520109243211'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-objects.html' title='.NET Framework 3.5 - LINQ to Objects'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-8994285681378292884</id><published>2009-02-17T08:47:00.000-08:00</published><updated>2009-02-17T12:22:40.239-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework 3.5'/><title type='text'>.NET Framework 3.5 - LINQ to DataSet</title><content type='html'>LINQ to DataSet faz com que a busca de dados em [objetos DataSet] se tornem ainda mais fáceis e rápidas.&lt;br /&gt;&lt;br /&gt;Este recurso traz maior produtividade e flexibilidade para os desenvolvedores já que trabalham com [Queries] na sua própria linguagem de programação.&lt;br /&gt;&lt;br /&gt;LINQ to DataSet expõe, primariamente, os métodos adicionais nas classes [DataRowExtensions] and [DataTableExtensions]. Também se utiliza da arquitetura do ADO.NET 2.0, não tendo a intenção da substituir o ADO.NET 2.0 no código da aplicação.&lt;br /&gt;&lt;br /&gt;O relacionamento do [LINQ to DataSet] com o [ADO.NET 2.0] e o [Data Store] é ilustrado no diagrama abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pnbueR6U8m8/SZrtgijie7I/AAAAAAAAAD4/imxJeDljYzc/s1600-h/LINQtoDataSet1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5303812654469643186" style="WIDTH: 235px; CURSOR: hand; HEIGHT: 369px" alt="" src="http://1.bp.blogspot.com/_pnbueR6U8m8/SZrtgijie7I/AAAAAAAAAD4/imxJeDljYzc/s400/LINQtoDataSet1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Querying DataSets Usando LINQ to DataSet&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;No exemplo abaixo podemos notar a facilidade de busca e manipulação dos dados em um DataSet do ADO.NET 2.0. Como a classe [DataTable] não implementa a interface [IEnumerable(T)], chamamos o método [AsEnumerable] para usar o DataTable com uma [fonte] para a cláusula [From] da LINQ query.&lt;br /&gt;&lt;br /&gt;O exemplo busca todos os pedidos [online] da tabela [SalesOrderHeader] e mostra os atributos [order ID], [order date], e [order number] .&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;' Fill the DataSet.&lt;br /&gt;Dim ds As New DataSet()&lt;br /&gt;ds.Locale = CultureInfo.InvariantCulture&lt;br /&gt;' See the FillDataSet method in the Loading Data Into a DataSet topic.&lt;br /&gt;FillDataSet(ds)&lt;br /&gt;&lt;br /&gt;Dim orders As DataTable = ds.Tables("SalesOrderHeader")&lt;br /&gt;&lt;br /&gt;Dim query = _&lt;br /&gt;From order In orders.AsEnumerable() _&lt;br /&gt;Where order.Field(Of Boolean)("OnlineOrderFlag") = True _&lt;br /&gt;Select New With { _&lt;br /&gt;.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _&lt;br /&gt;.OrderDate = order.Field(Of DateTime)("OrderDate"), _&lt;br /&gt;.SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;For Each onlineOrder In query&lt;br /&gt;Console.Write("Order ID: " &amp;amp; onlineOrder.SalesOrderID)&lt;br /&gt;Console.Write(" Order date: " &amp;amp; onlineOrder.OrderDate)&lt;br /&gt;Console.WriteLine(" Order number: " &amp;amp; onlineOrder.SalesOrderNumber)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[C#]&lt;br /&gt;// Fill the DataSet.&lt;br /&gt;DataSet ds = new DataSet();&lt;br /&gt;ds.Locale = CultureInfo.InvariantCulture;&lt;br /&gt;FillDataSet(ds);&lt;br /&gt;&lt;br /&gt;DataTable orders = ds.Tables["SalesOrderHeader"];&lt;br /&gt;&lt;br /&gt;var query =&lt;br /&gt;from order in orders.AsEnumerable()&lt;br /&gt;where order.Field&lt;bool&gt;("OnlineOrderFlag") == true&lt;br /&gt;select new&lt;br /&gt;{&lt;br /&gt;SalesOrderID = order.Field&lt;int&gt;("SalesOrderID"),&lt;br /&gt;OrderDate = order.Field&lt;datetime&gt;("OrderDate"),&lt;br /&gt;SalesOrderNumber = order.Field&lt;string&gt;("SalesOrderNumber")&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;foreach (var onlineOrder in query)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",&lt;br /&gt;onlineOrder.SalesOrderID,&lt;br /&gt;onlineOrder.OrderDate,&lt;br /&gt;onlineOrder.SalesOrderNumber);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;________________________________&lt;br /&gt;101 Visual Basic LINQ Samples! - &lt;a href="http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx"&gt;http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-8994285681378292884?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/8994285681378292884/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=8994285681378292884' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/8994285681378292884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/8994285681378292884'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-dataset.html' title='.NET Framework 3.5 - LINQ to DataSet'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pnbueR6U8m8/SZrtgijie7I/AAAAAAAAAD4/imxJeDljYzc/s72-c/LINQtoDataSet1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-1006510234041462452</id><published>2009-02-17T08:08:00.000-08:00</published><updated>2009-02-17T12:22:40.242-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework 3.5'/><title type='text'>.NET Framework 3.5 - LINQ to XML</title><content type='html'>LINQ to XML provê uma interface de programação [in-memory] com [Modelo de Objeto de Documentos - DOM].&lt;br /&gt;&lt;br /&gt;O interessante deste novo recurso é que ficou mais fácil a manipulação de XMLs (comparando por exemplo ao uso do XPATH) pois este tipo de objeto é manipulado através de Queries, similar a manipulação no SQL.&lt;br /&gt;&lt;br /&gt;O exemplo abaixo mostra a facilidade de uso. Está sendo retornada uma lista, ordernado pelo campo partnumber, dos itens com valor maior do que 100.&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;&lt;strong&gt;[C#]&lt;/strong&gt;&lt;br /&gt;IEnumerable&lt;XElement&gt; partNos =&lt;br /&gt;    from item in purchaseOrder.Descendants("Item")&lt;br /&gt;    where (int) item.Element("Quantity") *&lt;br /&gt;        (decimal) item.Element("USPrice") &gt; 100&lt;br /&gt;    orderby (string)item.Element("PartNumber")&lt;br /&gt;    select item;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[Visual Basic]&lt;/strong&gt;&lt;br /&gt;Dim partNos = _&lt;br /&gt;    From item In purchaseOrder...&lt;Item&gt; _&lt;br /&gt;    Where (item.&lt;Quantity&gt;.Value * _&lt;br /&gt;           item.&lt;USPrice&gt;.Value) &gt; 100 _&lt;br /&gt;    Order By item.&lt;PartNumber&gt;.Value _&lt;br /&gt;    Select item&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A melhoria na manipulação da interface de programação XML é realmente significativa. Inclusive podemos fazer todo tipo de manipulação, como fariamos em uma programação XML, sendo elas:&lt;br /&gt;&lt;br /&gt;- Carregar XML de arquivos ou streams.&lt;br /&gt;- Serializar XML para arquivos ou streams.&lt;br /&gt;- Query XML usando [XPath-like].&lt;br /&gt;- Manipular a [árvore XML] in-memory usando métodos comm Add, Remove, ReplaceWith, e SetValue.&lt;br /&gt;- Validar a [árvore XML] usando XSD.&lt;br /&gt;&lt;br /&gt;Para exemplificar a facilidade na criação da árvore em XML, note o código abaixo:&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;[C#]&lt;br /&gt;XElement contacts =&lt;br /&gt;    new XElement("Contacts",&lt;br /&gt;        new XElement("Contact",&lt;br /&gt;            new XElement("Name", "Patrick Hines"),&lt;br /&gt;            new XElement("Phone", "206-555-0144", &lt;br /&gt;                new XAttribute("Type", "Home")),&lt;br /&gt;            new XElement("phone", "425-555-0145",&lt;br /&gt;                new XAttribute("Type", "Work")),&lt;br /&gt;            new XElement("Address",&lt;br /&gt;                new XElement("Street1", "123 Main St"),&lt;br /&gt;                new XElement("City", "Mercer Island"),&lt;br /&gt;                new XElement("State", "WA"),&lt;br /&gt;                new XElement("Postal", "68042")&lt;br /&gt;            )&lt;br /&gt;        )&lt;br /&gt;    );	&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E no Visual Basic o uso é ainda mais simplificado, pois usa-se o XML de forma literal:&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;[Visual Basic]&lt;br /&gt;Dim contacts = _&lt;br /&gt;    &lt; Contacts &gt;&lt;br /&gt;        &lt; Contact &gt;&lt;br /&gt;            &lt; Name &gt;Patrick Hines&lt; /Name &gt;&lt;br /&gt;            &lt; Phone Type="Home" &gt;206-555-0144&lt; /Phone &gt;&lt;br /&gt;            &lt; Phone Type="Work"&gt;425-555-0145&lt; /Phone &gt;&lt;br /&gt;            &lt; Address &gt;&lt;br /&gt;                &lt; Street1 &gt;123 Main St&lt; /Street1 &gt;&lt;br /&gt;                &lt; City&gt; Mercer Island&lt; /City &gt;&lt;br /&gt;                &lt; State &gt;WA&lt; /State &gt;&lt;br /&gt;                &lt; Postal &gt;68042&lt; /Postal &gt;&lt;br /&gt;            &lt; /Address &gt;&lt;br /&gt;        &lt; /Contact &gt;&lt;br /&gt;    &lt; /Contacts &gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;________________________________&lt;br /&gt;101 Visual Basic LINQ Samples! - &lt;a href="http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx"&gt;http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-1006510234041462452?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/1006510234041462452/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=1006510234041462452' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1006510234041462452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1006510234041462452'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-xml.html' title='.NET Framework 3.5 - LINQ to XML'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5278830108404154901</id><published>2009-02-17T05:50:00.000-08:00</published><updated>2009-02-17T12:22:40.248-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET Framework 3.5'/><title type='text'>.NET Framework 3.5 - LINQ to SQL</title><content type='html'>LINQ to SQL é um componente do .NET Framework 3.5 que provê uma Infraestrutura em tempo de execução para gerenciar dados relacionais como [objetos].&lt;br /&gt;&lt;br /&gt;Por exemplo, o objeto [nw], no código abaixo, é criado para representar o Banco de Dados [Northwind] que faz um "Select" na Tabela [Customers], retornando os registros da cidade de [Londres].&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;&lt;strong&gt;[Visual Basic]&lt;/strong&gt;&lt;br /&gt;' NorthwndDataContext herda de System.Data.Linq.DataContext.&lt;br /&gt;Dim nw As New NorthwndDataContext("C:\SQL Server 2000 Sample Databases\northwnd.mdf")&lt;br /&gt;&lt;br /&gt;Dim companyNameQuery = _&lt;br /&gt;From cust In nw.Customers _&lt;br /&gt;Where cust.City = "London" _&lt;br /&gt;Select cust.CompanyName&lt;br /&gt;&lt;br /&gt;For Each customer In companyNameQuery&lt;br /&gt;Console.WriteLine(customer)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;[C#]&lt;/strong&gt;&lt;br /&gt;// NorthwndDataContext herda de System.Data.Linq.DataContext.&lt;br /&gt;NorthwndDataContext nw = new NorthwndDataContext(@"C:\SQL Server 2000 Sample Databases\northwnd.mdf");&lt;br /&gt;&lt;br /&gt;var companyNameQuery =&lt;br /&gt;from cust in nw.Customers&lt;br /&gt;where cust.City == "London"&lt;br /&gt;select cust.CompanyName;&lt;br /&gt;&lt;br /&gt;foreach (var customer in companyNameQuery)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(customer);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Adicionando [LINQ to SQL Data Classes] em um Projeto&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para trabalharmos de forma orientada a objetos com o LINQ to SQL, como o exemplo acima mostrou no uso da classe [NorthwndDataContext], o Visual Studio 2008 disponibiliza duas ferramentas de apoio para a geração da classes de dados:&lt;br /&gt;&lt;br /&gt;- Object Relational Designer (&lt;a href="http://msdn.microsoft.com/en-us/library/bb384429.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb384429.aspx&lt;/a&gt;);&lt;br /&gt;&lt;br /&gt;- SQLMetal (&lt;a href="http://msdn.microsoft.com/pt-br/library/bb386987.aspx"&gt;http://msdn.microsoft.com/pt-br/library/bb386987.aspx&lt;/a&gt;);&lt;br /&gt;&lt;br /&gt;Com o O/R Designer, temos a disposição uma rica interface, dentro do Visual Studio 2008, para criarmos nossas classes de dados. Repare que existe um [Template] para isto no [VS 2008], chamado [LINQ to SQL Classes], quando se adiciona um item novo no projeto (.dbml).&lt;br /&gt;&lt;br /&gt;Com o SQLMetal, fazemos o mesmo, só que fora do Visual Studio 2008, na linha de comando do DOS.&lt;br /&gt;&lt;br /&gt;O seguinte exemplo gera a classe de dados (em Visual Basic) baseado no Banco de Dados Northwind:&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;sqlmetal /code:northwind.vb /language:vb "c:\northwnd.mdf" /sprocs /functions&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;P.S.: Note que nos exemplos trabalhamos com o Banco de Dados [Northwind] do Sql Server 2000. Ele ainda continua sendo um bom banco para testes (principalmente devido seu tamanho). Para usar este banco no Sql Server 2005, faça o seguinte:&lt;br /&gt;&lt;br /&gt;1 - Efetue o download em: &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=06616212-0356-46a0-8da2-eebc53a68034&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=06616212-0356-46a0-8da2-eebc53a68034&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2 - Execute o arquivo [SQL2000SampleDb.msi], e adicione (&lt;strong&gt;Attach&lt;/strong&gt;) o banco [Northwnd.mdf], localizado em [C:\SQL Server 2000 Sample Databases].&lt;br /&gt;&lt;br /&gt;________________________________&lt;br /&gt;101 Visual Basic LINQ Samples! - &lt;a href="http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx"&gt;http://msdn.microsoft.com/en-us/vbasic/bb688088.aspx&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5278830108404154901?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5278830108404154901/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5278830108404154901' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5278830108404154901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5278830108404154901'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/net-framework-35-linq-to-sql.html' title='.NET Framework 3.5 - LINQ to SQL'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-6611609453579137297</id><published>2009-02-10T06:56:00.000-08:00</published><updated>2009-03-02T08:58:15.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Preenchimento Automático de PickList (REVISADO)</title><content type='html'>------------ REVISÃO ---------------&lt;br /&gt;Efetuei algumas alterações/correções pois, ao salvar o registro, estava gerando erro (explicado no passo 2 abaixo).&lt;br /&gt;------------------------------------&lt;br /&gt;&lt;br /&gt;Ainda na atual versão do CRM (4.0) não se pode configurar objetos para preenchimento automático de outros, via configuração básica do produto. Por exemplo, ao selecionar uma Conta, em um [Lookup], retornar em um [Picklist] os Contatos da Conta.&lt;br /&gt;&lt;br /&gt;Segue então solução, via desenvolvimento JavaScript, para isto.&lt;br /&gt;&lt;br /&gt;1 - Criar um PickList vazio;&lt;br /&gt;&lt;br /&gt;2 - Carregar o Picklist com uma quantidade "razoável" de linhas "VAZIAS". Porquê? Acontece que estamos carregando o Picklist dinamicamente. Internamente, o CRM busca em seu [METADADOS] as informações do Picklist tanto no [OnLoad] do Formulário quanto no [OnSave]. Ignorando este processo interno, ao carregar aleatóriamente os dados no PickList vai gerar um erro, pois o CRM nos dirá que [incialmente, ao carregar o formulário, o metadados para este Picklist não continha informação, porém agora contém, gerando uma exceção de índice do Dropdownlist].&lt;br /&gt;&lt;br /&gt;3 - No [OnChange] do Lookup desejado (no meu exemplo, de Conta) adicionar o código:&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; padding:0px 15px 15px 15px; color:black;'&gt;&lt;br /&gt;window.getAccountContacts();&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4 - E no [OnLoad] do Form do CRM, adicionar o código abaixo:&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; padding:0px 15px 15px 15px; color:black;'&gt;&lt;br /&gt;window.getAccountContacts = function (e)&lt;br /&gt;{&lt;br /&gt;crmForm.all.new_pickcontact.DataValue = null;&lt;br /&gt;crmForm.all.new_pickcontact.Disabled = true;&lt;br /&gt;&lt;br /&gt;if (crmForm.all.customerid.DataValue==null) return;&lt;br /&gt;&lt;br /&gt;var customerid = crmForm.all.customerid.DataValue[0].id;&lt;br /&gt;var authenticationHeader = GenerateAuthenticationHeader();&lt;br /&gt;&lt;br /&gt;var xml = "&lt;" + "?xml version=\"1.0\" encoding=\"utf-8\"?&gt;" + &lt;br /&gt; "&lt;" + "soap:Envelope xmlns:soap="+&lt;br /&gt; "\"http://schemas.xmlsoap.org/soap/envelope/\" "+&lt;br /&gt; "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "+&lt;br /&gt; "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"&gt;" + &lt;br /&gt; authenticationHeader+&lt;br /&gt; "&lt;" + "soap:Body&gt;" + &lt;br /&gt; "&lt;" + "RetrieveMultiple xmlns="+&lt;br /&gt; "\"http://schemas.microsoft.com/crm/2007/WebServices\"&gt;" + &lt;br /&gt; "&lt;" + "query xmlns:q1="+&lt;br /&gt; "\"http://schemas.microsoft.com/crm/2006/Query\" "+&lt;br /&gt; "xsi:type=\"q1:QueryByAttribute\"&gt;" + &lt;br /&gt; "&lt;" + "q1:EntityName&gt;contact" + "&lt;" + "/q1:EntityName&gt;" + &lt;br /&gt; "&lt;" + "q1:ColumnSet xsi:type=\"q1:ColumnSet\"&gt;" + &lt;br /&gt; "&lt;" + "q1:Attributes&gt;" + &lt;br /&gt; "&lt;" + "q1:Attribute&gt;fullname" + "&lt;" + "/q1:Attribute&gt;" + &lt;br /&gt; "&lt;" + "/q1:Attributes&gt;" + &lt;br /&gt; "&lt;" + "/q1:ColumnSet&gt;" + &lt;br /&gt; "&lt;" + "q1:Attributes&gt;" + &lt;br /&gt; "&lt;" + "q1:Attribute&gt;parentcustomerid" + "&lt;" + "/q1:Attribute&gt;" + &lt;br /&gt; "&lt;" + "/q1:Attributes&gt;" + &lt;br /&gt; "&lt;" + "q1:Values&gt;" + &lt;br /&gt; "&lt;" + "q1:Value xsi:type=\"xsd:string\"&gt;"+&lt;br /&gt; customerid+&lt;br /&gt; "&lt;" + "/q1:Value&gt;" + &lt;br /&gt; "&lt;" + "/q1:Values&gt;" + &lt;br /&gt; "&lt;" + "/query&gt;" + &lt;br /&gt; "&lt;" + "/RetrieveMultiple&gt;" + &lt;br /&gt; "&lt;" + "/soap:Body&gt;" + &lt;br /&gt; "&lt;" + "/soap:Envelope&gt;";&lt;br /&gt;&lt;br /&gt;xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt; xmlHttpRequest.Open(&lt;br /&gt;  "POST", &lt;br /&gt;  "/mscrmservices/2007/CrmService.asmx", &lt;br /&gt;  true&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt; xmlHttpRequest.setRequestHeader(&lt;br /&gt;  "SOAPAction",&lt;br /&gt;  "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple" );&lt;br /&gt;&lt;br /&gt; xmlHttpRequest.setRequestHeader(&lt;br /&gt;  "Content-Type", "text/xml; charset=utf-8" );&lt;br /&gt;&lt;br /&gt; xmlHttpRequest.setRequestHeader(&lt;br /&gt;  "Content-Length", xml.length );&lt;br /&gt;&lt;br /&gt; xmlHttpRequest.onreadystatechange = StateChangeAccountContacts;&lt;br /&gt; xmlHttpRequest.send(xml);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function StateChangeAccountContacts() &lt;br /&gt;{ &lt;br /&gt;if (xmlHttpRequest.readyState == 4) &lt;br /&gt;{ &lt;br /&gt;var resultXml = xmlHttpRequest.responseXML; &lt;br /&gt;var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); &lt;br /&gt;oXmlDoc.async = false; &lt;br /&gt;oXmlDoc.loadXML(resultXml.xml); &lt;br /&gt;var businessEntities = oXmlDoc.getElementsByTagName('BusinessEntity'); &lt;br /&gt;&lt;br /&gt;var oTempArray = new Array();&lt;br /&gt;oTempArray[0] = crmForm.all.mit_pickcontact.originalPicklistOptions[0];&lt;br /&gt;&lt;br /&gt;for (i=0;i &lt; businessEntities.length;i++) &lt;br /&gt;{ &lt;br /&gt;   var fullName = businessEntities[i].selectSingleNode('./q1:fullname');&lt;br /&gt;   if (fullName != null)&lt;br /&gt;  {&lt;br /&gt;      var opt = crmForm.all.mit_pickcontact.originalPicklistOptions[i+1];&lt;br /&gt;      opt.Text = fullName.text;&lt;br /&gt;      oTempArray[i+1] = opt;&lt;br /&gt;  }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;crmForm.all.new_pickcontact.Options = oTempArray;&lt;br /&gt;crmForm.all.new_pickcontact.Disabled = false;&lt;br /&gt;crmForm.all.new_pickcontact.DataValue = crmForm.all.new_pickcontact.originalSelectedIndex;&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;crmForm.all.new_pickcontact.originalPicklistOptions = crmForm.all.new_pickcontact.Options;&lt;br /&gt;crmForm.all.new_pickcontact.originalSelectedIndex = crmForm.all.new_pickcontact.selectedIndex;&lt;br /&gt;window.getAccountContacts();&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-6611609453579137297?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/6611609453579137297/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=6611609453579137297' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/6611609453579137297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/6611609453579137297'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/crm-40-preenchimento-automatico-de.html' title='&gt;&gt; CRM 4.0 - Preenchimento Automático de PickList (REVISADO)'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-1468427993297459063</id><published>2009-02-05T10:20:00.000-08:00</published><updated>2009-02-05T10:42:54.651-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Manipulação de Anexos (SDK)</title><content type='html'>A versão 4.0 do Dynamics CRM simplificou para nós, desenvolvedores, o uso de diversos recursos do SDK. Um deles é a busca e manipulação de &lt;strong&gt;Anexos&lt;/strong&gt; nas entidades do produto.&lt;br /&gt;&lt;br /&gt;Para este caso, note que em cada &lt;strong&gt;Anotação&lt;/strong&gt; (relacionada a uma entidade do CRM) existe um campo chamado &lt;strong&gt;documentbody&lt;/strong&gt; que armazena o conteúdo do arquivo anexado pelo usuário (BASE64 Format).&lt;br /&gt;&lt;br /&gt;Para demonstrar isto, segue função genérica (C#) que retorna as Anotações (de uma determinada Entidade) que contém anexos. A função retorna o conteúdo de cada anexo (pelo processo de &lt;strong&gt;Decoding&lt;/strong&gt; do .NET).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;P.S.:&lt;/strong&gt; Lembrando que a função consegue ler o conteúdo de anexos no formato do CRM (BASE64). Arquivos com formatos diferentes precisam de tratamentos específicos para leitura. Exemplo, os arquivos do Office2007, como xlsx (http://michaelmalloy.blogspot.com/2008/04/c-read-excel-2007-xlsx-files.html).&lt;br /&gt;&lt;br /&gt;Chamada da função que busca as Anotações:&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; padding:0px 15px 15px 15px; color:black;'&gt;&lt;br /&gt;            BusinessEntityCollection notes = getEntityNotes(new Guid("272526EA-ED6B-43CC-A8DC-A2965405A463"));&lt;br /&gt;&lt;br /&gt;            foreach (BusinessEntity be in notes.BusinessEntities)&lt;br /&gt;            {&lt;br /&gt;                annotation annot = be as annotation;&lt;br /&gt;                if (!string.IsNullOrEmpty(annot.documentbody))&lt;br /&gt;                {                    &lt;br /&gt;                    string attachBody = DecodeByteArryToString(annot.mimetype, annot.documentbody);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Função que busca as Anotações da Entidade:&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; padding:0px 15px 15px 15px; color:black;'&gt;&lt;br /&gt;&lt;br /&gt;        public static BusinessEntityCollection getEntityNotes(Guid entityId)&lt;br /&gt;        {&lt;br /&gt;            // Set up the CRM Service.&lt;br /&gt;            CrmAuthenticationToken token = new CrmAuthenticationToken();&lt;br /&gt;            token.AuthenticationType = 0;&lt;br /&gt;            token.OrganizationName = "OrgName";&lt;br /&gt;            CrmService service = new CrmService();&lt;br /&gt;            service.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";&lt;br /&gt;            service.CrmAuthenticationTokenValue = token;&lt;br /&gt;            service.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;&lt;br /&gt;            BusinessEntityCollection notes = null;&lt;br /&gt;&lt;br /&gt;            ConditionExpression caseCondition = new ConditionExpression();&lt;br /&gt;            caseCondition.AttributeName = "objectid";&lt;br /&gt;            caseCondition.Operator = ConditionOperator.Equal;&lt;br /&gt;            caseCondition.Values = new object[] { entityId };&lt;br /&gt;&lt;br /&gt;            FilterExpression filter = new FilterExpression();&lt;br /&gt;            filter.FilterOperator = LogicalOperator.And;&lt;br /&gt;            filter.Conditions = new ConditionExpression[] { caseCondition };&lt;br /&gt;&lt;br /&gt;            QueryExpression query = new QueryExpression();&lt;br /&gt;            query.EntityName = EntityName.annotation.ToString();&lt;br /&gt;            query.ColumnSet = new AllColumns();&lt;br /&gt;            query.Criteria = filter;&lt;br /&gt;&lt;br /&gt;            RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();&lt;br /&gt;            retrieve.Query = query;&lt;br /&gt;&lt;br /&gt;            RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse)service.Execute(retrieve);&lt;br /&gt;            notes = retrieved.BusinessEntityCollection;&lt;br /&gt;&lt;br /&gt;            return notes;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public static string DecodeByteArryToString(string mimeType, string documentbody)&lt;br /&gt;        {&lt;br /&gt;            Byte[] ByteArry = System.Convert.FromBase64String(documentbody);&lt;br /&gt;            Decoder byteArryDecoder = null;&lt;br /&gt;&lt;br /&gt;            if (mimeType.IndexOf("text/") &gt;= 0)&lt;br /&gt;            {&lt;br /&gt;                byteArryDecoder = Encoding.UTF7.GetDecoder();&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {&lt;br /&gt;                byteArryDecoder = Encoding.Unicode.GetDecoder();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            int charCount = byteArryDecoder.GetCharCount(ByteArry, 0, ByteArry.Length);&lt;br /&gt;            char[] bodyChars = new Char[charCount];&lt;br /&gt;            int charsDecodedCount = byteArryDecoder.GetChars(ByteArry, 0, ByteArry.Length, bodyChars, 0);&lt;br /&gt;            return new string(bodyChars);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-1468427993297459063?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/1468427993297459063/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=1468427993297459063' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1468427993297459063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1468427993297459063'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/crm-40-manipulacao-de-anexos-sdk.html' title='&gt;&gt; CRM 4.0 - Manipulação de Anexos (SDK)'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-8644566035296266688</id><published>2009-02-04T08:33:00.000-08:00</published><updated>2009-02-04T11:01:54.575-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - PickList Multi-Value</title><content type='html'>O objeto Picklist do CRM é um recurso interessante para montagem de listas rápidas, porém, dependendo do projeto em que está, vai ser necessário o uso de alguns recursos adicionais do objeto, como o de [multipla escolha]...Então desenvolvi um método (totalmente em JavaScript) que [transforma] o Picklist original em um [Novo], com múltipla escolha.&lt;br /&gt;&lt;br /&gt;Segue design de um Picklist [transformado]:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pnbueR6U8m8/SYnEz5S-7aI/AAAAAAAAADI/lyUSPH6GsxY/s1600-h/MultiValueCRMPickList1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298982832410914210" style="WIDTH: 381px; CURSOR: hand; HEIGHT: 34px" alt="" src="http://1.bp.blogspot.com/_pnbueR6U8m8/SYnEz5S-7aI/AAAAAAAAADI/lyUSPH6GsxY/s400/MultiValueCRMPickList1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pnbueR6U8m8/SYnE_yGxLMI/AAAAAAAAADQ/tSql3demkAU/s1600-h/MultiValueCRMPickList2.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298983036639063234" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 221px" alt="" src="http://4.bp.blogspot.com/_pnbueR6U8m8/SYnE_yGxLMI/AAAAAAAAADQ/tSql3demkAU/s400/MultiValueCRMPickList2.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pnbueR6U8m8/SYnFFEF4cEI/AAAAAAAAADY/tw5bvEina0Q/s1600-h/MultiValueCRMPickList3.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298983127366529090" style="WIDTH: 386px; CURSOR: hand; HEIGHT: 38px" alt="" src="http://4.bp.blogspot.com/_pnbueR6U8m8/SYnFFEF4cEI/AAAAAAAAADY/tw5bvEina0Q/s400/MultiValueCRMPickList3.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Como funciona a transformação&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1 - Crie normalmente seu Picklist e adicione-o no form do crm;&lt;br /&gt;&lt;br /&gt;2 - Crie um atributo Auxiliar (nvarchar,texto,100) para armazenar os valores do Picklist Multi-Value; adicione-o também no form do CRM;&lt;br /&gt;&lt;br /&gt;3 - Copie a função abaixo no OnLoad do Form do CRM. A função (createMultiValuePickList) possui os seguintes parâmetros:&lt;br /&gt;&lt;br /&gt;pickList - Informar o objeto Picklist original do CRM;&lt;br /&gt;objAux   - Informar o objeto criado no passo 2 citado acima.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;P.S.1.:&lt;/strong&gt; O Novo Picklist ficará no lugar do [objAux] e o Picklist Original ficará [oculto] no Form do CRM.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;P.S.2.:&lt;/strong&gt; Como a função [createMultiValuePickList] cria objetos [novos] no Form do CRM e não altera e/ou reutiliza qualquer recurso padrão do produto, este procedimento pode se enquadrar na forma [Suportada] de customização.&lt;br /&gt;&lt;br /&gt;Segue chamada da função:&lt;br /&gt;&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; text-align:center; padding:0px 0px 15px 15px; color:black;'&gt;&lt;br /&gt;createMultiValuePickList(crmForm.all.new_services, crmForm.all.new_services_aux);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Segue função completa:&lt;br /&gt;&lt;br /&gt;&lt;div style='font-family:Courier New; font-size:12px; background-color:#D6E8FF; padding:0px 15px 15px 15px; color:black;'&gt;&lt;br /&gt;function createMultiValuePickList(pickList, objAux)&lt;br /&gt;{&lt;br /&gt;/* Desabilitar o PickList do CRM e o campo aux que guardará os valores do Picklist Multi-Value */&lt;br /&gt;var pickLabel = document.getElementById(pickList.id + "_c");&lt;br /&gt;pickLabel.style.visibility = "hidden";&lt;br /&gt;pickList.style.width = "0px";&lt;br /&gt;objAux.style.width = "0px";&lt;br /&gt;&lt;br /&gt;/* Cria a Table principal, que conterá o Picklist e o Botão para habilitar o Picklist */&lt;br /&gt;var oMainTable = document.createElement("TABLE");&lt;br /&gt;oMainTable.style.width =  '100%';&lt;br /&gt;oMainTable.setAttribute('table-layout', 'fixed');&lt;br /&gt;/* Adiciona a Table Principal */&lt;br /&gt;objAux.insertAdjacentElement("BeforeBegin", oMainTable);&lt;br /&gt;&lt;br /&gt;var oMainTHead = document.createElement("THEAD");&lt;br /&gt;oMainTable.appendChild(oMainTHead);&lt;br /&gt;&lt;br /&gt;var input1 = document.createElement('input');&lt;br /&gt;input1.setAttribute('type', 'text');&lt;br /&gt;input1.setAttribute('name', 'input_txt');&lt;br /&gt;input1.setAttribute('id', 'input_txt');&lt;br /&gt;input1.setAttribute('readOnly', 'true');&lt;br /&gt;&lt;br /&gt;input1.onclick = function()&lt;br /&gt;{&lt;br /&gt;document.getElementById('divPicklist').style.visibility = 'hidden';&lt;br /&gt;document.getElementById('input_btn').style.backgroundImage = 'url(/_imgs/selectOn.gif)';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var input2 = document.createElement('input');&lt;br /&gt;input2.style.width =  '18px';&lt;br /&gt;input2.setAttribute('type', 'button');&lt;br /&gt;input2.setAttribute('name', 'input_btn');&lt;br /&gt;input2.setAttribute('id', 'input_btn');&lt;br /&gt;input2.style.backgroundImage = 'url(/_imgs/selectOn.gif)';&lt;br /&gt;input2.style.backgroundColor="#D6E8FF";&lt;br /&gt;input2.style.backgroundPosition="center center";&lt;br /&gt;&lt;br /&gt;input2.onclick = function()&lt;br /&gt;{&lt;br /&gt;var div1 = document.getElementById('divPicklist');&lt;br /&gt;div1.style.visibility = (div1.style.visibility=='visible' ? 'hidden' : 'visible');&lt;br /&gt;this.style.backgroundImage = (div1.style.visibility=='hidden' ? 'url(/_imgs/selectOn.gif)' : 'url(/_imgs/ico/16_succeeded.png)');&lt;br /&gt;var txt = document.getElementById('input_txt');&lt;br /&gt;txt.value='';&lt;br /&gt;objAux.value='';&lt;br /&gt;&lt;br /&gt;for(i=0; i &lt; pickList.options.length; i++)&lt;br /&gt;{&lt;br /&gt;var chk = document.getElementById('chk_' + String(pickList.options[i].value));&lt;br /&gt;if (chk)&lt;br /&gt;{&lt;br /&gt;if (chk.checked)&lt;br /&gt;{&lt;br /&gt;txt.value+=pickList.options[i].text+',';&lt;br /&gt;objAux.value += pickList.options[i].value+',';&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (txt.value.indexOf(',')&gt;0) txt.value= txt.value.substr(0, txt.value.length-1);&lt;br /&gt;if (objAux.value.indexOf(',')&gt;0) objAux.value= objAux.value.substr(0, objAux.value.length-1);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var input3 = document.createElement('input');&lt;br /&gt;input3.style.width =  '18px';&lt;br /&gt;input3.setAttribute('type', 'button');&lt;br /&gt;input3.setAttribute('name', 'input_btn2');&lt;br /&gt;input3.setAttribute('id', 'input_btn2');&lt;br /&gt;input3.style.backgroundImage = 'url(/_imgs/ico/16_L_remove.gif)';&lt;br /&gt;input3.style.backgroundColor="#D6E8FF";&lt;br /&gt;input3.style.backgroundPosition="center center";&lt;br /&gt;&lt;br /&gt;input3.onclick = function()&lt;br /&gt;{&lt;br /&gt;document.getElementById('divPicklist').style.visibility = 'hidden';&lt;br /&gt;document.getElementById('input_btn').style.backgroundImage = 'url(/_imgs/selectOn.gif)';&lt;br /&gt;document.getElementById('input_txt').value='';&lt;br /&gt;objAux.value='';&lt;br /&gt;&lt;br /&gt;for(i=0; i &lt; pickList.options.length; i++)&lt;br /&gt;{&lt;br /&gt;var chk = document.getElementById('chk_' + String(pickList.options[i].value));&lt;br /&gt;if (chk) chk.checked=false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var oRow1 = document.createElement("TR");&lt;br /&gt;var oRow2 = document.createElement("TR");&lt;br /&gt;&lt;br /&gt;var oDivRow2 = document.createElement("DIV");&lt;br /&gt;oDivRow2.setAttribute('id', 'divPicklist');&lt;br /&gt;oDivRow2.style.position = 'absolute';&lt;br /&gt;oDivRow2.style.height = '180px';&lt;br /&gt;oDivRow2.style.width = '100%';&lt;br /&gt;oDivRow2.style.border = 'solid 1px gray';&lt;br /&gt;oDivRow2.style.backgroundColor = 'white';&lt;br /&gt;oDivRow2.style.overflow = 'scroll';&lt;br /&gt;oDivRow2.style.visibility='hidden';&lt;br /&gt;&lt;br /&gt;oMainTHead.appendChild(oRow1);&lt;br /&gt;oMainTHead.appendChild(oRow2);&lt;br /&gt;&lt;br /&gt;/* 1a Coluna - TextBox */&lt;br /&gt;var oCell1 = document.createElement("TH");&lt;br /&gt;oCell1.style.width = '90%';&lt;br /&gt;oCell1.appendChild(input1);&lt;br /&gt;oRow1.appendChild(oCell1);&lt;br /&gt;&lt;br /&gt;/* 2a Coluna - Botão */&lt;br /&gt;var oCell2 = document.createElement("TH");&lt;br /&gt;oCell2.style.width = '10%';&lt;br /&gt;oCell2.appendChild(input2);&lt;br /&gt;oRow1.appendChild(oCell2);&lt;br /&gt;&lt;br /&gt;/* 3a Coluna - Botão */&lt;br /&gt;var oCell3 = document.createElement("TH");&lt;br /&gt;oCell3.style.width = '10%';&lt;br /&gt;oCell3.appendChild(input3);&lt;br /&gt;oRow1.appendChild(oCell3);&lt;br /&gt;&lt;br /&gt;/* Cria a Table que terá o conteúdo do Picklist Original */&lt;br /&gt;var oTablePick = document.createElement("TABLE");&lt;br /&gt;oTablePick.setAttribute('width', '100%');&lt;br /&gt;oTablePick.setAttribute('table-layout', 'fixed');&lt;br /&gt;&lt;br /&gt;var oTHeadPick = document.createElement("THEAD");&lt;br /&gt;oTablePick.appendChild(oTHeadPick);&lt;br /&gt;&lt;br /&gt;oDivRow2.appendChild(oTablePick);&lt;br /&gt;&lt;br /&gt;var defaultPick = crmForm.all.mit_services;&lt;br /&gt;for(i=0; i &lt; defaultPick.options.length; i++)&lt;br /&gt;{&lt;br /&gt;   oRowPick = document.createElement("TR");&lt;br /&gt;   oTHeadPick.appendChild(oRowPick);&lt;br /&gt;&lt;br /&gt;   /* 1a Coluna - CheckBox */&lt;br /&gt;   oCellPick1 = document.createElement("TH");&lt;br /&gt;   oCellPick1.setAttribute('width', '10%');&lt;br /&gt;&lt;br /&gt;   if (defaultPick.options[i].text!="")&lt;br /&gt;   {&lt;br /&gt;      var chk = document.createElement('input');&lt;br /&gt;      chk.style.border = 'none';&lt;br /&gt;      chk.type = 'checkbox';&lt;br /&gt;      chk.id = 'chk_' + String(defaultPick.options[i].value);&lt;br /&gt;      chk.name = 'chk_' + String(defaultPick.options[i].value);&lt;br /&gt;      oCellPick1.appendChild(chk);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   oRowPick.appendChild(oCellPick1);&lt;br /&gt;&lt;br /&gt;   /* 2a Coluna - Texto do PickList Original */&lt;br /&gt;   oCellPick2 = document.createElement("TH");&lt;br /&gt;   oCellPick2.setAttribute('width', '90%');&lt;br /&gt;   oCellPick2.innerHTML = defaultPick.options[i].text;&lt;br /&gt;   oRowPick.appendChild(oCellPick2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Adicionar oTablePick na 2a linha da oMainTable */&lt;br /&gt;var oCellPick1_line2 = document.createElement("TH");&lt;br /&gt;oCellPick1_line2.setAttribute('width', '90%');&lt;br /&gt;oCellPick1_line2.appendChild(oDivRow2);&lt;br /&gt;oRow2.appendChild(oCellPick1_line2);&lt;br /&gt;&lt;br /&gt;/* 2a coluna em branco */&lt;br /&gt;var oCellPick2_line2 = document.createElement("TH");&lt;br /&gt;oCellPick2_line2.style.width = '10%';&lt;br /&gt;oRow2.appendChild(oCellPick2_line2);&lt;br /&gt;&lt;br /&gt;/* 3a coluna em branco */&lt;br /&gt;var oCellPick3_line2 = document.createElement("TH");&lt;br /&gt;oCellPick3_line2.style.width = '10%';&lt;br /&gt;oRow2.appendChild(oCellPick3_line2);&lt;br /&gt;&lt;br /&gt;/* DataBind do componente */&lt;br /&gt;if (objAux.value.indexOf(",")&gt;0)&lt;br /&gt;{&lt;br /&gt;   var txt_width = String(input1.clientWidth) + 'px';&lt;br /&gt;   var aBind = objAux.value.split(",");&lt;br /&gt;   for(i=0; i &lt;= aBind.length; i++)&lt;br /&gt;   {&lt;br /&gt;      if (defaultPick.options[aBind[i]])&lt;br /&gt;      {&lt;br /&gt;         input1.value += defaultPick.options[aBind[i]].text + ',';&lt;br /&gt;         var chk = document.getElementById('chk_' + String(aBind[i]));&lt;br /&gt;         if (chk) chk.checked=true;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   if (input1.value.indexOf(',')&gt;0)&lt;br /&gt;   {&lt;br /&gt;      input1.value= input1.value.substr(0, input1.value.length-1);&lt;br /&gt;      input1.style.width = txt_width;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-8644566035296266688?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/8644566035296266688/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=8644566035296266688' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/8644566035296266688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/8644566035296266688'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/02/crm-40-picklist-multi-value.html' title='&gt;&gt; CRM 4.0 - PickList Multi-Value'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_pnbueR6U8m8/SYnEz5S-7aI/AAAAAAAAADI/lyUSPH6GsxY/s72-c/MultiValueCRMPickList1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-6192642811762550869</id><published>2009-01-29T05:26:00.000-08:00</published><updated>2009-01-30T07:00:21.099-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Relationship via SDK</title><content type='html'>Já tiveram a necessidade de relacionar duas entidades, porém o CRM não permite da forma que deseja?&lt;br /&gt;&lt;br /&gt;Por exemplo, pode-se relacionar no CRM a entidade [QuoteDetail] a outras entidades, porém somente via [N:1] ou [N:N]...&lt;strong&gt;mas não via [1:N]&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Porque isto é relevante? Imagine que deseja ter, na tela de [Produtos da Cotação], [Despesas] associadas a cada Item. Via Customização Padrão do CRM não vai conseguir fazer isto! Pois não aparece na tela do [Produto da Cotação] o [Menu Vertical] de links de relacionamentos com outras entidades (comum a maioria das entidades).&lt;br /&gt;&lt;br /&gt;O que se aprende neste artigo:&lt;br /&gt;&lt;br /&gt;- Funcionamento de [Relationships] do CRM;&lt;br /&gt;- Como reaproveitar chamadas de URL do produto;&lt;br /&gt;- Usar o SDK para, programaticamente, adicionar e remover relacionamento entre entidades (classes AssociateEntitiesRequest e DisassociateEntitiesRequest).&lt;br /&gt;&lt;br /&gt;A solução:&lt;br /&gt;&lt;br /&gt;1 - Criar o relacionamento [N:N], para gerar o link entre as entidades [QuoteDetail] e [qq outra];&lt;br /&gt;&lt;br /&gt;2 - Adicionar um [iFrame] do CRM, e na URL, adicionar o seguinte:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pnbueR6U8m8/SYHC_AhrZpI/AAAAAAAAAC4/3f-VX6xIM6k/s1600-h/urlAreas.GIF"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 64px;" src="http://3.bp.blogspot.com/_pnbueR6U8m8/SYHC_AhrZpI/AAAAAAAAAC4/3f-VX6xIM6k/s400/urlAreas.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5296729024493217426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;É claro que a URL deverá ser preenchida programaticamente, via [OnLoad] do Form do CRM, pois notamos na URL, parâmetros como [oId] que vai representar o [Guid] da entidade que [contém] o iFrame, o parâmetro [oType], representando o código da entidade, e por fim, [tabSet] que representa o nome do relacionamento entre as entidades.&lt;br /&gt;&lt;br /&gt;No meu exemplo acima estou mostrando no iFrame a [Lista de Despesas] associada a um [Produto da Cotação].&lt;br /&gt;&lt;br /&gt;Desta forma, consigo mostrar o relacionamento como se fosse [1:N].&lt;br /&gt;&lt;br /&gt;Porém, o trabalho não acabou! Se notar, no cabeçalho do Grid que está sendo mostrado no iFrame, possui apenas o botão [Adicionar &lt;entidade&gt; Existentes]...o que é inviável, pois queremos simular o processo [1:N], na qual apareceria o botão [Novo &lt;entidade&gt;].&lt;br /&gt;&lt;br /&gt;Para resolver isto, crie um novo botão customizado, alterando o Isv.Config, no meu caso, para a entidade [Despesa], adicionando um JavaScript que:&lt;br /&gt;&lt;br /&gt;1 - Captura o Id da entidade principal (no meu exemplo, o Produto da Cotação);&lt;br /&gt;2 - Criar um atributo para guardar o valor do ID do passo 1. No meu exemplo eu guardo o ID do [Produto da Cotação] em um campo criado na Entidade [Despesas];&lt;br /&gt;3 - Prepare a url que simule a criação do registro;&lt;br /&gt;4 - No [OnLoad] do Form (no meu exemplo, de Despesas), recupere o Id capturado no passo 1.&lt;br /&gt;&lt;br /&gt;Abaixo segue códigos para os passos citados:&lt;br /&gt;&lt;br /&gt;- Adicionando o botão no Isv.Config do CRM4:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pnbueR6U8m8/SYHB7tzARxI/AAAAAAAAACw/qBzKrILDEIk/s1600-h/IsvConfigButtonCrm4.GIF"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 330px;" src="http://2.bp.blogspot.com/_pnbueR6U8m8/SYHB7tzARxI/AAAAAAAAACw/qBzKrILDEIk/s400/IsvConfigButtonCrm4.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5296727868414379794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- No [OnLoad] do Form do CRM, JavaScript do passo 3:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_pnbueR6U8m8/SYHEXAhFByI/AAAAAAAAADA/PCnTKZp-rZU/s1600-h/jsOnLoadForm.GIF"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 239px;" src="http://1.bp.blogspot.com/_pnbueR6U8m8/SYHEXAhFByI/AAAAAAAAADA/PCnTKZp-rZU/s400/jsOnLoadForm.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5296730536319190818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E finalmente, criar o código SDK (criar uma dll de PLUGIN - PostCreate e PostDelete) para criar o Link entre as entidades (no meu exemplo, entre QuoteDetail e [outra entidade]):&lt;br /&gt;&lt;br /&gt;private static void fnEntityRelationShip(Boolean add)&lt;br /&gt;{&lt;br /&gt; // Set up the CRM Service.&lt;br /&gt; CrmAuthenticationToken token = new CrmAuthenticationToken();&lt;br /&gt; token.AuthenticationType = 0;&lt;br /&gt; token.OrganizationName = "OrgName";&lt;br /&gt;&lt;br /&gt; CrmService service = new CrmService();&lt;br /&gt; service.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";&lt;br /&gt; service.CrmAuthenticationTokenValue = token;&lt;br /&gt; service.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;&lt;br /&gt; if (add)&lt;br /&gt; {&lt;br /&gt;  // Create an AssociateEntities request.&lt;br /&gt;  AssociateEntitiesRequest request = new AssociateEntitiesRequest();&lt;br /&gt;&lt;br /&gt;  request.Moniker1 = new Moniker();&lt;br /&gt;  request.Moniker1.Id = new Guid("a1db8742-a3ec-dd11-a193-0015f2044350");&lt;br /&gt;  request.Moniker1.Name = EntityName.quotedetail.ToString();&lt;br /&gt;&lt;br /&gt;  request.Moniker2 = new Moniker();&lt;br /&gt;  request.Moniker2.Id = new Guid("21CA2C7C-7989-DD11-B2DA-0015F2044350");&lt;br /&gt;  request.Moniker2.Name = EntityName.mit_despesa.ToString();&lt;br /&gt;&lt;br /&gt;  // Set the relationship name to associate on.&lt;br /&gt;  request.RelationshipName = "mit_quotedetail_mit_despesa";&lt;br /&gt;&lt;br /&gt;  // Execute the request.&lt;br /&gt;  service.Execute(request);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  // Create a request.&lt;br /&gt;  DisassociateEntitiesRequest request = new DisassociateEntitiesRequest();&lt;br /&gt;&lt;br /&gt;  // Assign the request a moniker for both entities that need to be disassociated.&lt;br /&gt;  request.Moniker1 = new Moniker();&lt;br /&gt;  request.Moniker1.Id = new Guid("a1db8742-a3ec-dd11-a193-0015f2044350");&lt;br /&gt;  request.Moniker1.Name = EntityName.quotedetail.ToString();&lt;br /&gt;&lt;br /&gt;  request.Moniker2 = new Moniker();&lt;br /&gt;  request.Moniker2.Id = new Guid("21CA2C7C-7989-DD11-B2DA-0015F2044350");&lt;br /&gt;  request.Moniker2.Name = EntityName.mit_despesa.ToString();&lt;br /&gt;&lt;br /&gt;  // Set the relationship name that associates the two entities.&lt;br /&gt;  request.RelationshipName = "mit_quotedetail_mit_despesa";&lt;br /&gt;&lt;br /&gt;  // Execute the request.&lt;br /&gt;  DisassociateEntitiesResponse response = (DisassociateEntitiesResponse)service.Execute(request);&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-6192642811762550869?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/6192642811762550869/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=6192642811762550869' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/6192642811762550869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/6192642811762550869'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2009/01/crm-40-relationship-via-sdk.html' title='&gt;&gt; CRM 4.0 - Relationship via SDK'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pnbueR6U8m8/SYHC_AhrZpI/AAAAAAAAAC4/3f-VX6xIM6k/s72-c/urlAreas.GIF' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-7945533018936011852</id><published>2008-12-19T07:39:00.000-08:00</published><updated>2008-12-19T08:19:48.861-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - AJAX + Preenchimento Automático de Lookup</title><content type='html'>Já tiveram a necessidade de preenchimento automático de um campo &lt;em&gt;Lookup&lt;/em&gt;, baseado na escolha de alguma informação em outro campo? Somente em JavaScript?&lt;br /&gt;&lt;br /&gt;Segue código template que ilustra isto, de forma que, ao selecionar uma Conta na Oportunidade, o sistema atualize a Lista de Preço da Oportunidade (existente na Conta).&lt;br /&gt;&lt;br /&gt;Note que o código (JavaScript) utiliza o &lt;strong&gt;Web Services do CRM&lt;/strong&gt;, método &lt;strong&gt;Retrieve &lt;/strong&gt;para busca de dados de uma entidade, baseado no ID.&lt;br /&gt;&lt;br /&gt;No [OnChange] do campo [Cliente Provável] da Oportunidade, adicionar o template abaixo:&lt;br /&gt;&lt;br /&gt;P.S.: Substitua o nome [CAMPO_RETORNO] pelo nome do campo que representa o ID da Lista de Preço da Conta.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;---- ONCHANGE FIELD ACTION ----&lt;/strong&gt;&lt;br /&gt;getAccountPriceLevel();&lt;br /&gt;&lt;br /&gt;function getAccountPriceLevel()&lt;br /&gt;{&lt;br /&gt; var server = window.location.host;&lt;br /&gt; xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt; xmlhttp.open("POST", "http://" + server + "/mscrmservices/2007/crmservice.asmx", true);&lt;br /&gt; xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");&lt;br /&gt; xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Retrieve");&lt;br /&gt;&lt;br /&gt; var soapBody = "&amp;lt;soap:Body&amp;gt;&amp;lt;Retrieve xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\"&amp;gt;&amp;lt;entityName&amp;gt;account&amp;lt;/entityName&amp;gt;";&lt;br /&gt; soapBody += "&amp;lt;id&amp;gt;" + crmForm.all.customerid.DataValue[0].id + "&amp;lt;/id&amp;gt;";&lt;br /&gt; soapBody +=  "&amp;lt;columnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\"&amp;gt;&amp;lt;q1:Attributes&amp;gt;";&lt;br /&gt; soapBody += "&amp;lt;q1:Attribute&amp;gt;CAMPO_RETORNO&amp;lt;/q1:Attribute&amp;gt;";&lt;br /&gt; soapBody += "&amp;lt;/q1:Attributes&amp;gt;&amp;lt;/columnSet&amp;gt;";&lt;br /&gt; soapBody += "&amp;lt;/Retrieve&amp;gt;&amp;lt;/soap:Body&amp;gt;";&lt;br /&gt;&lt;br /&gt; var soapXml = "&amp;lt;soap:Envelope " +&lt;br /&gt; "xmlns: soap='http://schemas.xmlsoap.org/soap/envelope/' "+&lt;br /&gt; "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "+&lt;br /&gt; "xmlns:xsd='http://www.w3.org/2001/XMLSchema'&amp;gt;";&lt;br /&gt; soapXml += GenerateAuthenticationHeader();&lt;br /&gt; soapXml += soapBody;&lt;br /&gt; soapXml += "&amp;lt;/soap:Envelope&amp;gt;";&lt;br /&gt;&lt;br /&gt; xmlhttp.onreadystatechange = StateChangeAccountPriceLevel;&lt;br /&gt; xmlhttp.send(soapXml);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function StateChangeAccountPriceLevel()&lt;br /&gt;{&lt;br /&gt;  if (xmlhttp.readyState == 4)&lt;br /&gt;  {&lt;br /&gt;    var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes;&lt;br /&gt;    var priceLevelID = oNodes[0].text;&lt;br /&gt;&lt;br /&gt;    if (crmForm.all.pricelevelid.DataValue == null)&lt;br /&gt;    {&lt;br /&gt;      var lookupData = new Array();&lt;br /&gt;      var lookupItem= new Object();&lt;br /&gt;      lookupItem.id = priceLevelID;&lt;br /&gt;      lookupItem.typename = 'pricelevel';&lt;br /&gt;      lookupItem.name = 'Lista de Preço Padrão';&lt;br /&gt;      lookupData[0] = lookupItem;&lt;br /&gt;      crmForm.all.pricelevelid.DataValue = lookupData;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-7945533018936011852?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/7945533018936011852/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=7945533018936011852' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7945533018936011852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7945533018936011852'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-ajax-preenchimento-automtico-de.html' title='&gt;&gt; CRM 4.0 - AJAX + Preenchimento Automático de Lookup'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-276002062041092794</id><published>2008-12-18T10:55:00.000-08:00</published><updated>2008-12-18T11:03:12.519-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Data Migration Manager</title><content type='html'>[Data Migration Manager] - desenvolvido para transporte de dados em massa de uma fonte de dados para a base do CRM.&lt;br /&gt;&lt;br /&gt;Segue algumas orientações para uso do DMM:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1 - Demostração&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Veja este "webcast" que ensina o uso do DMM - &lt;a href="http://channel9.msdn.com/posts/jodonnell/Microsoft-Dynamics-CRM-40--Data-Migration-Manager-with-John-ODonnell/"&gt;http://channel9.msdn.com/posts/jodonnell/Microsoft-Dynamics-CRM-40--Data-Migration-Manager-with-John-ODonnell/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2 - Restrições&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;- NÃO instale o DMM no Servidor do CRM (DMM só roda no [Windows Vista] ou [Windows XP]);&lt;br /&gt;- Alguns desenvs instalam o DMM no Servidor do [SQL SERVER - 32 bits];&lt;br /&gt;&lt;br /&gt;- Se o banco de dados for de [64 bits] o DMM Não vai funcionar;&lt;br /&gt;&lt;br /&gt;- Use uma máquina Client, 32 bits com [local SQL Express] para o DataBase de Migração;&lt;br /&gt;- Instale o DMM escolhendo a opção do banco de dados [SQL SERVER 2005 EXPRESS EDITION];&lt;br /&gt;&lt;br /&gt;- Instale e rode o DMM com um usuário [local admin] e [CRM Admin]. Isto é importante porque o DMM usa o Web Services do CRM! Inclusive o DMM só pode ser usado pelo usuário que o instalou.&lt;br /&gt;&lt;br /&gt;- DMM não pode ser usado enquanto o [Microsoft Office Outlook] estiver rodando;&lt;br /&gt;&lt;br /&gt;Fonte adicional: &lt;a href="http://rc.crm.dynamics.com/rc/regcont/en_us/Live/help/How_dmw_install.htm"&gt;http://rc.crm.dynamics.com/rc/regcont/en_us/Live/help/How_dmw_install.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-276002062041092794?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/276002062041092794/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=276002062041092794' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/276002062041092794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/276002062041092794'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-data-migration-manager.html' title='&gt;&gt; CRM 4.0 - Data Migration Manager'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-134385372863237468</id><published>2008-12-16T10:07:00.000-08:00</published><updated>2008-12-16T10:22:55.556-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - "Limitações" no Acompanhamento de Atividades</title><content type='html'>Apesar da flexibilidade no uso de Acompanhamento de Atividades no CRM (&lt;a href="http://gtezini.blogspot.com/2008/12/crm-40-boto-acompanhamento-de.html"&gt;http://gtezini.blogspot.com/2008/12/crm-40-boto-acompanhamento-de.html&lt;/a&gt;) existem algumas "limitações" que impedem o uso deste recurso.&lt;br /&gt;&lt;br /&gt;Por exemplo, se você tentar efetuar um Acompanhamento (do tipo Tarefa) para uma atividade do tipo [Telefonema], atividade esta pertencente a uma [Campanha Rápida], ao salvar o acompanhamento, receberá a seguinte mensagem do CRM:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;"[Campanhas rápidas] não podem ter [tarefa] como uma [atividade de acompanhamento]" &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;O que isto significa?&lt;br /&gt;&lt;br /&gt;Seguindo o mesmo raciocínio do [KB 909824] que explica a impossibilidade de criação de [acompanhamento de atividade do tipo tarefa] para uma [atividade do tipo email]...&lt;br /&gt;&lt;br /&gt;Podemos explicar este caso da seguinte forma:&lt;br /&gt;&lt;br /&gt;"Quando você tenta criar um [acompanhamento do tipo tarefa], o Microsoft CRM configura o campo "Regarding" da [atividade de acompanhamento do tipo tarefa]. Para este campo, o Microsoft CRM tenta usar o valor do campo "Regarding" da [atividade de telefonema]. Contudo, não existe um relacionamento entre o [acompanhamento do tipo tarefa] e a [campanha rápida]."&lt;br /&gt;&lt;br /&gt;Por este motivo aparece a msg de restrição.&lt;br /&gt;&lt;br /&gt;Solução MS:&lt;br /&gt;&lt;br /&gt;Use os seguintes tipos de atividades para acompanhamento:&lt;br /&gt;&lt;br /&gt;- Telefonema;&lt;br /&gt;- Carta;&lt;br /&gt;- Fax;&lt;br /&gt;- E-mail;&lt;br /&gt;- Apontamento.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-134385372863237468?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/134385372863237468/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=134385372863237468' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/134385372863237468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/134385372863237468'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-limitaes-no-acompanhamento-de.html' title='&gt;&gt; CRM 4.0 - &quot;Limitações&quot; no Acompanhamento de Atividades'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-1076165971146636152</id><published>2008-12-16T09:57:00.000-08:00</published><updated>2008-12-16T10:05:46.733-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Botão Acompanhamento de Atividades</title><content type='html'>Dica rápida...&lt;br /&gt;&lt;br /&gt;Para que serve o botão de "Acompanhamento" existente nas telas de detalhes dos vários tipos de atividades do CRM?&lt;br /&gt;&lt;br /&gt;O Acompanhamento (ou FollowUp) também é uma atividade no CRM, dos tipos tarefa, email, telefonema, etc. É um recurso que faz parte do Painel "Assistente de Formulário" do CRM.&lt;br /&gt;&lt;br /&gt;Por exemplo, você pode criar uma atividade de serviço de acompanhamento futuro. Imagine uma empresa que acabou de concluir a troca de óleo para um cliente; você pode criar uma nova atividade de serviço para outra troca de óleo em seis meses, de forma a "associar" uma tarefa em outra.&lt;br /&gt;&lt;br /&gt;Veja este exemplo: &lt;a href="http://rc.crm.dynamics.com/rc/regcont/pt_br/op/articles/followup.aspx"&gt;http://rc.crm.dynamics.com/rc/regcont/pt_br/op/articles/followup.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-1076165971146636152?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/1076165971146636152/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=1076165971146636152' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1076165971146636152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/1076165971146636152'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-boto-acompanhamento-de.html' title='&gt;&gt; CRM 4.0 - Botão Acompanhamento de Atividades'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-4459253110784958726</id><published>2008-12-12T07:13:00.001-08:00</published><updated>2008-12-12T09:53:46.083-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Revisar Quota Programaticamente</title><content type='html'>Existem alguns desenvolvimentos para o Dynamics CRM (via SDK) que poderíamos categorizar como sendo "não tão óbvios". Por exemplo, não existem exemplos completos para, programaticamente, Revisar uma Quota.&lt;br /&gt;&lt;br /&gt;Juntando o "quebra-cabeça" para este caso, segue abaixo função Template.&lt;br /&gt;&lt;br /&gt;public string ReviseQuote(string id)&lt;br /&gt;{&lt;br /&gt; // Set up the CRM Service.&lt;br /&gt; CrmAuthenticationToken token = new CrmAuthenticationToken();&lt;br /&gt; token.AuthenticationType = 0; &lt;br /&gt; token.OrganizationName = "OrgName";&lt;br /&gt;&lt;br /&gt; CrmService CrmWebService = new CrmService();&lt;br /&gt; CrmWebService.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";&lt;br /&gt; CrmWebService.CrmAuthenticationTokenValue = token;&lt;br /&gt; CrmWebService.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;&lt;br /&gt; string idRet = string.Empty;&lt;br /&gt; Boolean CloseQuoteRequestOk = true;&lt;br /&gt;&lt;br /&gt; // 1 - CLOSE QUOTE ACTIVITY&lt;br /&gt;&lt;br /&gt;        crmSdk.BusinessEntity beQuote = CrmWebService.Retrieve(crmSdk.EntityName.quote.ToString(), new Guid(id), new crmSdk.AllColumns());&lt;br /&gt;        crmSdk.quote _quote = beQuote as crmSdk.quote;&lt;br /&gt;&lt;br /&gt; if (_quote == null) return string.Empty;&lt;br /&gt;&lt;br /&gt; quoteclose _quoteClose = new quoteclose();&lt;br /&gt; Lookup _lookUp = new Lookup();&lt;br /&gt; _lookUp.type = EntityName.quote.ToString();&lt;br /&gt; _lookUp.Value = new Guid(id);&lt;br /&gt; CrmDateTime _crmDate1 = new CrmDateTime();&lt;br /&gt; CrmDateTime _crmDate2 = new CrmDateTime();&lt;br /&gt; _crmDate1.Value = new DateTime(1999, 12, 31, 23, 0, 0).ToString("u");&lt;br /&gt; _crmDate2.Value = DateTime.Now.ToString("s");&lt;br /&gt; _quoteClose.quoteid = _lookUp;&lt;br /&gt; _quoteClose.subject = "Oferta Fechada (Revisada) " + _quote.quotenumber;&lt;br /&gt; _quoteClose.quotenumber = _quote.quotenumber;&lt;br /&gt; _quoteClose.revision = _quote.revisionnumber;&lt;br /&gt; _quoteClose.actualstart = _crmDate1;&lt;br /&gt; _quoteClose.actualend = _crmDate2;&lt;br /&gt; CloseQuoteRequest closeQuoteRequest = new CloseQuoteRequest();&lt;br /&gt; closeQuoteRequest.QuoteClose = _quoteClose;&lt;br /&gt; closeQuoteRequest.Status = 7; // Revised&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;  CrmWebService.Execute(closeQuoteRequest);&lt;br /&gt; }&lt;br /&gt; catch (System.Web.Services.Protocols.SoapException ex)&lt;br /&gt; {&lt;br /&gt;  CloseQuoteRequestOk = false;&lt;br /&gt;  System.Diagnostics.EventLog.WriteEntry("Application", "CloseQuoteRequest ERROR =&gt; QuoteID: [" + id + "] / Message: " + ex.Detail.InnerText);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if (!CloseQuoteRequestOk) return string.Empty;&lt;br /&gt;&lt;br /&gt; // 2 - REVISE QUOTE&lt;br /&gt; ReviseQuoteRequest reviseReq = new ReviseQuoteRequest();&lt;br /&gt; ColumnSet columns = new ColumnSet();&lt;br /&gt; columns.Attributes = new string[] { "quoteid" };&lt;br /&gt; reviseReq.ColumnSet = columns;&lt;br /&gt; reviseReq.QuoteId = new Guid(id);&lt;br /&gt; reviseReq.ReturnDynamicEntities = false;&lt;br /&gt; ReviseQuoteResponse reviseResp = null;&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;  reviseResp = (ReviseQuoteResponse)CrmWebService.Execute(reviseReq);&lt;br /&gt;  idRet = "{" + (reviseResp.BusinessEntity as quote).quoteid.Value.ToString().ToUpper() + "}";&lt;br /&gt; }&lt;br /&gt; catch (System.Web.Services.Protocols.SoapException ex)&lt;br /&gt; {&lt;br /&gt;  idRet = string.Empty;&lt;br /&gt;  System.Diagnostics.EventLog.WriteEntry("Application", "ReviseQuoteRequest ERROR =&gt; QuoteID: [" + id + "] / Message: " + ex.Detail.InnerText);&lt;br /&gt; }&lt;br /&gt; return idRet;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-4459253110784958726?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/4459253110784958726/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=4459253110784958726' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4459253110784958726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4459253110784958726'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-revisar-quota-programaticamente.html' title='&gt;&gt; CRM 4.0 - Revisar Quota Programaticamente'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-2438910651802809458</id><published>2008-12-10T07:22:00.001-08:00</published><updated>2009-03-23T13:05:24.266-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Envio de Email Template (com anexos)</title><content type='html'>Segue código &lt;strong&gt;completo&lt;/strong&gt; para envio de &lt;strong&gt;Email Template&lt;/strong&gt;, com anexos.&lt;br /&gt;&lt;br /&gt;A função &lt;strong&gt;SendEmailTemplate&lt;/strong&gt; recebe como parâmetros o número, nome e ID da entidade como referência para o email (campo "referente a"), a descrição do Template do CRM a ser usado para envio do email, para quais usuários enviar e os anexos.&lt;br /&gt;&lt;br /&gt;&lt;div style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; FONT-SIZE: 12px; PADDING-BOTTOM: 15px; COLOR: black; PADDING-TOP: 0px; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #d6e8ff"&gt;&lt;br /&gt;public static string SendEmailTemplate(int otc, string CrmEntityName, Guid oID, string templateTitle, string[] aUser, string[] aFiles)&lt;br /&gt;{&lt;br /&gt; // Set up the CRM Service.&lt;br /&gt; CrmAuthenticationToken token = new CrmAuthenticationToken();&lt;br /&gt; token.AuthenticationType = 0; &lt;br /&gt; token.OrganizationName = "OrgName";&lt;br /&gt;  &lt;br /&gt; CrmService CrmWebService = new CrmService();&lt;br /&gt; CrmWebService.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";&lt;br /&gt; CrmWebService.CrmAuthenticationTokenValue = token;&lt;br /&gt; CrmWebService.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;&lt;br /&gt; Guid emailTemplateID = getTemplate(CrmWebService, otc, templateTitle);&lt;br /&gt;&lt;br /&gt; if (emailTemplateID.Equals(Guid.Empty))&lt;br /&gt; {&lt;br /&gt;  string err = "Não foi possível localizar o Email template ";&lt;br /&gt;  err += "com a palavra chave [" + templateTitle + "] para a entidade [" + otc.ToString() + "].";&lt;br /&gt;  return err;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; crmSdk.WhoAmIRequest userRequest = new crmSdk.WhoAmIRequest();&lt;br /&gt; crmSdk.WhoAmIResponse userResponse = (crmSdk.WhoAmIResponse)CrmWebService.Execute(userRequest);&lt;br /&gt;&lt;br /&gt; crmSdk.BusinessEntity beSystemUser = CrmWebService.Retrieve(crmSdk.EntityName.systemuser.ToString(), userResponse.UserId, new crmSdk.AllColumns());&lt;br /&gt; crmSdk.systemuser _systemuser = beSystemUser as crmSdk.systemuser;&lt;br /&gt;&lt;br /&gt; if (_systemuser.internalemailaddress == null)&lt;br /&gt; {&lt;br /&gt;  string err = "Seu usuário, no CRM, não possui EMAIL cadastrado (Email Primário).";&lt;br /&gt;  return err;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; crmSdk.Owner _owner = new crmSdk.Owner();&lt;br /&gt; _owner.type = crmSdk.EntityName.systemuser.ToString();&lt;br /&gt; _owner.Value = userResponse.UserId;&lt;br /&gt;&lt;br /&gt; // Instantiate the Template as an EMAIL Object.&lt;br /&gt; crmSdk.InstantiateTemplateRequest instTemplate = new crmSdk.InstantiateTemplateRequest();&lt;br /&gt; instTemplate.TemplateId = emailTemplateID;&lt;br /&gt; instTemplate.ObjectId = oID;&lt;br /&gt; instTemplate.ObjectType = CrmEntityName;&lt;br /&gt; crmSdk.InstantiateTemplateResponse instTemplateResponse = null;&lt;br /&gt;&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;  instTemplateResponse = (crmSdk.InstantiateTemplateResponse)CrmWebService.Execute(instTemplate);&lt;br /&gt; }&lt;br /&gt; catch (System.Web.Services.Protocols.SoapException ex)&lt;br /&gt; {&lt;br /&gt;  return "InstantiateTemplateResponse Error - " + ex.Detail.InnerText;&lt;br /&gt; }&lt;br /&gt; catch (Exception ex)&lt;br /&gt; {&lt;br /&gt;  return "InstantiateTemplateResponse Error - " + ex.Message;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; //Convert the returned entity to an email entity, this is really just the merged template body&lt;br /&gt; crmSdk.email emailFromTemplate = (crmSdk.email)instTemplateResponse.BusinessEntityCollection.BusinessEntities[0];&lt;br /&gt;&lt;br /&gt; //Add Recipients to the email&lt;br /&gt; CrmUtil.crmSdk.activityparty partyFROM = new CrmUtil.crmSdk.activityparty();&lt;br /&gt; partyFROM.partyid = new CrmUtil.crmSdk.Lookup();&lt;br /&gt; partyFROM.partyid.type = CrmUtil.crmSdk.EntityName.systemuser.ToString();&lt;br /&gt; partyFROM.partyid.Value = userResponse.UserId;&lt;br /&gt;&lt;br /&gt; crmSdk.activityparty[] aParties = new crmSdk.activityparty[aUser.Length];&lt;br /&gt;&lt;br /&gt; int loop = 0;&lt;br /&gt;&lt;br /&gt; for (int j = 0; j &lt; aUser.Length; j++)&lt;br /&gt; {&lt;br /&gt;  aParties[loop] = new crmSdk.activityparty();&lt;br /&gt;  aParties[loop].partyid = new crmSdk.Lookup();&lt;br /&gt;  aParties[loop].partyid.type = crmSdk.EntityName.systemuser.ToString();&lt;br /&gt;  aParties[loop].partyid.Value = new Guid(aUser[j]);&lt;br /&gt;  loop++;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; emailFromTemplate.from = new crmSdk.activityparty[] { partyFROM };&lt;br /&gt; emailFromTemplate.to = aParties;&lt;br /&gt; emailFromTemplate.ownerid = _owner;&lt;br /&gt; emailFromTemplate.regardingobjectid = new crmSdk.Lookup();&lt;br /&gt; emailFromTemplate.regardingobjectid.type = CrmEntityName;&lt;br /&gt; emailFromTemplate.regardingobjectid.Value = oID;&lt;br /&gt;&lt;br /&gt; // Create the Email&lt;br /&gt; crmSdk.TargetCreateEmail targetCreate = new crmSdk.TargetCreateEmail();&lt;br /&gt; targetCreate.Email = emailFromTemplate;&lt;br /&gt; crmSdk.CreateRequest request = new crmSdk.CreateRequest();&lt;br /&gt; request.Target = targetCreate;&lt;br /&gt; crmSdk.CreateResponse response = null;&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;  response = (crmSdk.CreateResponse)CrmWebService.Execute(request);&lt;br /&gt; }&lt;br /&gt; catch (System.Web.Services.Protocols.SoapException ex)&lt;br /&gt; {&lt;br /&gt;  return "TargetCreateEmail Error - " + ex.Detail.InnerText;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Add Attachments&lt;br /&gt; string msgRet = AddAttachments(response.id, aFiles);&lt;br /&gt; if (!string.IsNullOrEmpty(msgRet)) return msgRet;&lt;br /&gt;&lt;br /&gt; // Send Email&lt;br /&gt; crmSdk.SendEmailRequest req = new crmSdk.SendEmailRequest();&lt;br /&gt; req.EmailId = response.id;&lt;br /&gt; req.TrackingToken = "";&lt;br /&gt; req.IssueSend = true;&lt;br /&gt; crmSdk.SendEmailResponse res = null;&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;  res = (crmSdk.SendEmailResponse)CrmWebService.Execute(req);&lt;br /&gt; }&lt;br /&gt; catch (System.Web.Services.Protocols.SoapException ex)&lt;br /&gt; {&lt;br /&gt;  return "SendEmailRequest - " + ex.Detail.InnerText;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return "Email criado com sucesso.";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static Guid getTemplate(crmSdk.CrmService CrmWebService, int otc, string templateTitle)&lt;br /&gt;{&lt;br /&gt; crmSdk.QueryExpression _Query = new crmSdk.QueryExpression();&lt;br /&gt; _Query.EntityName = crmSdk.EntityName.template.ToString();&lt;br /&gt; _Query.ColumnSet = new crmSdk.AllColumns();&lt;br /&gt;&lt;br /&gt; crmSdk.ConditionExpression _ce1 = new crmSdk.ConditionExpression();&lt;br /&gt; crmSdk.ConditionExpression _ce2 = new crmSdk.ConditionExpression();&lt;br /&gt;&lt;br /&gt; _ce1.AttributeName = "templatetypecode";&lt;br /&gt; _ce1.Operator = crmSdk.ConditionOperator.Equal;&lt;br /&gt; _ce1.Values = new object[] { otc };&lt;br /&gt;&lt;br /&gt; _ce2.AttributeName = "title";&lt;br /&gt; _ce2.Operator = crmSdk.ConditionOperator.Like;&lt;br /&gt; _ce2.Values = new object[] { "%" + templateTitle + "%" };&lt;br /&gt;&lt;br /&gt; crmSdk.FilterExpression _FilterExpression = new crmSdk.FilterExpression();&lt;br /&gt; _FilterExpression.FilterOperator = crmSdk.LogicalOperator.And;&lt;br /&gt; _FilterExpression.Conditions = new crmSdk.ConditionExpression[] { _ce1, _ce2 };&lt;br /&gt;&lt;br /&gt; _Query.Criteria = _FilterExpression;&lt;br /&gt; crmSdk.BusinessEntityCollection _Bec = CrmWebService.RetrieveMultiple(_Query);&lt;br /&gt;&lt;br /&gt; Guid gResult = Guid.Empty;&lt;br /&gt;&lt;br /&gt; if (_Bec.BusinessEntities.Length &gt; 0)&lt;br /&gt; {&lt;br /&gt;  crmSdk.template oTemplate = _Bec.BusinessEntities[0] as crmSdk.template;&lt;br /&gt;  gResult = oTemplate.templateid.Value;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return gResult;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static string AddAttachments(crmSdk.CrmService CrmWebService, Guid emailID, string[] aFiles)&lt;br /&gt;{&lt;br /&gt; string retMsg = string.Empty;&lt;br /&gt; string sServerPath = HttpContext.Current.Server.MapPath(@"\");&lt;br /&gt; sServerPath = sServerPath.Replace(@"\", "||");&lt;br /&gt;&lt;br /&gt; for (int i = 0; i &lt; aFiles.Length; i++)&lt;br /&gt; {&lt;br /&gt;  string fileNameCRM = aFiles[i];&lt;br /&gt;  RemoveSpecialChars(ref fileNameCRM);&lt;br /&gt;&lt;br /&gt;  string file = sServerPath + @"UploadFiles\\" + aFiles[i];&lt;br /&gt;  string Newfile = sServerPath + @"UploadFiles\\" + fileNameCRM;&lt;br /&gt;&lt;br /&gt;  file = file.Replace("||", "\\\\");&lt;br /&gt;  Newfile = Newfile.Replace("||", "\\\\");&lt;br /&gt;&lt;br /&gt;  string additionalError = "\nTentando adicionar anexo: " + Newfile;&lt;br /&gt;&lt;br /&gt;  FileInfo info = new FileInfo(file);&lt;br /&gt;  string sExtension = info.Extension;&lt;br /&gt;&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;   string fileCompare1 = aFiles[i].Trim().ToLower();&lt;br /&gt;   string fileCompare2 = fileNameCRM.Trim().ToLower();&lt;br /&gt;   if (!fileCompare1.Equals(fileCompare2))&lt;br /&gt;   {&lt;br /&gt;    info.MoveTo(Newfile);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  catch (IOException ex)&lt;br /&gt;  {&lt;br /&gt;   retMsg ="IOException (MoveTo) - " + ex.Message + additionalError;&lt;br /&gt;   return retMsg;&lt;br /&gt;  }&lt;br /&gt;  catch (Exception ex)&lt;br /&gt;  {&lt;br /&gt;   retMsg = "IOException (MoveTo) - " + ex.Message + additionalError;&lt;br /&gt;   return retMsg;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  FileStream fl = File.OpenRead(Newfile);&lt;br /&gt;&lt;br /&gt;  byte[] byteData = new byte[fl.Length];&lt;br /&gt;  fl.Read(byteData, 0, (int)fl.Length);&lt;br /&gt;  fl.Close();&lt;br /&gt;&lt;br /&gt;  crmSdk.activitymimeattachment oMimeAttach = new crmSdk.activitymimeattachment();&lt;br /&gt;  oMimeAttach.activityid = new crmSdk.Lookup();&lt;br /&gt;  oMimeAttach.activityid.Value = emailID;&lt;br /&gt;  oMimeAttach.activityid.type = crmSdk.EntityName.email.ToString();&lt;br /&gt;  oMimeAttach.attachmentnumber = new crmSdk.CrmNumber();&lt;br /&gt;  oMimeAttach.attachmentnumber.Value = i;&lt;br /&gt;  oMimeAttach.filename = fileNameCRM;&lt;br /&gt;  oMimeAttach.body = Convert.ToBase64String(byteData, 0, byteData.Length);&lt;br /&gt;&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;   CrmWebService.Create(oMimeAttach);&lt;br /&gt;   try { info.Delete(); }catch { }&lt;br /&gt;  }&lt;br /&gt;  catch (SoapException ex)&lt;br /&gt;  {&lt;br /&gt;   retMsg = "Activitymimeattachment Error - " + ex.Detail.InnerText + additionalError;&lt;br /&gt;  }&lt;br /&gt;  catch (Exception ex)&lt;br /&gt;  {&lt;br /&gt;   retMsg = "Activitymimeattachment Error - " + ex.Message + additionalError;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; return retMsg;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static string RemoveSpecialChars(ref string fileName)&lt;br /&gt;{&lt;br /&gt; fileName = Regex.Replace(fileName, @"[^\w\.@-]", "");&lt;br /&gt; fileName = fileName.Replace("ª", "");&lt;br /&gt; fileName = fileName.Replace("º", "");&lt;br /&gt; return fileName;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-2438910651802809458?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/2438910651802809458/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=2438910651802809458' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/2438910651802809458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/2438910651802809458'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-envio-de-email-template-com.html' title='&gt;&gt; CRM 4.0 - Envio de Email Template (com anexos)'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-2508716951801254035</id><published>2008-12-10T05:50:00.000-08:00</published><updated>2008-12-12T09:55:04.577-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Converter System.DateTime para CRMDateTime</title><content type='html'>public static CrmDateTime ConvertToCRMDateTime(DateTime dateTime)&lt;br /&gt;{&lt;br /&gt; CrmDateTime crmDateTime = new CrmDateTime();&lt;br /&gt; crmDateTime.date = dateTime.ToShortDateString();&lt;br /&gt; crmDateTime.time = dateTime.ToShortTimeString();&lt;br /&gt; TimeSpan offset = TimeZone.CurrentTimeZone.GetUtcOffset(dateTime);&lt;br /&gt; string sOffset = string.Empty;&lt;br /&gt; if (offset.Hours &lt; 0)&lt;br /&gt; {&lt;br /&gt;  sOffset = "-" + (offset.Hours * -1).ToString().PadLeft(2, '0');&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  sOffset = "+" + offset.Hours.ToString().PadLeft(2, '0');&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; sOffset += ":" + offset.Minutes.ToString().PadLeft(2, '0');&lt;br /&gt; crmDateTime.Value = dateTime.ToString(string.Format("yyyy-MM-ddTHH:mm:ss{0}", sOffset));&lt;br /&gt; &lt;br /&gt; return crmDateTime;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-2508716951801254035?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/2508716951801254035/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=2508716951801254035' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/2508716951801254035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/2508716951801254035'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-converter-systemdatetime-para.html' title='&gt;&gt; CRM 4.0 - Converter System.DateTime para CRMDateTime'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-4054810616734165628</id><published>2008-12-10T05:37:00.000-08:00</published><updated>2008-12-12T09:55:13.546-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 Plugin - Dicas no uso do IPluginExecutionContext</title><content type='html'>Segue algumas dicas no uso do parâmetro que é passado para nosso plugin, o IPluginExecutionContext.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1 - Detectar a Origem da execução do Plugin (Alteração ou Conversão de um registro em outro).&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Por exemplo, para saber se a execução do seu Plugin tem como origem a Conversão de uma Quota em Pedido.&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using Microsoft.Crm.Sdk;&lt;br /&gt;using Microsoft.Crm.SdkTypeProxy;&lt;br /&gt;&lt;br /&gt;public class Main_Plugin: IPlugin&lt;br /&gt;{&lt;br /&gt; public void Execute(IPluginExecutionContext context)&lt;br /&gt; {&lt;br /&gt;  Boolean IsConvertionMode = (context.CallerOrigin.GetType() == typeof(AsyncServiceOrigin) &amp;&amp; context.Depth &gt; 1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2 - Função genérica para recuperar o ID do registro do CRM para os Eventos de CREATE, UPDATE e DELETE.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;public static Guid GetIDParam(DynamicEntity de, IPluginExecutionContext context, string propertyName)&lt;br /&gt;{&lt;br /&gt; Guid ret = Guid.Empty;&lt;br /&gt;&lt;br /&gt; if (context.MessageName.Equals("Create"))&lt;br /&gt;  ret = (Guid)context.OutputParameters[ParameterName.Id];&lt;br /&gt;&lt;br /&gt; else if (context.MessageName.Equals("Update"))&lt;br /&gt;  ret = ((Key)de.Properties[propertyName]).Value;&lt;br /&gt;&lt;br /&gt; else if (context.MessageName.Equals("Delete"))&lt;br /&gt; {&lt;br /&gt;  Moniker mon = (Moniker)context.InputParameters.Properties["Target"];&lt;br /&gt;  ret = mon.Id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return ret;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3 - Passando dados entre Plugins&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Compartilhar dados entre Plugins fica fácil com uso da Collection SharedVariables.&lt;br /&gt;&lt;br /&gt;Imagine um Plugin de Account, com os Eventos de PRE-Update e POST-Update configurados. Uma determinada ação deverá ser tomada no evento de POST-Update; porém a ação somente será executada se ANTES da alteração do Account o registro possuia um status específico para um campo de Picklist.&lt;br /&gt;&lt;br /&gt;Isto é possível 'guardando' o valor do Picklist na Collection SharedVariables (no PRE-Update) e consultando esta collection no POST-Update.&lt;br /&gt;&lt;br /&gt;Segue template de código:&lt;br /&gt;&lt;br /&gt;public class AccountPreHandler : IPlugin&lt;br /&gt;{&lt;br /&gt; public void Execute(IPluginExecutionContext context)&lt;br /&gt; {&lt;br /&gt;  context.SharedVariables["statusAcct"] = [Get Picklist Value];&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class AccountPostHandler : IPlugin&lt;br /&gt;{&lt;br /&gt; public void Execute(IPluginExecutionContext context)&lt;br /&gt; {&lt;br /&gt;  if (context.SharedVariables.Contains("statusAcct"))&lt;br /&gt;  {&lt;br /&gt;   int statusAcct = (int)context.SharedVariables["statusAcct"];&lt;br /&gt;   if (statusAcct==1)&lt;br /&gt;   // Do something...&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-4054810616734165628?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/4054810616734165628/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=4054810616734165628' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4054810616734165628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4054810616734165628'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-40-plugin-dicas-no-uso-do.html' title='&gt;&gt; CRM 4.0 Plugin - Dicas no uso do IPluginExecutionContext'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5595134693619343022</id><published>2008-12-05T07:58:00.000-08:00</published><updated>2008-12-18T03:39:48.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Exchange'/><title type='text'>&gt;&gt; Exchange Server &amp; Active Sync Mobile</title><content type='html'>Configurar o Pocket PC para sincronizar emails com o Exchange, a primeira vista, parece ser simples. Porém, na prática, não é!&lt;br /&gt;&lt;br /&gt;Um colega de trabalho, na empresa que estou atuando no momento, estava com este problema. Pesquisando nos principais fóruns sobre o assunto (around the world!), notei que a dificuldade é geral, e não existe uma solução simples devido a própria natureza do processo.&lt;br /&gt;&lt;br /&gt;Porém consegui uma solução para o caso dele, seguindo os seguintes passos:&lt;br /&gt;&lt;br /&gt;1 - Habilitar acesso OWA no Exchange Server Manager;&lt;br /&gt;&lt;br /&gt;2 - Habilitar acesso ao OWA para determinado usuário no AD;&lt;br /&gt;&lt;br /&gt;3 - Windows HOSTS File&lt;br /&gt;&lt;br /&gt;- No Exchange Server, editar o arquivo &lt;strong&gt;hosts&lt;/strong&gt; em C:\windows\system32\drivers\etc;&lt;br /&gt;- Adicionar Public IP e FQDN do Exchange server (Windows server name + domain name, NÃO o Internet domain);&lt;br /&gt;&gt;&gt; 1.1.1.1 server.contoso.local&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#6666cc;"&gt;&lt;strong&gt;4 - Exchange Virtual Directory&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Desabilitar&lt;/strong&gt; a opção "forms-based authentication".&lt;br /&gt;&lt;br /&gt;Abra o Exchange Manager. Expanda o nó [Administrative Groups], expanda o nó [first administrative group] e também o nó [Servers]. Expanda [Protocols], depois [HTTP]. Abaixo de [HTTP], clique com o botão direito do mouse em [Exchange Virtual Server], e escolha [Properties]. Clique na aba [Settings], e limpe o checkbox [Enable Forms Based Authentication] e clique em OK.&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href="http://support.microsoft.com/default.aspx/kb/817379"&gt;http://support.microsoft.com/default.aspx/kb/817379&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5 - IIS&lt;br /&gt;&lt;br /&gt;- Habilitar Integrated Windows Authentication;&lt;br /&gt;- Habilitar Basic Authentication (opcional);&lt;br /&gt;- Habilitar Kerberos / NTLM Authentication.&lt;br /&gt;&lt;br /&gt;DOS Command:&lt;br /&gt;&lt;br /&gt;- Ir ao diretório de scripts:&lt;br /&gt;cd Inetpub\Adminscripts&lt;br /&gt;&lt;br /&gt;- Consultar o tipo de autenticação:&lt;br /&gt;cscript adsutil.vbs &lt;strong&gt;get&lt;/strong&gt; w3svc/1/root/NTAuthenticationProviders&lt;br /&gt;&lt;br /&gt;- Configurar o tipo de autenticação NTLM:&lt;br /&gt;cscript adsutil.vbs &lt;strong&gt;set&lt;/strong&gt; w3svc/1/root/NTAuthenticationProviders "Negotiate,NTLM";&lt;br /&gt;&lt;br /&gt;P.S.: w3svc/1/root/ - O número "1" representa "Default Web Site" no IIS.&lt;br /&gt;&lt;br /&gt;Links úteis:&lt;br /&gt;&lt;br /&gt;85010014 error - &lt;a href="http://www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.activesync/2006-02/msg00293.html"&gt;http://www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.activesync/2006-02/msg00293.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Exchange ActiveSync Errors and Solutions - &lt;a href="http://www.pocketpcfaq.com/faqs/activesync/exchange_errors.php"&gt;http://www.pocketpcfaq.com/faqs/activesync/exchange_errors.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OMA in Exchange 2003 - &lt;a href="http://www.petri.co.il/configure_oma.htm"&gt;http://www.petri.co.il/configure_oma.htm&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5595134693619343022?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5595134693619343022/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5595134693619343022' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5595134693619343022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5595134693619343022'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/exchange-server-active-sync-mobile.html' title='&gt;&gt; Exchange Server &amp; Active Sync Mobile'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-4239528085314179026</id><published>2008-12-04T05:02:00.001-08:00</published><updated>2008-12-12T09:55:37.789-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM - Número Sequencial Aleatório em JavaScript</title><content type='html'>O CRM possui, em algumas entidades, a geração automática de números sequenciais, como por exemplo na entidade Quota, no formato [COT-12345-SER43R].&lt;br /&gt;&lt;br /&gt;Pensando nisto, criei um processo para fazer o mesmo (com exceção do número ser aleatório e não sequencial) totalmente em JavaScript.&lt;br /&gt;&lt;br /&gt;P.S.: A função generateGuid() pode também ser útil em outros casos pois simula a geração do tipo GUID do banco de dados Sql.&lt;br /&gt;&lt;br /&gt;Segue código template:&lt;br /&gt;&lt;br /&gt;if (crmForm.FormType==1) // GERAR CÓDIGO SOMENTE NO CREATE DO FORM DO CRM&lt;br /&gt;{&lt;br /&gt;var seq = generateSeqNumber();&lt;br /&gt;var seqPosStart = seq.length-4;&lt;br /&gt;seq = seq.substr(seqPosStart,4);&lt;br /&gt;&lt;br /&gt;var guid = generateGuid();&lt;br /&gt;var guidPosStart = guid.length-6;&lt;br /&gt;guid = guid.substr(guidPosStart,6);&lt;br /&gt;&lt;br /&gt;crmForm.all.new_numerochamado.DataValue = "CHA-" + seq + "-" + guid;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function generateSeqNumber()&lt;br /&gt;{&lt;br /&gt;tmToday = new Date();&lt;br /&gt;return String(tmToday.getTime());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function generateGuid()&lt;br /&gt;{&lt;br /&gt;var result, i, j;&lt;br /&gt;result = '';&lt;br /&gt;for(j=0; j&lt;32; j++)&lt;br /&gt;{&lt;br /&gt;if( j == 8  j == 12 j == 16 j == 20)&lt;br /&gt;result = result + '-';&lt;br /&gt;i = Math.floor(Math.random()*16).toString(16).toUpperCase();&lt;br /&gt;result = result + i;&lt;br /&gt;}&lt;br /&gt;return result;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-4239528085314179026?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/4239528085314179026/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=4239528085314179026' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4239528085314179026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4239528085314179026'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-nmero-sequencial-aleatrio-em.html' title='&gt;&gt; CRM - Número Sequencial Aleatório em JavaScript'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-4588526131229464955</id><published>2008-12-01T10:36:00.000-08:00</published><updated>2008-12-12T09:56:02.808-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; [CRM + IE + [MaxConnPerServer=2]] = PostBack Errors</title><content type='html'>Abri hoje um chamado na Microsoft para tentar solucionar um problema com o Dynamics CRM 4.0, referente a um estranho problema de travamento na conversão de Quota em Pedido.&lt;br /&gt;&lt;br /&gt;O CRM até criava o pedido normalmente, porém travava o IE para atualizar os dados do Pedido criado.&lt;br /&gt;&lt;br /&gt;Geramos um diagóstico completo do Server (CRM/SQL/IIS/AD) e nada de errado aparecia nos logs.&lt;br /&gt;&lt;br /&gt;Então chegamos a conclusão que o problema estava no IE. Por padrão, o IE trabalha com no máximo 2 sessões de download. Porém, no caso do CRM, fica muito restrita esta configuração. Aumentamos para 10 conexões simultâneas e o problema foi resolvido.&lt;br /&gt;&lt;br /&gt;Os passos para correção são:&lt;br /&gt;&lt;br /&gt;Inicie o editor do Registry (Regedt32.exe).&lt;br /&gt;Localize a seguinte chave:&lt;br /&gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings&lt;br /&gt;&lt;br /&gt;No menu [Editar], aponte para [Novo] e clique em [DWORD Value], então adicione os seguintes valores de chave:&lt;br /&gt;&lt;br /&gt;Value name: MaxConnectionsPer1_0Server&lt;br /&gt;Value data: 10&lt;br /&gt;Base: Decimal&lt;br /&gt;&lt;br /&gt;Value Name: MaxConnectionsPerServer&lt;br /&gt;Value data: 10&lt;br /&gt;Base: Decimal&lt;br /&gt;&lt;br /&gt;P.S.: A Microsoft recomenda baixar o número de conexões indicada no KB até que o erro volte a ocorrer.&lt;br /&gt;&lt;br /&gt;Fonte: &lt;a href="http://support.microsoft.com/kb/282402"&gt;http://support.microsoft.com/kb/282402&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-4588526131229464955?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/4588526131229464955/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=4588526131229464955' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4588526131229464955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4588526131229464955'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/crm-ie-maxconnperserver2-postback.html' title='&gt;&gt; [CRM + IE + [MaxConnPerServer=2]] = PostBack Errors'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5123224851773125932</id><published>2008-12-01T08:54:00.000-08:00</published><updated>2008-12-12T09:56:19.689-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; Microsoft CRM Diagnostics Tool 4</title><content type='html'>Para uma análise detalhada do Servidor do CRM 4.0, segue dica da ferramenta de Diagnóstico que coleta uma grande quantidade de informações, sendo elas:&lt;br /&gt;&lt;br /&gt;CRM Server Report&lt;br /&gt;– System Information&lt;br /&gt;– Environment Variables&lt;br /&gt;– TCPIP Parameters Registry&lt;br /&gt;– Boot.ini Content&lt;br /&gt;– .Net Framework Registration&lt;br /&gt;– CRM Services Status and Logon Info&lt;br /&gt;– CRM Registry Keys&lt;br /&gt;– CRM Installed Files&lt;br /&gt;- %ProgramFiles%&lt;br /&gt;- GAC&lt;br /&gt;– Web Sites Bindings&lt;br /&gt;– ApplPool Indentities&lt;br /&gt;– CRM WebSite Authentication&lt;br /&gt;– SQL Server Information&lt;br /&gt;– CRM System Settings&lt;br /&gt;– CRM AD Groups Information&lt;br /&gt;– Organization and Deployment Informations&lt;br /&gt;&lt;br /&gt;(retrieve by SDK or SQL queries)&lt;br /&gt;&lt;br /&gt;- SRS Data Connector Report&lt;br /&gt;– System Information&lt;br /&gt;– Environment Variables&lt;br /&gt;– SRS Data Connector Installed files&lt;br /&gt;- %ProgramFiles%\CRM Data Conn&lt;br /&gt;- %ProgramFiles%\ReportServer&lt;br /&gt;– ReportServer Settings (WMI)&lt;br /&gt;– Report Manager Settings (WMI)&lt;br /&gt;– RSReportServer.config content&lt;br /&gt;– RSSrvPolicy.config content&lt;br /&gt;– SRSDataConnectorSetup.log&lt;br /&gt;- CRM E-Mail Router Report&lt;br /&gt;– System Information&lt;br /&gt;– Environment Variables&lt;br /&gt;– CRM E-Mail Router nstalled files&lt;br /&gt;– CRM E-Mail Router Service Info&lt;br /&gt;– Microsoft.Crm.Tools.EmailAgent.Xml content&lt;br /&gt;– Crm40ExchangeSetup.log&lt;br /&gt;&lt;br /&gt;Segue aparência da Ferramenta:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pnbueR6U8m8/STQXalfCFaI/AAAAAAAAABg/kt0XziH5zTU/s1600-h/CRMDiagnosticsTool4.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5274866809064002978" style="WIDTH: 310px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://3.bp.blogspot.com/_pnbueR6U8m8/STQXalfCFaI/AAAAAAAAABg/kt0XziH5zTU/s400/CRMDiagnosticsTool4.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Link para Download: &lt;a href="http://cid-9c1e3e43c991888d.skydrive.live.com/self.aspx/Microsoft%20CRM%20Support%20Tools/CrmDiagTool4.zip"&gt;http://cid-9c1e3e43c991888d.skydrive.live.com/self.aspx/Microsoft%20CRM%20Support%20Tools/CrmDiagTool4.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fonte da Matéria: &lt;a href="http://blogs.msdn.com/benlec/archive/2008/03/04/crmdiagtool4-for-microsoft-crm-4-0-has-been-released.aspx"&gt;http://blogs.msdn.com/benlec/archive/2008/03/04/crmdiagtool4-for-microsoft-crm-4-0-has-been-released.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/benlec/archive/2008/03/04/crmdiagtool4-for-microsoft-crm-4-0-has-been-released.aspx"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5123224851773125932?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5123224851773125932/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5123224851773125932' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5123224851773125932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5123224851773125932'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/12/microsoft-crm-diagnostics-tool-4.html' title='&gt;&gt; Microsoft CRM Diagnostics Tool 4'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pnbueR6U8m8/STQXalfCFaI/AAAAAAAAABg/kt0XziH5zTU/s72-c/CRMDiagnosticsTool4.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-4384179823493611622</id><published>2008-11-27T08:53:00.000-08:00</published><updated>2008-12-12T09:56:32.423-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0 - Exclusão física de registros</title><content type='html'>&lt;p&gt;O serviço de exclusão física de registros no CRM 4.0 mudou desde a versão anterior (3.0). O processo de exclusão é gerenciado pelo mesmo sistema que controla Triggers de Workflows e todos os jobs de processos assíncronos, como o Duplicate Detection e a chamada de plugins assíncronos (CrmAsyncService.exe). O tempo padrão é de 1440 minutos (24 hs) para o serviço de exclusão física de registros (tabela ScaleGroupOrganizationMaintenanceJobs do BD MSCRM_CONFIG). Segue link para baixar utilitário para poder mudar este tempo.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/ScaleGroupJobEditor/Release/ProjectReleases.aspx?ReleaseId=676"&gt;http://code.msdn.microsoft.com/ScaleGroupJobEditor/Release/ProjectReleases.aspx?ReleaseId=676&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Se desejar "forçar" a exclusão física dos registros, podemos fazer isto por executar um Update na tabela de Jobs do CRM da seguinte forma:&lt;/p&gt;&lt;p&gt;USE MSCRM_CONFIG&lt;br /&gt;UPDATE ScaleGroupOrganizationMaintenanceJobs&lt;br /&gt;SET NextRunTime = getdate() -- Right Now!&lt;br /&gt;WHERE OperationType = 14 -- Deletion Service&lt;/p&gt;&lt;p&gt;Após o Update, reinicie o serviço assíncrono do CRM.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-4384179823493611622?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/4384179823493611622/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=4384179823493611622' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4384179823493611622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/4384179823493611622'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/crm-40-excluso-fsica-de-registros.html' title='&gt;&gt; CRM 4.0 - Exclusão física de registros'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-7389248866599482013</id><published>2008-11-27T03:43:00.000-08:00</published><updated>2008-12-12T09:57:19.262-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; Dicas JavaScript (ASP.NET &amp; MSCRM 4.0)</title><content type='html'>Segue abaixo códigos JavaScript úteis no desenvolvimento ASP.NET e também para uso no Microsoft Dynamics CRM 4.0:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JS ASP.NET - Função para obter o valor de algum dos parâmetros da Query String da página.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;function getQueryStringParam(name)&lt;br /&gt;{&lt;br /&gt;name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");&lt;br /&gt;var regexS = "[\\?&amp;]"+name+"=([^&amp;#]*)";&lt;br /&gt;var regex = new RegExp( regexS );&lt;br /&gt;var results = regex.exec( window.location.href );&lt;br /&gt;if( results == null ) return "";&lt;br /&gt;else&lt;br /&gt;return results[1];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JS ASP.NET - Função para Converter o primeiro caractere de toda frase em Maiúsculo.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;function UCWords(str)&lt;br /&gt;{&lt;br /&gt;  var arrStr = str.split(" ");&lt;br /&gt;  var strOut = "";&lt;br /&gt;  var i = 0;&lt;br /&gt;  var stringValues = "da-de-do-das-dos";&lt;br /&gt;  while (i &lt; arrStr.length)&lt;br /&gt;  {&lt;br /&gt;  &lt;br /&gt;  if (stringValues.indexOf(arrStr[i].toLowerCase()) &lt; 0)&lt;br /&gt;  {&lt;br /&gt;  firstChar  = arrStr[i].substring(0,1);&lt;br /&gt;  remainChar = arrStr[i].substring(1);&lt;br /&gt;  firstChar  = firstChar.toUpperCase(); &lt;br /&gt;  remainChar = remainChar.toLowerCase();&lt;br /&gt;  strOut += firstChar + remainChar + ' ';&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  strOut += arrStr[i] + ' ';&lt;br /&gt;  &lt;br /&gt;  i++;&lt;br /&gt;  }&lt;br /&gt;  return strOut.substr(0,strOut.length - 1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JS ASP.NET - Adicionar / Remover itens em um DropDownList.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;function ClearDropDownList(list)&lt;br /&gt;{&lt;br /&gt; for(i=list.options.length-1; i&gt;=0 ;i--)&lt;br /&gt; {&lt;br /&gt;  list.remove(i);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;function addDropDownListOption(list, text, value)&lt;br /&gt;{&lt;br /&gt; var optn = document.createElement("OPTION");&lt;br /&gt; optn.text = text;&lt;br /&gt; optn.value = value;&lt;br /&gt; list.options.add(optn);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JS MSCRM 4.0 - Validação de campo Data via JavaScript.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;if (ValidateDate(crmForm.all.requestdeliveryby))&lt;br /&gt;{&lt;br /&gt;   // Custom code...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ValidateDate(field){&lt;br /&gt;var checkstr = "0123456789";&lt;br /&gt;var DateField = field;&lt;br /&gt;var Datevalue = "";&lt;br /&gt;var DateTemp = "";&lt;br /&gt;var seperator = ".";&lt;br /&gt;var leap = 0;&lt;br /&gt;var err = 0;&lt;br /&gt;var i;&lt;br /&gt;err = 0;&lt;br /&gt;var day = DateField.DataValue.getDate();&lt;br /&gt;var month = (DateField.DataValue.getMonth()+1);&lt;br /&gt;var year = DateField.DataValue.getYear();&lt;br /&gt;DateValue = day + "/" + month + "/" + year;&lt;br /&gt;   /* Delete all chars except 0..9 */&lt;br /&gt;   for (i = 0; i &lt; DateValue.length; i++) {&lt;br /&gt;   if (checkstr.indexOf(DateValue.substr(i,1)) &gt;= 0) {&lt;br /&gt;      DateTemp = DateTemp + DateValue.substr(i,1);&lt;br /&gt;   }&lt;br /&gt;   }&lt;br /&gt;   DateValue = DateTemp;&lt;br /&gt;   /* Validation of month*/&lt;br /&gt;   if ((month &lt; 1) || (month &gt; 12)) {&lt;br /&gt;      err = 21;&lt;br /&gt;   }&lt;br /&gt;   /* Validation of day*/&lt;br /&gt;   if (day &lt; 1) {&lt;br /&gt;     err = 22;&lt;br /&gt;   }&lt;br /&gt;   /* Validation leap-year / february / day */&lt;br /&gt;   if ((year % 4 == 0) || (year % 100 == 0) || (year % 400 == 0)) {&lt;br /&gt;      leap = 1;&lt;br /&gt;   }&lt;br /&gt;   if ((month == 2) &amp;&amp; (leap == 1) &amp;&amp; (day &gt; 29)) {&lt;br /&gt;      err = 23;&lt;br /&gt;   }&lt;br /&gt;   if ((month == 2) &amp;&amp; (leap != 1) &amp;&amp; (day &gt; 28)) {&lt;br /&gt;      err = 24;&lt;br /&gt;   }&lt;br /&gt;   /* Validation of other months */&lt;br /&gt;   if ((day &gt; 31) &amp;&amp; ((month == "01") || (month == "03") || (month == "05") || (month == "07") || (month == "08") || (month == "10") || (month == "12"))) {&lt;br /&gt;      err = 25;&lt;br /&gt;   }&lt;br /&gt;   if ((day &gt; 30) &amp;&amp; ((month == "04") || (month == "06") || (month == "09") || (month == "11"))) {&lt;br /&gt;      err = 26;&lt;br /&gt;   }&lt;br /&gt;   /* if 00 ist entered, no error, deleting the entry */&lt;br /&gt;   if ((day == 0) &amp;&amp; (month == 0) &amp;&amp; (year == 00)) {&lt;br /&gt;      err = 0; day = ""; month = ""; year = ""; seperator = "";&lt;br /&gt;   }&lt;br /&gt;   if (err != 0)&lt;br /&gt;   {&lt;br /&gt;      alert("Data Inválida!");&lt;br /&gt;      DateField.focus();&lt;br /&gt;   }&lt;br /&gt;   return (err == 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JS MSCRM 4.0 - Inserir / Formatar objetos dinamicamente na página do CRM.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;with(crmForm.all.new_labelicms)&lt;br /&gt;{&lt;br /&gt;style.border = 0;&lt;br /&gt;style.color = '#6699cc';&lt;br /&gt;style.fonteSize = '7px';&lt;br /&gt;style.fontWeight = 'bold';&lt;br /&gt;style.overflow = 'hidden';&lt;br /&gt;Disabled = true;&lt;br /&gt;DataValue = 'Obs % ICMS: No caso de venda direta...'&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Insert Adjacent Elements */&lt;br /&gt;var server = window.location.host;&lt;br /&gt;var oImg = document.createElement("&lt;" + "img src='http://" + server + "/_imgs/ico/16_alert.gif'" + " /&gt;");&lt;br /&gt;var oHr = document.createElement("&lt;" + "HR class='ms-crm-MenuList-Spacer'" + "&gt;");&lt;br /&gt;var oSpn = document.createElement("&lt;" + "span" + "&gt;");&lt;br /&gt;oSpn.innerText = ' Observações';&lt;br /&gt;oSpn.style.fontWeight = 'bold';&lt;br /&gt;crmForm.all.mit_labelicms.insertAdjacentElement("BeforeBegin",oImg);&lt;br /&gt;crmForm.all.mit_labelicms.insertAdjacentElement("BeforeBegin",oSpn);&lt;br /&gt;crmForm.all.mit_labelicms.insertAdjacentElement("BeforeBegin",oHr);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JS MSCRM 4.0 - AJAX no CRM - Chamada assíncrona em um Web Services Customizado.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;function FillUOMProduct()&lt;br /&gt;{&lt;br /&gt;var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");&lt;br /&gt;var server = window.location.host;&lt;br /&gt;var params = "?productID=" + crmForm.all.productid.DataValue[0].id;&lt;br /&gt;params += "&amp;fields=productnumber,defaultuomid";&lt;br /&gt;var url="http://"+ server+"/WebServicesCRM/Product.asmx/GetProductById"+params;&lt;br /&gt;xmlHttpRequest.open("GET", url, true);&lt;br /&gt;xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");&lt;br /&gt;xmlHttpRequest.setRequestHeader ("SOAPAction", "http://tempuri.org/GetProductById");&lt;br /&gt;xmlHttpRequest.onreadystatechange = HandleStateChangeProduct;&lt;br /&gt;xmlHttpRequest.send();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function HandleStateChangeProduct()&lt;br /&gt;{&lt;br /&gt;   if (xmlHttpRequest.readyState == 4)&lt;br /&gt;   {&lt;br /&gt;      var doc = new ActiveXObject('Microsoft.XMLDOM');&lt;br /&gt;      var result = xmlHttpRequest.responseXML.xml;&lt;br /&gt;      doc.loadXML(result);&lt;br /&gt;   }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-7389248866599482013?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/7389248866599482013/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=7389248866599482013' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7389248866599482013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7389248866599482013'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/dicas-javascript-aspnet-mscrm-40.html' title='&gt;&gt; Dicas JavaScript (ASP.NET &amp; MSCRM 4.0)'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-3199837460472414717</id><published>2008-11-19T07:21:00.000-08:00</published><updated>2008-12-12T09:57:31.007-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; CRM 4.0; IE6; KB953838; Error!!</title><content type='html'>Após efetuar um Security Update (KB953838) do Windows, teremos um repetitivo "File Download for Blank.aspx" no CRM 4.0.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_pnbueR6U8m8/SSQvOCTZgII/AAAAAAAAABY/C8nw9Pj_oSk/s1600-h/CRMpromptin.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5270389382113230978" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 261px" alt="" src="http://4.bp.blogspot.com/_pnbueR6U8m8/SSQvOCTZgII/AAAAAAAAABY/C8nw9Pj_oSk/s400/CRMpromptin.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Soluções:&lt;br /&gt;&lt;br /&gt;1 - Instalar o IE7, ou:&lt;br /&gt;2 - Desinstalar o KB953838, ou:&lt;br /&gt;3 - Efetuar o download da Blank.aspx (qq diretório); right-click no arquivo -&gt; Abrir como -&gt; Escolher Programa -&gt; selecionar IE, marcando o checkbox para sempre usar este tipo de programa;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-3199837460472414717?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/3199837460472414717/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=3199837460472414717' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/3199837460472414717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/3199837460472414717'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/crm-40-ie6-kb953838-error.html' title='&gt;&gt; CRM 4.0; IE6; KB953838; Error!!'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_pnbueR6U8m8/SSQvOCTZgII/AAAAAAAAABY/C8nw9Pj_oSk/s72-c/CRMpromptin.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-7716951300439368484</id><published>2008-11-19T05:22:00.000-08:00</published><updated>2010-07-07T11:27:21.555-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CRM 4.0'/><title type='text'>&gt;&gt; Unable to Load Client Print Control - CRM 4.0</title><content type='html'>Recentemente, no cliente que estou atuando (com o Microsoft Dynamics CRM 4.0) houve uma reclamação de um erro ao tentar imprimir um relatório desenvolvido no Reporting Services.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_pnbueR6U8m8/SSQYUwLVFdI/AAAAAAAAABQ/VmdL1TCNREU/s1600-h/loadPrintError.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5270364208739194322" style="WIDTH: 240px; CURSOR: hand; HEIGHT: 120px" alt="" src="http://3.bp.blogspot.com/_pnbueR6U8m8/SSQYUwLVFdI/AAAAAAAAABQ/VmdL1TCNREU/s400/loadPrintError.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Pesquisando sobre o assunto e a mensagem de erro descobri a causa, um HotFix de Segurança da Microsoft (KB956391).&lt;br /&gt;&lt;br /&gt;Para solucionar o problema, vai ser necessário atualizações de Service Packs, do Report Viewer e do Sql Server (2005 / 2008).&lt;br /&gt;&lt;br /&gt;Segue links para Download dos pacotes:&lt;br /&gt;&lt;br /&gt;Microsoft Report Viewer Redistributable 2005 Service Pack 1&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=82833f27-081d-4b72-83ef-2836360a904d&amp;amp;DisplayLang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=82833f27-081d-4b72-83ef-2836360a904d&amp;amp;DisplayLang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Security Update for SQL Server 2005 Service Pack 3&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=ae7387c3-348c-4faa-8ae5-949fdfbe59c4"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=ae7387c3-348c-4faa-8ae5-949fdfbe59c4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;______________________________________________________________________&lt;br /&gt;&lt;br /&gt;Microsoft Report Viewer Redistributable 2008 Service Pack 1&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=bb196d5d-76c2-4a0e-9458-267d22b6aac6"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=bb196d5d-76c2-4a0e-9458-267d22b6aac6&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Security Update for SQL Server 2008 Service Pack 1&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=66ab3dbb-bf3e-4f46-9559-ccc6a4f9dc19"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=66ab3dbb-bf3e-4f46-9559-ccc6a4f9dc19&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.S.: Se o servidor do [Reporting Services] não for o mesmo do [Sql Server], existe a necessidade da instalação do [Microsoft Dynamics CRM Data Connector for Reporting Services] no servidor do Sql Server, para que a autenticação funcione corretamente na execução de relatórios pelo CRM.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-7716951300439368484?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/7716951300439368484/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=7716951300439368484' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7716951300439368484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/7716951300439368484'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/unable-to-load-client-print-control-crm.html' title='&gt;&gt; Unable to Load Client Print Control - CRM 4.0'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_pnbueR6U8m8/SSQYUwLVFdI/AAAAAAAAABQ/VmdL1TCNREU/s72-c/loadPrintError.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-6093940753008037720</id><published>2008-11-18T11:05:00.000-08:00</published><updated>2008-12-12T09:58:08.528-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>&gt;&gt; ResizeControls - aspx</title><content type='html'>Gostaria de deixar os objetos de uma aspx sempre com a altura da janela do browser?&lt;br /&gt;&lt;br /&gt;Adicione o código abaixo no html de sua página:&lt;br /&gt;&lt;br /&gt;P.S.: Execute a função resizeControls() do método onresize do BODY da página.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_pnbueR6U8m8/SSMWvX5n-DI/AAAAAAAAAA4/caKtntbrq_g/s1600-h/resize.GIF"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 150px;" src="http://2.bp.blogspot.com/_pnbueR6U8m8/SSMWvX5n-DI/AAAAAAAAAA4/caKtntbrq_g/s400/resize.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5270080992078985266" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-6093940753008037720?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/6093940753008037720/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=6093940753008037720' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/6093940753008037720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/6093940753008037720'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/gostaria-de-deixar-os-objetos-de-uma.html' title='&gt;&gt; ResizeControls - aspx'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_pnbueR6U8m8/SSMWvX5n-DI/AAAAAAAAAA4/caKtntbrq_g/s72-c/resize.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5817643136913720133</id><published>2008-11-18T10:30:00.000-08:00</published><updated>2008-12-12T09:58:50.099-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>&gt;&gt; Busca do ID de um Web Site no IIS</title><content type='html'>Segue código Template para encontrar o ID de um determinado projeto Web no IIS:&lt;br /&gt;&lt;br /&gt;&lt;&lt; C# - VS.NET 2005 - Console Application &gt;&gt;&lt;br /&gt;&lt;br /&gt;using System.DirectoryServices;&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;public class IISAdmin&lt;br /&gt;{&lt;br /&gt;    public static void GetWebsiteID(string websiteName)&lt;br /&gt;    {&lt;br /&gt;        DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc");&lt;br /&gt;        &lt;br /&gt;        foreach(DirectoryEntry de in w3svc.Children)&lt;br /&gt;        {&lt;br /&gt;            if(de.SchemaClassName == "IIsWebServer" &amp;&amp; de.Properties["ServerComment"][0].ToString() == websiteName)&lt;br /&gt;            {&lt;br /&gt;                Console.Write(de.Name);&lt;br /&gt;            }&lt;br /&gt;        &lt;br /&gt;        }&lt;br /&gt;    &lt;br /&gt;    }&lt;br /&gt;    public static void Main()&lt;br /&gt;    {&lt;br /&gt;        GetWebsiteID("Default Web Site");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5817643136913720133?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5817643136913720133/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5817643136913720133' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5817643136913720133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5817643136913720133'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/busca-do-id-de-um-web-site-no-iis.html' title='&gt;&gt; Busca do ID de um Web Site no IIS'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5651082923751653196</id><published>2008-11-18T10:05:00.000-08:00</published><updated>2008-12-12T09:59:17.343-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>&gt;&gt; .NET 2.0 - Chamada Web Services - Sem "Add Web References"</title><content type='html'>Segue exemplo de código para chamada a Web Services sem a necessidade de adição da referência web no projeto.&lt;br /&gt;&lt;br /&gt;Basta passar para a função "CallWebServices" a URL, o nome da função e os parâmetros do Web Services.&lt;br /&gt;&lt;br /&gt;Exemplo de uso da função:&lt;br /&gt;&lt;br /&gt;using System.Xml;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;&lt;br /&gt;List&lt;'Hashtable&gt; oParams = new List&lt;'Hashtable&gt;();&lt;br /&gt;Hashtable ht1 = new Hashtable();&lt;br /&gt;ht1.Add("paramName", "productid");&lt;br /&gt;ht1.Add("paramValue", "413D080B-09A7-DB11-89C7-0016356BE094");&lt;br /&gt;oParams.Add(ht1);&lt;br /&gt;&lt;br /&gt;string xml = CallWebServices("http://localhost/MyWS/product.asmx", "GetProductPriceList", oParams);&lt;br /&gt;&lt;br /&gt;public static string CallWebServices(string url, string functionName, List&lt;'Hashtable&gt; oParams)&lt;br /&gt;{&lt;br /&gt;            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);&lt;br /&gt;            request.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;            request.Headers.Add("SOAPAction", "\"http://tempuri.org/" + functionName + "\"");&lt;br /&gt;            request.Method = "POST";&lt;br /&gt;            request.ContentType = "text/xml; charset=utf-8";&lt;br /&gt;            request.Accept = "text/xml";&lt;br /&gt;            request.Timeout = 10000;&lt;br /&gt;            Stream requestStream = request.GetRequestStream();&lt;br /&gt;            string soapEnvelope = "&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;";&lt;br /&gt;            soapEnvelope += "&lt;soap:Envelope";&lt;br /&gt;            soapEnvelope += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";&lt;br /&gt;            soapEnvelope += " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"";&lt;br /&gt;            soapEnvelope += " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"&gt;";&lt;br /&gt;            soapEnvelope += " &lt;soap:Body&gt;";&lt;br /&gt;            soapEnvelope += " &lt;" + functionName + " xmlns=\"http://tempuri.org/\"&gt;";&lt;br /&gt;            if (oParams.Count &gt; 0)&lt;br /&gt;            {&lt;br /&gt;                Boolean hashListOk = (oParams[0].Contains("paramName") &amp;&amp; oParams[0].Contains("paramValue"));&lt;br /&gt;                if (!hashListOk) return string.Empty;&lt;br /&gt;                foreach (Hashtable ht in oParams)&lt;br /&gt;                {&lt;br /&gt;                    soapEnvelope += "&lt;" + ht["paramName"].ToString() + "&gt;" + ht["paramValue"].ToString() + "&lt;/" + ht["paramName"].ToString() + "&gt;";&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            soapEnvelope += " &lt;/" + functionName + "&gt;";&lt;br /&gt;            soapEnvelope += " &lt;/soap:Body&gt;";&lt;br /&gt;            soapEnvelope += " &lt;/soap:Envelope&gt;";&lt;br /&gt;            // Convert the string into a byte array.&lt;br /&gt;            ASCIIEncoding encoder = new ASCIIEncoding();&lt;br /&gt;            byte[] ByteArray = encoder.GetBytes(soapEnvelope);&lt;br /&gt;            // Write data to the stream.&lt;br /&gt;            requestStream.Write(ByteArray, 0, ByteArray.Length);&lt;br /&gt;            requestStream.Flush();&lt;br /&gt;            requestStream.Close();&lt;br /&gt;            StreamReader esr = null;&lt;br /&gt;            string result = string.Empty;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                esr = new StreamReader(request.GetResponse().GetResponseStream());&lt;br /&gt;                result = esr.ReadToEnd();&lt;br /&gt;            }&lt;br /&gt;            catch (System.Web.Services.Protocols.SoapException ex)&lt;br /&gt;            {&lt;br /&gt;                string x = ex.Detail.InnerText;&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                string x = ex.Message;&lt;br /&gt;            }&lt;br /&gt;            return result;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5651082923751653196?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5651082923751653196/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5651082923751653196' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5651082923751653196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5651082923751653196'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/net-20-chamada-web-services-sem-add-web.html' title='&gt;&gt; .NET 2.0 - Chamada Web Services - Sem &quot;Add Web References&quot;'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1990437216154842225.post-5162508995210717294</id><published>2008-11-18T06:53:00.000-08:00</published><updated>2008-12-12T09:59:32.331-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET 1.1'/><title type='text'>&gt;&gt; Artigos - ASP.NET 1.1</title><content type='html'>Olá pessoal,&lt;br /&gt;&lt;br /&gt;Gostaria de compartilhar com vocês algumas dicas e códigos para facilitar no entendimento e desenvolvimento na plataforma .NET, mais especificamente no ASP.NET 1.1 (em breve também para as versões 2.0 e 3.5) .&lt;br /&gt;&lt;br /&gt;Abaixo segue links de artigos que publiquei no site do msdn para desenvolvedores, o SharePedia (&lt;a href="http://www.msdnbrasil.com.br/Sharepedia/"&gt;http://www.msdnbrasil.com.br/Sharepedia/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;P.S.: Para baixar os artigos, é necessária uma conta no Passport.NET ou Windows Live da Microsoft.&lt;br /&gt;&lt;br /&gt;- Navegando entre Forms - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52345"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52345&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Mantendo informações de estado em uma aplicação Web - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52270"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52270&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Entendendo Transações - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52644"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52644&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Autenticação e autorização de usuários - segurança na sua aplicação Web - PARTE I - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52199"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52199&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Autenticação e autorização de usuários - segurança na sua aplicação Web - PARTE II - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52200"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52200&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Autenticação e autorização de usuários - segurança na sua aplicação Web - PARTE III - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52201"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52201&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- WebApp - Trabalhando com objetos – Parte I - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52266"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52266&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- WebApp - Trabalhando com objetos – Parte II - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52267"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52267&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Tratamento de erros/exceptions - ASP.NET - &lt;a href="http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52034"&gt;http://www.msdnbrasil.com.br/secure/sharepedia/download.aspx?id=52034&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1990437216154842225-5162508995210717294?l=gtezini.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gtezini.blogspot.com/feeds/5162508995210717294/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1990437216154842225&amp;postID=5162508995210717294' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5162508995210717294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1990437216154842225/posts/default/5162508995210717294'/><link rel='alternate' type='text/html' href='http://gtezini.blogspot.com/2008/11/aspnet-11.html' title='&gt;&gt; Artigos - ASP.NET 1.1'/><author><name>GTezini.NET.</name><uri>http://www.blogger.com/profile/07004453299266988738</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_pnbueR6U8m8/SYGuf0xGYOI/AAAAAAAAACY/PbD6Ovrb7gw/S220/msnNet3.JPG'/></author><thr:total>0</thr:total></entry></feed>
