<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Fabian André Gehrke</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/fabiangehrke/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/feed.xml</link>
    <description>SharePoint no dia-a-dia</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:20:35 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Instrumentação com SharePoint 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/instrumentao-com-sharepoint-2010</link>
      <pubDate>Fri, 29 Nov 2013 03:35:00 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/11/29/instrumentao-com-sharepoint-2010/</guid>
      <description><![CDATA[Instrumentação, de acordo com a Wikipédia, significa “a ciência que estuda, desenvolve e aplica...]]></description>
      <content:encoded><![CDATA[<p>Instrumentação, de acordo com a <a href="https://pt.wikipedia.org/wiki/Instrumenta%C3%A7%C3%A3o" target="_blank">Wikipédia</a>, significa “<em>a ciência que estuda, desenvolve e aplica instrumentos de medição e controle de processos</em>”, ou seja, com base em informações geradas a partir de medições e controle desses processos, conseguimos saber o que está acontecendo com determinado objeto, seja ele uma usina hidroelétrica ou um programa de computador.</p>  <p align="justify">Neste post vamos falar um pouco sobre intrumentação no SharePoint 2010, como podemos controlar a execução de nossos processos para descobrir problemas de performance e o controle de erros. Os recursos abordados neste artigo serão uma introdução à developer dashboard e como gravar informações nela e o registro de erros no log do SharePoint e do Windows.</p>    <p><strong></strong></p>  <p><strong></strong></p>  <p><strong>Developer Dashboard</strong></p>  <p align="justify"></p>  <p align="justify">A developer dashboard é um painel de acompanhamento da execução da página, nela aparecem informações importantes para descobrir problemas de performance ou erros. Por padrão a developer dashboard está desabilitada no SharePoint, para habitá-la é necessário executar um comando através de Power Shell do SharePoint 2010. A listagem 01 exibe o comando em detalhes.</p>  <blockquote style="width: 512px; height: 273px;">   <p><font size="2"><font face="Courier New">$service = [Microsoft.SharePoint.Administration.SPWebService]::ContentService          <br />$addsetting =$service.DeveloperDashboardSettings</font> </font></p>    <p><font size="2">$addsetting.DisplayLevel = </font></p>   <font size="2"></font>        <p><font size="2"><font face="Courier New">&#160;&#160;&#160;&#160;&#160; [Microsoft.SharePoint</font></font><font size="2" face="Courier New">.Administration. </font></p>    <p><font size="2" face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SPDeveloperDashboardLevel]::OnDemand</font> </p>    <p>$addsetting.Update()</p>     </blockquote>  <p align="center"><em>Listagem 01: Habilitando a developer dashboard</em></p>  <p align="justify"></p>  <p align="justify">A developer dasboard pode ser utilizada em três modos:</p>  <ul>   <li>     <div align="justify">On: é exibida em todas as páginas automaticamente;</div>   </li>    <li>     <div align="justify">OnDemand: não é exibida nas páginas mas o usuário pode ativá-la manualmente clicando no ícone que ficar perto do seu login, conforme mostra a imagem 01;</div>   </li>    <li>     <div align="justify">Off: desligada e nunca é exibida.</div>   </li> </ul>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="https://byfiles.storage.live.com/y1p7DhiREoXrI8rf-gZoNcgWLteXSx9i_61Pb4vqCdgS8DnQAITOwMESMsRWCr6WjR2DTlHmeyXzfc/developerdashboard01.png?psid=1" /></p>  <p align="center"><em>Imagem 01: Ativando/desativando a developer dashboard em modo OnDemand</em></p>  <p align="justify"></p>  <p align="justify">Ao ativar a developer dashboard na página (na imagem 02 é possível observar a Developer Dashboard ativa, ela está visível na parte inferior da página), várias informações sobre o processamento da página e atividades relacionadas serão exibidas. Cada área consiste em um tipo de informação (ver imagem 02):</p>  <ol>   <li>     <div align="justify">Exibe o processo de renderização do ASP.NET, exibindo o tempo de execução e renderização de cada controle em milissegundos (ms). É aqui que problemas de performance de controles/métodos serão avaliados individualmente;</div>   </li>    <li>     <div align="justify">Exibe o tempo total de processamento da página, que consiste na soma de todos os tempos dos outros recursos. Exibe o usuário atual e nível check-out da página;</div>   </li>    <li>     <div align="justify">Exibe os erros que aconteceram durante a execução da página;</div>   </li>    <li>     <div align="justify">Exibe as consultas feitas no banco de dados com o respectivo tempo de duração;</div>   </li>    <li>     <div align="justify">Exibe o de processamento das web parts, mostrando o tempo de execução (em milissegundos) dos eventos por web part.</div>   </li> </ol>  <p><img style="margin-right: auto; margin-left: auto; float: none; display: block;" src="https://byfiles.storage.live.com/y1p7DhiREoXrI-i5r71m7_a3wxz98NlVgaHaJyBd-LxDvCJ2TCZxpKXs4Xki1r00mbVfeZoFhGXRds/developerdashboard02.png?psid=1" width="600" height="441" /></p>  <p align="center"><em>Imagem 02: Developer dashboard</em></p>  <p align="justify"></p>  <p align="justify">Com base nessas informações o desenvolvedor irá descobrir, por exemplo, se a sua web part está lenta, se de repente o problema de lentidao é no banco e as consultas estão demorando demais, e por aí adiante.</p>      <p><strong>Registrando Eventos na Developer Dashboard</strong></p>  <p align="justify"></p>  <p align="justify">O conteúdo exibido na developer dashboard é o conteúdo padrão do SharePoint, os controles que o próprio SharePoint utiliza. Mas como desenvolvedor apenas isso acaba não resolvendo o meu problema, o que fazer então?</p>  <p align="justify">Podemos usar a facilidade de registrar na developer dashboard os eventos, e assim exibir no painel as ações e tempos de execução destes eventos. Dessa forma conseguimos ter um rastreamento melhor da execução de nossos artefatos.</p>  <p align="justify">Para fazer o registro das informações na developer dashboard devemos utilizar a classe <b>SPMonitoredScope</b> dentro de um using. Assim, tudo o que estiver dentro do escopo do <em>using</em> será computado como uma ação e o tempo total será registrado. No exemplo da listagem 02, estamos abrindo o using para criar o objeto SPMonitoredScope e colocando um sleep de 1 segundo. Dessa forma a developer dashboard irá informar que o tempo de execução do MeuTexto foi de 1 segundo (aproximadamente).</p>  <blockquote>   <p><font face="Courier New">using (new SPMonitoredScope(&quot;MeuTexto&quot;))        <br />{         <br />&#160;&#160;&#160; System.Threading.Thread.Sleep(1000);         <br />}</font></p> </blockquote>  <p align="center"><em>Listagem 02: Exemplo de uso da classe SPMonitoredScope</em></p>  <p align="justify"></p>  <p align="justify">Para melhorar a exibição e controle das informações, podemos utilizar os registros na developer dashboard de forma aninhada, ou seja, uns dentro de outros. A listagem 03 mostra em detalhes. Dessa forma o tempo de execução de MeuTexto passa para 2 segundos e o tempo de DentroMeuTexto é de 1 segundo. Tudo o que estiver dentro do using será considerado tempo de execução para o escope criado e para casa using interno é feito o mesmo controle, de forma aninhada.</p>  <blockquote style="width: 540px; height: 219px;">   <p><font face="Courier New">using (new SPMonitoredScope(&quot;MeuTexto&quot;))        <br />{         <br />&#160;&#160;&#160; System.Threading.Thread.Sleep(1000);</font></p>    <p><font face="Courier New">&#160;&#160;&#160; using (new SPMonitoredScope(&quot;DentroMeuTexto&quot;))        <br />&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Threading.Thread.Sleep(1000);         <br />&#160;&#160;&#160; }</font><font face="Courier New">        <br />}</font></p> </blockquote>  <p align="center"><em>Listagem 03: Exemplo de uso da classe SPMonitoredScope de forma aninhada</em></p>  <p align="justify"></p>  <p align="justify">O próximo exemplo temos uma amostra de como instrumentar as classes e assim controlar a performance de execução dos métodos usando ainda o SPMonitoredScope. A listagem 04 mostra a criação de uma classe chamada Pessoa que possui alguns métodos que estão registrando o tempo de execução, depois a listagem 05 mostra como chamar essa classe e possui um outro registro do tempo de exeução, só que em nível macro de todas as chamadas dos métodos da classe pessoa. O resultado disso poder ser visto na imagem 03.</p>  <blockquote style="width: 512px; height: 1033px;">   <p><font face="Courier New">using System;        <br />using System.Collections.Generic;         <br />using System.Linq;         <br />using System.Text;         <br />using Microsoft.SharePoint.Utilities;</font></p>    <p><font face="Courier New">namespace WebPartInstrumentada        <br />{         <br />&#160;&#160;&#160; public class Pessoa         <br />&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public List&lt;Pessoa&gt; ObterTodasPessoas()         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using (new SPMonitoredScope(&quot;ObterTodasPessoas&quot;))         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Threading.Thread.Sleep(1000);         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public Pessoa ObterPessoaPeloID(int id)        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using (new SPMonitoredScope(&quot;ObterPessoaPeloID&quot;))         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Threading.Thread.Sleep(100);         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public Pessoa ObterPessoaPeloNome(string nome)        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new Exception(&quot;Erro ao obter pessoa pelo nome, contate o administrador do sistema&quot;);         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch (Exception ex)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Registra o erro no log do SharePoint         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TratamentoErro.RegistrarErroLogSharePoint(ex);         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Registra o erro no log do Windows         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TratamentoErro.RegistrarErroEventViewer(ex);         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }         <br />&#160;&#160;&#160; }         <br />}</font></p> </blockquote>  <p align="center"><em>Listagem 04: Classe pessoa</em></p>    <blockquote style="width: 532px; height: 571px;">   <p><font face="Courier New">using System;        <br />using System.Web.UI;         <br />using System.Web.UI.WebControls;         <br />using System.Web.UI.WebControls.WebParts;         <br />using Microsoft.SharePoint.Utilities;</font></p>    <p><font face="Courier New">namespace WebPartInstrumentada.WebPartInstrumentada        <br />{         <br />&#160;&#160;&#160; public partial class WebPartInstrumentadaUserControl : UserControl         <br />&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected void Page_Load(object sender, EventArgs e)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using (new SPMonitoredScope(&quot;Processando pessoas&quot;))         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Pessoa pessoa = new Pessoa();</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pessoa.ObterPessoaPeloID(1);</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pessoa.ObterTodasPessoas();</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pessoa.ObterPessoaPeloNome(&quot;Fabian&quot;);        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }         <br />&#160;&#160;&#160; }         <br />}</font></p> </blockquote>  <p align="center"><em>Listagem 05: User Control</em></p>    <p align="justify">Da mesma forma que usamos a developer dashboard para exibir os nosso eventos customizados, também podemos usá-la para exibir erros tratados nesse processo. O próximo capítulo fala de como tratar erros e registrá-los no log do SharePoint ou no log do Windows. A imagem 03 mostra que os erros customizados para aparecer nos logs do Sharepoint e do Windows, também são mostrado na developer dashboard, na seção “Asserts and Critival Events”.</p>  <p align="center"><img src="https://byfiles.storage.live.com/y1pyT2SKATp3wzdArMJOqtDewP9Sesp6tduZxAK6_YKPuVlMmGSZmIPjr55o-G2Olf07s7OB0PdT4Q/developerdashboard05.png?psid=1" width="600" height="441" /></p>  <p align="center"><em>Imagem 03: Developer dashboard exibindo o tempo de execução da rotina de processamento de pessoas</em></p>      <p><strong>Registrando eventos no log do SharePoint e log do Windows</strong></p>  <p align="justify"></p>  <p align="justify">Além das informações de performance, podermos gravar informações de erro ou avisos nos logs do SharePoint ou do Windows, para isso utilizamos a classe do SharePoint chamada <strong>SPDiagnosticsService</strong>, que é responsável por gravar os registros no log do SharePoint ou do Windows.</p>  <p align="justify">A listagem 06 mostra a implementação de uma classe de tratamento de erro, nesta classe temos um método para gravar no log do SharePoint e outro para gravar no log do Windows.&#160; No caso do log do SharePoint, conforme a severidade informada para o registro, ele poderá ser exibido no log do SharePoint ou não. Isso depende da configuração feita na Administração Central relacionada à severiade do log de diagnóstico do SharePoint. Seria interessante personalizar o método RegistrarErroLogSharePoint para trabalhar com mais parâmetros, principalmente parâmetros que fossem relativos a severidade. Geralmente trabalhamos com mais de um tipo de informação de instrumentação, pois nem tudo é erro. Durante a execução podemos ter informações, avisos, erros, entre outros, e dessa forma conseguimos configurar o SharePoint para só gravar erros, por exemplo.</p>  <blockquote style="width: 506px; height: 1050px;">   <p><font face="Courier New">using System;        <br />using System.Collections.Generic;         <br />using System.Linq;         <br />using System.Text;         <br />using Microsoft.SharePoint.Administration;</font></p>    <p><font face="Courier New">namespace WebPartInstrumentada        <br />{         <br />&#160;&#160;&#160; public static class TratamentoErro         <br />&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// &lt;summary&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// Método que registra os erros no log do SharePoint (pasta C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\LOGS)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// &lt;/summary&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// &lt;param name=&quot;ex&quot;&gt;&lt;/param&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public static void RegistrarErroLogSharePoint(Exception ex)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SPDiagnosticsService diagnostics = SPDiagnosticsService.Local;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; diagnostics.WriteTrace(1409,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new SPDiagnosticsCategory(&quot;ErroCustomizado&quot;,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TraceSeverity.Monitorable,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; EventSeverity.Error),         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TraceSeverity.Monitorable,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;Ocorreu um erro: {0}&quot;,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new object[] { ex });         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// &lt;summary&gt;        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// Método que registra os erros no log do Windows (Visualizador de Eventos)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// &lt;/summary&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; /// &lt;param name=&quot;ex&quot;&gt;&lt;/param&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public static void RegistrarErroEventViewer(Exception ex)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; SPDiagnosticsService diagnostics = SPDiagnosticsService.Local;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; diagnostics.WriteEvent(1408,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new SPDiagnosticsCategory(&quot;ErroCustomizado&quot;,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; TraceSeverity.Monitorable,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; EventSeverity.Warning),         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; EventSeverity.Error,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;Ocorreu um erro: {0}&quot;,         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new object[] { ex });         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }         <br />&#160;&#160;&#160; }         <br />}</font></p> </blockquote>  <p align="center"><em>Listagem 06: Classe de tratamento de erro</em></p>    <p align="justify">A listagem 07 mostra a implementação do método <em>ObterPessoaPeloNome</em> da classe pessoa (já feito anteriormente na listagem 04). Veja que no tratamento de exceção o erro está sendo gravado no log do Sharepoint e no log do Windows.</p>  <blockquote style="width: 595px; height: 372px;">   <p><font face="Courier New">public Pessoa ObterPessoaPeloNome(string nome)        <br />{         <br />&#160;&#160;&#160; try         <br />&#160;&#160;&#160; {&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new Exception(&quot;Erro ao obter pessoa pelo nome, contate o administrador do sistema&quot;);         <br />&#160;&#160;&#160; }         <br />&#160;&#160;&#160; catch (Exception ex)         <br />&#160;&#160;&#160; {         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Registra o erro no log do SharePoint         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; TratamentoErro.RegistrarErroLogSharePoint(ex);         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Registra o erro no log do Windows         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; TratamentoErro.RegistrarErroEventViewer(ex);         <br />&#160;&#160;&#160; }</font></p>    <p><font face="Courier New">&#160;&#160;&#160; return null;        <br />}         <br /></font></p> </blockquote>  <p align="center"><em>Listagem 07: Utilização do tratamento de erro gravando no log do SharePoint e Windows</em></p>    <p align="justify">Agora basta conferir o resultado do tratamento de erro e execução do método <em>ObterPessoaPeloNome</em>, que pode ser visto no log do SharePoint, conforme a imagem 04, e no log de eventos do Windows, conforme imagem 05.</p>  <p align="center"><img src="https://byfiles.storage.live.com/y1pmdFbM3__enz6cr5cT0eklGAcCJkV0DH3qC8QPknXc8sDWo5r7K-j9_lVj3QQEgpW0JbK-82rYls/developerdashboard04.png?psid=1" /></p>  <p align="center"><em>Imagem 04: Evento gravado no log do SharePoint</em></p>  <p align="center"><em></em></p>  <p align="center"><em></em></p>  <p align="center"><img src="https://byfiles.storage.live.com/y1pmdFbM3__enyGByLQ7_w84ApltSuuSqMMOE3PXY5vGzesZ6KHos5qL8rwPD4KFXrzeO2YO6-XwfA/developerdashboard03.png?psid=1" /></p>  <p align="center"><em>Imagem 05: Evento gravado no log do Windows</em></p>    <p><strong>Referências</strong></p>  <ul>   <li><a href="https://blogs.technet.com/b/patrick_heyde/archive/2009/11/16/sharepoint-2010-enable-using-developer-dashboard.aspx" target="_blank">SharePoint 2010 – Enable &amp; using Developer Dashboard</a> </li>    <li><a href="https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spdiagnosticsservice.aspx" target="_blank">SPDiagnosticsService Class</a> </li>    <li><a href="https://msdn.microsoft.com/en-us/library/ff512758.aspx" target="_blank">Using SPMonitoredScope</a> </li>    <li><a href="https://www.zimmergren.net/archive/2010/12/18/sp-2010-developing-for-performance-part-1-developer-dashboard.aspx" target="_blank">SP 2010: Developing for performance Part 1 - Developer Dashboard</a> </li>    <li><a href="https://www.zimmergren.net/archive/2010/12/21/sp-2010-developing-for-performance-part-2-spmonitoredscope.aspx" target="_blank">SP 2010: Developing for performance Part 2 – SPMonitoredScope</a> </li>    <li><a href="https://www.zimmergren.net/archive/2011/01/17/sp-2010-developing-for-performance-part-4-logging.aspx" target="_blank">SP 2010: Developing for performance Part 4 – Logging</a> </li>    <li><a href="https://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2010/05/28/using-spmonitoredscope-to-monitor-performance-of-your-code.aspx" target="_blank">Using SPMonitoredScope to monitor performance of your code</a> </li>    <li><a href="https://www.tcscblog.com/2011/02/28/how-to-enable-the-developer-dashboard-in-sharepoint-2010/" target="_blank">How to Enable the Developer Dashboard in SharePoint 2010</a> </li>    <li><a href="https://www.wictorwilen.se/Post/Improve-your-SharePoint-2010-applications-with-monitoring-using-SPMonitoredScope.aspx" target="_blank">Improve your SharePoint 2010 applications with monitoring using SPMonitoredScope</a> </li>    <li><a href="https://skydrive.live.com/redir.aspx?cid=4ec733696e21204d&amp;resid=4EC733696E21204D!11557" target="_blank">Fontes do projeto utilizado neste post</a> </li> </ul>]]></content:encoded>
    </item>
    <item>
      <title>Erro MissingAssembly no Health Analyzer</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/erro-missingassembly-no-health-analyzer</link>
      <pubDate>Sun, 14 Jul 2013 21:23:43 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/07/14/erro-missingassembly-no-health-analyzer/</guid>
      <description><![CDATA[Em ambientes que temos soluções customizadas para o SharePoint 2010, é muito comum aparecer no Heath...]]></description>
      <content:encoded><![CDATA[<p align="justify">Em ambientes que temos soluções customizadas para o SharePoint 2010, é muito comum aparecer no Heath Analyzer a mensagem de erro a seguir:</p> <font style="font-size: 12pt;"></font>  <p class="MsoNormal" style="margin: 0in 0in 8pt; line-height: normal; list-style-type: disc; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><font size="2"><font face="Courier New"><i style="mso-bidi-font-style: normal;"><span style="mso-fareast-font-family: &quot;Times New Roman&quot;; mso-themecolor: accent6;">Assembly [My.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cfc9a4dcd383ae1e] is referenced in the database [WSS_Content], but is not installed on the current farm. </span></i><i style="mso-bidi-font-style: normal;"><span lang="PT-BR" style="mso-fareast-font-family: &quot;Times New Roman&quot;; mso-themecolor: accent6; mso-ansi-language: pt-br;">Please install any feature/solution which contains this assembly.</span></i></font></font></p>  <p class="MsoNormal" style="margin: 0in 0in 8pt; line-height: normal; list-style-type: disc; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto;"><font size="2"><font face="Courier New"><i style="mso-bidi-font-style: normal;"><span lang="PT-BR" style="mso-fareast-font-family: &quot;Times New Roman&quot;; mso-themecolor: accent6; mso-ansi-language: pt-br;">&#160; </span></i></font></font><span lang="PT-BR" style="mso-fareast-font-family: &quot;Times New Roman&quot;; mso-ansi-language: pt-br;"></span></p>  <p align="justify">Na maioria dos casos esse erro é gerado por algum Event Receiver problemático, ou seja, que tenha sido esquecido de remover da solução customizada, ou outro problema relacionado com a desativação ou retração da solução.</p>  <p align="justify">Neste post eu quero compartilhar com vocês um script Power Shell que pode ajudá-los a remover esse event receiver problemático. </p>  <p align="center"><i><strong>Este artigo é uma tradução livre do artigo MissingAssembly Error in Health Analyzer (</strong></i><a href="https://blogs.technet.com/b/pfelatam/archive/2013/06/26/missingassembly-error-in-health-analyzer.aspx"><i><strong>https://blogs.technet.com/b/pfelatam/archive/2013/06/26/missingassembly-error-in-health-analyzer.aspx</strong></i></a><i><strong>)</strong></i></p>  <p align="justify">O script a seguir possui 2 funções:</p>  <p align="justify"><b>Delete-MissingAssembly</b>: Esta é a função principal que percorre todos os possíveis containers no banco de dados específicos que podem hospedar um event receiver: site collections, web ou listas.</p>  <p align="justify"><b>Remove-EventReceiver</b>: Essa função verifica se o container do event receiver possui qualquer event receiver com o nome do assembly específico, exibe suas informações e/ou tenta excluí-lo.</p>  <p align="justify">As 2 funções tem um parâmetro para permitir excluir diretamente o event receiver ou apenas mostra na tela as informações sobre ele.</p>  <p><font face="Courier New">function Delete-MissingAssembly($ContentDb, $Assembly, [switch]$ReportOnly)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">{</font></p>  <p><font face="Courier New">&#160;&#160; [bool]$report = $false</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; if ($ReportOnly) { $report = $true }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; $database = Get-SPContentDatabase | ?{$_.Name -eq $ContentDb}</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; foreach($site in $database.Sites)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; {</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; Remove-EventReceiver -ERContainer $site -Assembly $Assembly -ReportOnly $report</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; foreach($web in $site.AllWebs)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; {</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Remove-EventReceiver -ERContainer $web -Assembly $Assembly -ReportOnly $report</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach($list in $web.Lists)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Remove-EventReceiver -ERContainer $list -Assembly $Assembly -ReportOnly $report</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">}</font></p> <font face="Courier New"></font>  <p><font face="Courier New">function Remove-EventReceiver($ERContainer, $Assembly, $ReportOnly)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">{</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; foreach($er in $ERContainer.EventReceivers)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; {</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; if($er.Assembly -eq $Assembly)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; {</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Write-Host &quot;Event Receiver with Id[&quot; $er.Id &quot;], Name[&quot; $er.Name &quot;] and Type [&quot; $er.Type &quot;] found in [&quot; $ERContainer.Url $ERContainer.DefaultViewUrl &quot;].&quot;</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if($ReportOnly -eq $false)</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Write-Host &quot;Try to delete the receiver:&quot;</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $er.Delete()</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Write-Host &quot;ER deleted.&quot;</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">&#160;&#160; }</font></p> <font face="Courier New"></font>  <p><font face="Courier New">}</font></p>  <p>Depois de salvar o script em um arquivo PS1 e importá-lo (Exemplo: Import-Module .\MissingEV.PS1), você pode usar essa função da seguinte forma:</p>  <p><font face="Courier New">Delete-MissingAssembly -ContentDb WSS_Content -Assembly &quot;My.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cfc9a4dcd383ae1e&quot; -ReportOnly</font> </p>  <p>E a mensagem exibida será parecida com essa:</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/82/08/2642.OutputMissingER.JPG" original-url="https://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-82-08/2642.OutputMissingER.JPG"><img title="clip_image002" style="display: inline; background-image: none;" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/4101.clip_image002_519721D6.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/4101.clip_5F00_image002_5F00_519721D6.jpg" width="604" height="87" /></a></p>  <p>Como você pode ver a função exibe o Id, Nome, Tipo e Local do event receiver específico, você pode decidir se irá removê-lo com esse script, acessar através do PowerShell ou ainda através de alguma ferramenta de terceiros.</p>  <p>Espero que com este post tenha lhe ajudado a resolver a falta de dependência do lado do servidor que é exibida no Health Analyzer.</p>]]></content:encoded>
    </item>
    <item>
      <title>Obtendo Pastas Utilizando o WebService Lists.ASMX do SharePoint 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/obtendo-pastas-utilizando-o-webservice-lists-asmx-do-sharepoint-2010</link>
      <pubDate>Thu, 23 May 2013 00:21:17 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/23/obtendo-pastas-utilizando-o-webservice-lists-asmx-do-sharepoint-2010/</guid>
      <description><![CDATA[Lendo um post no fórum do MSDN com o título Recuperar ID de pasta na Biblioteca usando Web Services...]]></description>
      <content:encoded><![CDATA[<p align="justify">Lendo um post no fórum do MSDN com o título <a href="https://social.msdn.microsoft.com/Forums/pt-BR/sharepointpt/thread/b5d622a1-96d7-4f4b-9e17-05fc365c15d4">Recuperar ID de pasta na Biblioteca usando Web Services</a> fiquei curioso com o problema reportado, que era conseguir consultar uma pasta do SharePoint passando o nome dela e retornando o ID, utilizando o webservice Lists.ASMX.</p>  <p align="justify">Este post tem um exemplo de como implementar esta necessidade.</p>  <p align="justify">Antes de iniciar, vale lembrar que existem outras formas mais recomendas de acessar dados remotamente do SharePoint, como por exemplo o <a href="https://msdn.microsoft.com/en-us/library/ee537247%28v=office.14%29.aspx">Client Object Model</a> ou o serviço REST, mas como a solicitação era via webservice, vou deixar o exemplo na mesma linha. O código deste post foi copiado do post original do fórum e adaptado para que funcione corretamente.</p>  <p align="justify">Neste exemplo, a biblioteca do SharePoint possui as pastas na seguinte estrutura:</p>  <ol>   <li>Pasta1      <ol>       <li>PastaA          <ol>           <li>Folder1 </li>            <li>Folder2 </li>            <li>Folder3 </li>         </ol>       </li>        <li>PastaB </li>        <li>PastaC </li>     </ol>   </li>    <li>Pasta2 </li>    <li>Pasta3 </li> </ol>  <p align="justify">O primeiro passo para começar o desenvolvimento é adicionar a referência do webservice no Visual Studio, que fica no endereço <a href="https://enderesite/_vti_bin/lists.asmx">https://enderesite/_vti_bin/lists.asmx</a>, conforme mostra a imagem 01.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/2744.WebService_CAML_GetFolderByName02_0142A2F8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/2744.WebService_5F00_CAML_5F00_GetFolderByName02_5F00_0142A2F8.png"><img title="WebService_CAML_GetFolderByName02" style="display: inline; background-image: none;" border="0" alt="WebService_CAML_GetFolderByName02" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/1050.WebService_CAML_GetFolderByName02_thumb_26CC2059.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/1050.WebService_5F00_CAML_5F00_GetFolderByName02_5F00_thumb_5F00_26CC2059.png" width="604" height="424" /></a></p>  <p align="center"><em>Imagem 01: Adicionando a referência do Webservice SharePoint</em></p>  <p><em>&#160;</em></p>  <p align="justify">Criei uma classe chamada Pasta para conter a nossa lógica, ela possui as propriedades ID e Nome e o método RecuperaPasta que faz a busca no SharePoint. A listagem 01 tem a implementação completa da classe.</p>  <p><font face="Courier New">public class Pasta      <br />{       <br />&#160;&#160;&#160; public int ID { get; set; }       <br />&#160;&#160;&#160; public string Nome { get; set; }</font></p>  <p><font face="Courier New">&#160;&#160;&#160; /// &lt;summary&gt;      <br />&#160;&#160;&#160; /// Busca a pasta em uma biblioteca do SharePoint utilizando os webservices       <br />&#160;&#160;&#160; /// &lt;/summary&gt;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160; public void RecuperaPasta(string nomePasta, string nomeBiblioteca)       <br />&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; WebServiceLists.Lists service = new WebServiceLists.Lists();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; service.Url = &quot;</font><a href="https://lab-sp04/_vti_bin/lists.asmx%22;"><font face="Courier New">https://lab-sp04/_vti_bin/lists.asmx&quot;;</font></a>    <br /><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; service.Credentials = new System.Net.NetworkCredential(&quot;usuario&quot;, &quot;senha&quot;, &quot;dominio&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlDocument xDoc = new XmlDocument();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlNode ndQuery = xDoc.CreateNode(XmlNodeType.Element, &quot;Query&quot;, &quot;&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlNode ndViewFields = xDoc.CreateNode(XmlNodeType.Element, &quot;ViewFields&quot;, &quot;&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlNode ndQueryOptions = xDoc.CreateNode(XmlNodeType.Element, &quot;QueryOptions&quot;, &quot;&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ndQuery.InnerXml = &quot;&lt;Where&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;And&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;Eq&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;FieldRef Name=\&quot;FileLeafRef\&quot; /&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;Value Type=\&quot;Text\&quot;&gt;&quot; + nomePasta + &quot;&lt;/Value&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;/Eq&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;Eq&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;FieldRef Name=\&quot;FSObjType\&quot; /&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;Value Type=\&quot;Lookup\&quot;&gt;1&lt;/Value&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;/Eq&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;/And&gt;&quot; +       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;&lt;/Where&gt;&quot;;</font></p>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; ndViewFields.InnerXml = &quot;&quot;;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // O RecursiveAll eh fundamental para que a busca seja feita nas subpastas       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ndQueryOptions.InnerXml = &quot;&lt;QueryOptions&gt;&lt;ViewAttributes Scope=’RecursiveAll’/&gt;&lt;/QueryOptions&gt;&quot;;</font></p>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; XmlNode resultNode = service.GetListItems(nomeBiblioteca, string.Empty, ndQuery, ndViewFields, null, ndQueryOptions, null);</font></p>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Le os nodes de retorno      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach (XmlNode node in resultNode.ChildNodes)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (node.Name == &quot;rs:data&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; node.ChildNodes.Count; i++)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (node.ChildNodes[i].Name == &quot;z:row&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Le os atributos dos nodes       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach (XmlAttribute attr in node.ChildNodes[i].Attributes)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (attr.Name == &quot;ows_ID&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.ID = int.Parse(attr.Value);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else if (attr.Name == &quot;ows_FileRef&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.Nome = attr.Value;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; }       <br />}</font></p>  <p align="center"><em>Listagem 01: Implementação da classe Pasta</em></p>  <p align="center"><em>&#160;</em></p>  <p>Com a implementação da classe Pasta, agora temos que testá-la. A listagem 02 mostra as chamadas de teste.</p>  <p><font face="Courier New">class Program      <br />{       <br />&#160;&#160;&#160; static void Main(string[] args)       <br />&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Pasta pasta = new Pasta();</font></p>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;Obtendo Pasta1&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; pasta.RecuperaPasta(&quot;Pasta1&quot;, &quot;Documentos&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format(&quot;ID: {0} – Pasta: {1}&quot;, pasta.ID.ToString(), pasta.Nome));</font></p>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;Obtendo PastaA&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; pasta.RecuperaPasta(&quot;PastaA&quot;, &quot;Documentos&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format(&quot;ID: {0} – Pasta: {1}&quot;, pasta.ID.ToString(), pasta.Nome));</font></p>  <p><font face="Courier New">&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(&quot;Obtendo Folder1&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; pasta.RecuperaPasta(&quot;Folder1&quot;, &quot;Documentos&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.WriteLine(string.Format(&quot;ID: {0} – Pasta: {1}&quot;, pasta.ID.ToString(), pasta.Nome));       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Console.ReadKey();       <br />&#160;&#160;&#160; }       <br />}</font></p>  <p align="center"><em>Listagem 02: Testando a classe Pasta</em></p>  <p><em>&#160;</em></p>  <p>Ao executar o teste, o resultado exibido na imagem 02 é exibido.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/5488.WebService_CAML_GetFolderByName01_4B7D37D0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/5488.WebService_5F00_CAML_5F00_GetFolderByName01_5F00_4B7D37D0.png"><img title="WebService_CAML_GetFolderByName01" style="display: inline; background-image: none;" border="0" alt="WebService_CAML_GetFolderByName01" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/1462.WebService_CAML_GetFolderByName01_thumb_6A53ABAE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/1462.WebService_5F00_CAML_5F00_GetFolderByName01_5F00_thumb_5F00_6A53ABAE.png" width="604" height="302" /></a></p>  <p align="center"><em>Imagem 02: Executando a pesquisa das pastas</em></p>  <p><em>&#160;</em></p>  <p>Verifique que as três chamadas do método foram executadas com sucesso, retornando o ID e o Nome da pasta e apenas uma pasta por vez.</p>  <p>&#160;</p>  <p><strong>Referências</strong></p>  <ul>   <li>SharePoint 2010 Client Object Model (<a href="https://msdn.microsoft.com/en-us/library/ee537247%28v=office.14%29.aspx">https://msdn.microsoft.com/en-us/library/ee537247%28v=office.14%29.aspx</a>) </li>    <li>SharePoint Foundation REST Interface (<a href="https://msdn.microsoft.com/en-us/library/ff521587%28v=office.14%29.aspx">https://msdn.microsoft.com/en-us/library/ff521587%28v=office.14%29.aspx</a>) </li>    <li>     <p>Search document from document library usin CAML query (<a href="https://sharepoint.stackexchange.com/questions/59323/search-document-from-document-library-usin-caml-query">https://sharepoint.stackexchange.com/questions/59323/search-document-from-document-library-usin-caml-query</a>)</p>   </li>    <li>     <p>Recuperar ID de pasta na Biblioteca usando Web Services (<a href="https://social.msdn.microsoft.com/Forums/pt-BR/sharepointpt/thread/b5d622a1-96d7-4f4b-9e17-05fc365c15d4">https://social.msdn.microsoft.com/Forums/pt-BR/sharepointpt/thread/b5d622a1-96d7-4f4b-9e17-05fc365c15d4</a>)</p>   </li> </ul>]]></content:encoded>
    </item>
    <item>
      <title>Editando o E-mail da Tarefa Atribuída do Processo de Aprovação do Workflow do SharePoint 2010</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/editando-o-e-mail-da-tarefa-atribuda-do-processo-de-aprovao-do-workflow-do-sharepoint-2010</link>
      <pubDate>Thu, 23 May 2013 00:21:00 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/23/editando-o-e-mail-da-tarefa-atribuda-do-processo-de-aprovao-do-workflow-do-sharepoint-2010/</guid>
      <description><![CDATA[O workflow do SharePoint 2010 é muito rico em detalhes que muitas vezes são inexplorados. Um deles é...]]></description>
      <content:encoded><![CDATA[<p align="justify">O <a href="https://fabiangehrke.com.br/category/workflows/">workflow</a> do SharePoint 2010 é muito rico em detalhes que muitas vezes são inexplorados. Um deles é o processo de aprovação, que nos permite customizar a interação do usuário com as tarefas de workflow de uma forma mais rica.</p>  <p align="justify">Neste post vou mostrar como editar o e-mail de tarefa atribuída que o workflow envia, mas o conteúdo deste post pode ser utilizado em outras customizações desta atividade.</p>  <p align="justify">Este workflow foi criado e executado no SharePoint Designer 2013 e SharePoint 2013, mas feito com o <a href="https://fabiangehrke.com.br/2013/05/09/sharepoint-2013-workflows-engine-2010-vs-engine-2013/">engine 2010</a>, o que significa que pode ser feito no SharePoint 2010.</p>  <p align="justify">O processo de aprovação que vamos ver neste post é muito rico em seu uso. Ele, e o processo customizado de aprovação, são as únicas formas de customizarmos as mensagens com usuários como título e corpo da tarefa e e-mails. Os demais tipos, como: atribuir uma tarefa ou coletar dado de um usuário são estáticos. A diferença entre o processo customizado e o que vamos utilizar aqui, é que o customizado vem “zerado”, ou seja, você tem que fazer tudo dentro dele. Este aqui já vem pronto e acaba sendo mais fácil editar algo do que criar um novo. Por isso a escolha do processo de aprovação neste post.</p>  <p align="justify">Depois de criado o workflow adicione a atividade “Iniciar Processo de Aprovação”, conforme a imagem 01.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/4604.CustamApprovalTask01_3E214EA3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/4604.CustamApprovalTask01_5F00_3E214EA3.png"><img title="CustamApprovalTask01" style="display: inline; background-image: none;" border="0" alt="CustamApprovalTask01" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/3021.CustamApprovalTask01_thumb_424B2668.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/3021.CustamApprovalTask01_5F00_thumb_5F00_424B2668.png" width="604" height="414" /></a></p>  <p align="center"><em>Imagem 01: Adicionando a tarefa Iniciar Processo de Aprovação</em></p>  <p align="center"><em>&#160;</em></p>  <p>Clique no nome do processo, conforme imagem 02, para editá-lo.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/1727.CustamApprovalTask02_1887AB75.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/1727.CustamApprovalTask02_5F00_1887AB75.png"><img title="CustamApprovalTask02" style="display: inline; background-image: none;" border="0" alt="CustamApprovalTask02" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/3264.CustamApprovalTask02_thumb_243CF2A7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/3264.CustamApprovalTask02_5F00_thumb_5F00_243CF2A7.png" width="604" height="426" /></a></p>  <p align="center"><em>Imagem 02: Editando o processo de aprovação</em></p>  <p align="center"><em>&#160;</em></p>  <p align="justify">Entre na opção <em>Modificar o comportamento de tarefa única</em>, conforme a imagem 03, que nos permitirá editar o comportamento individual de cada tarefa criada neste processo, caso existam mais.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/6765.CustamApprovalTask03_73C66E30.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/6765.CustamApprovalTask03_5F00_73C66E30.png"><img title="CustamApprovalTask03" style="display: inline; background-image: none;" border="0" alt="CustamApprovalTask03" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/6232.CustamApprovalTask03_thumb_2649CBA3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/6232.CustamApprovalTask03_5F00_thumb_5F00_2649CBA3.png" width="604" height="426" /></a></p>  <p align="center"><em>Imagem 03: Modificando o comportamento da tarefa do processo de aprovação</em></p>  <p align="center"><em>&#160;</em></p>  <p align="justify">A janela que abriu mostra algumas fases do processo de tarefas, onde podemos editar/adicionar atividades antes da tarefa ser criada, enquanto está pendente, quando expirada e quando completada. Role o scroll até a seção “enquanto está pendente” e procure o trecho selecionado na imagem 04. Veja que tem uma atividade de enviar e-mail para o usuário que está responsável pela tarefa. Clique nesta atividade para alterarmos sua configuração.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/3808.CustamApprovalTaskA_03395A33.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/3808.CustamApprovalTaskA_5F00_03395A33.png"><img title="CustamApprovalTaskA" style="display: inline; background-image: none;" border="0" alt="CustamApprovalTaskA" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/7103.CustamApprovalTaskA_thumb_0BD9B2BF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/7103.CustamApprovalTaskA_5F00_thumb_5F00_0BD9B2BF.png" width="604" height="426" /></a></p>  <p align="center"><em>Imagem 04: Editando o e-mail para o usuário responsável pela tarefa</em></p>  <p align="center"><em>&#160;</em></p>  <p align="justify">A tela com as configurações do e-mail foi exibida, posicione o cursor no local indicado na imagem e digite “O ID desta tarefa é “ e então clique no botão “Add or Change Lookup”. A tela para adicionar o lookup é exibida, selecione os valores conforme exemplo da imagem 05.</p>  <p align="justify">Muito dificilmente você irá exibir o ID desta forma, é apenas um exemplo, mas você pode criar links customizados utilizando essas informações, editar o e-mail para o usuário e atender diversas necessidades de negócio que não seriam possíveis se não fosse o processo de aprovação.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/8032.CustamApprovalTaskB_7DBAC3C1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/8032.CustamApprovalTaskB_5F00_7DBAC3C1.png"><img title="CustamApprovalTaskB" style="display: inline; background-image: none;" border="0" alt="CustamApprovalTaskB" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/1513.CustamApprovalTaskB_thumb_065B1C4E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/1513.CustamApprovalTaskB_5F00_thumb_5F00_065B1C4E.png" width="604" height="426" /></a></p>  <p align="center"><em>Imagem 05: Adicionando o ID da tarefa no e-mail da tarefa</em></p>  <p align="center"><em>&#160;</em></p>  <p align="justify">Volte ao workflow principal e termine de editar o processo de aprovação, clique em “these users” conforme a imagem 06.</p>  <p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/3034.CustamApprovalTask11_783C2D50.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/3034.CustamApprovalTask11_5F00_783C2D50.png"><img title="CustamApprovalTask11" style="display: inline; background-image: none;" border="0" alt="CustamApprovalTask11" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/8875.CustamApprovalTask11_thumb_6EFFF20F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/8875.CustamApprovalTask11_5F00_thumb_5F00_6EFFF20F.png" width="604" height="426" /></a></p>  <p align="center"><em>Imagem 06: Terminando a edição do processo de aprovação</em></p>  <p align="center"><em>&#160;</em></p>  <p align="justify">Edite as informações da tarefa, tais como: responsável, título, corpo e data de vencimento, conforme a imagem 07.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/4530.CustamApprovalTask12_6C76C051.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/4530.CustamApprovalTask12_5F00_6C76C051.png"><img title="CustamApprovalTask12" style="margin-right: auto; margin-left: auto; float: none; display: block; background-image: none;" border="0" alt="CustamApprovalTask12" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/57/96/metablogapi/2262.CustamApprovalTask12_thumb_7C365555.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-57-96-metablogapi/2262.CustamApprovalTask12_5F00_thumb_5F00_7C365555.png" width="604" height="426" /></a></p>  <p align="center"><em>Imagem 07: Editando o corpo da tarefa</em></p>  <p align="center"><em>&#160;</em></p>  <p align="justify">O processo de customizar o e-mail enviado ao responsável pela tarefa do workflow foi concluído. Agora você pode editar as configurações do workflow, como fazer com que ele seja iniciado automaticamente, publicar o workflow e então testar o e-mail recebido.</p>  <p align="justify">Aqui mostrei apenas algo simples, mas aproveite para aprender mais sobre esta atividade que os resultados serão fantásticos.</p>]]></content:encoded>
    </item>
    <item>
      <title>Exibindo Formulários InfoPath em Páginas do Site</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/exibindo-formulrios-infopath-em-pginas-do-site</link>
      <pubDate>Fri, 10 May 2013 12:49:03 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/10/exibindo-formulrios-infopath-em-pginas-do-site/</guid>
      <description><![CDATA[Os formul&aacute;rio InfoPath sempre s&atilde;o utilizados dentro de alguma biblioteca de...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;" align="justify">Os formul&aacute;rio InfoPath sempre s&atilde;o utilizados dentro de alguma biblioteca de formul&aacute;rios ou documentos. No final das contas um formul&aacute;rio InfoPath n&atilde;o passa de um arquivo XML relacionado a um template XSN, essas estruturas s&atilde;o os locais corretos para armazenar esses formul&aacute;rios.</p>
<p style="text-align: justify;" align="justify">Mas &eacute; poss&iacute;vel exibir os formul&aacute;rios diretamente em uma p&aacute;gina?</p>
<p style="text-align: justify;" align="justify">Neste post vou mostrar como exibir os formul&aacute;rios em p&aacute;ginas utilizando a web part nativa do SharePoint de exibi&ccedil;&atilde;o de formul&aacute;rio InfoPath.</p>
<p><a class="more-link" href="https://fabiangehrke.com.br/2012/07/15/exibindo-formulrios-infopath-em-pginas-do-site/#more-740">Leia o resto deste post &raquo;</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Primeira Visão do SharePoint 2013–Página Principal</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/primeira-viso-do-sharepoint-2013pgina-principal</link>
      <pubDate>Fri, 10 May 2013 12:48:38 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/10/primeira-viso-do-sharepoint-2013pgina-principal/</guid>
      <description><![CDATA[O dia 16/07 foi&nbsp;um dia muito importante para os SharePointers, foi anunciado oficialmente o...]]></description>
      <content:encoded><![CDATA[<p align="justify">O dia 16/07 foi&nbsp;um dia muito importante para os SharePointers, foi anunciado oficialmente o Office 2013 Preview e com ele todos os produtos relacionados, entre eles o SharePoint 2013.</p>
<p align="justify">Neste post vou mostrar a p&aacute;gina principal do SharePoint 2013 que est&aacute; no Office 365 Preview, vai ser apenas uma p&aacute;gina, mas j&aacute; d&aacute; uma boa impress&atilde;o das novidades.</p>
<p><a class="more-link" href="https://fabiangehrke.com.br/2012/07/16/primeira-viso-do-sharepoint-2013/#more-773">Leia o resto deste post &raquo;</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Novo Conceito no SharePoint 2013: Apps</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/novo-conceito-no-sharepoint-2013-apps</link>
      <pubDate>Fri, 10 May 2013 12:47:57 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/10/novo-conceito-no-sharepoint-2013-apps/</guid>
      <description><![CDATA[Ums das primeiras coisas que fui fazer no SharePoint Online do Office 365 Preview foi criar uma...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;" align="justify">Ums das primeiras coisas que fui fazer no SharePoint Online do Office 365 Preview foi criar uma lista, como de costume fui no menu a&ccedil;&otilde;es do site, que agora &eacute; um &iacute;cone, e procurei a op&ccedil;&atilde;o para criar uma lista ou biblioteca. A op&ccedil;&atilde;o n&atilde;o estava mais l&aacute;, ent&atilde;o acessei a op&ccedil;&atilde;o &ldquo;Add an app&rdquo;.</p>
<p style="text-align: justify;">Neste post vamos ver mais sobre o conceito de apps do SharePoint 2013 Preview.</p>
<p><a class="more-link" href="https://fabiangehrke.com.br/2012/07/16/novo-conceito-no-sharepoint-2013-apps/#more-780">Leia o resto deste post &raquo;</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Workflows no SharePoint Designer 2013</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/workflows-no-sharepoint-designer-2013</link>
      <pubDate>Fri, 10 May 2013 12:47:20 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/10/workflows-no-sharepoint-designer-2013/</guid>
      <description><![CDATA[Os recursos de Workflow do SharePoint sempre andaram pela zona dos meus recursos favoritos. Eu acho...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;" align="justify">Os recursos de Workflow do SharePoint sempre andaram pela zona dos meus recursos favoritos. Eu acho fant&aacute;stico as possibilidades e as capacidades de entraga, &eacute; muito bacana trabalhar com Workflows no SharePoint.</p>
<p style="text-align: justify;" align="justify">Pois &eacute;, &eacute; com muita alegria que falo para voc&ecirc;s que os recursos do SharePoint Designer para cria&ccedil;&atilde;o de workflows est&atilde;o ainda melhores, neste post vamos ver uma vis&atilde;o geral.</p>
<p><a class="more-link" href="https://fabiangehrke.com.br/2012/07/18/workflows-no-sharepoint-designer-2013/#more-795">Leia o resto deste post &raquo;</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Adicionando Apps da SharePoint Store no SharePoint Online Preview</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/adicionando-apps-da-sharepoint-store-no-sharepoint-online-preview</link>
      <pubDate>Fri, 10 May 2013 12:46:57 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/10/adicionando-apps-da-sharepoint-store-no-sharepoint-online-preview/</guid>
      <description><![CDATA[No post Novo Conceito no SharePoint 2013: Apps falei sobre o conceito de apps que agora est&aacute;...]]></description>
      <content:encoded><![CDATA[<p>No post <a href="https://fabiangehrke.com.br/2012/07/16/novo-conceito-no-sharepoint-2013-apps/">Novo Conceito no SharePoint 2013: Apps</a> falei sobre o conceito de apps que agora est&aacute; presente no SharePoint 2013. Neste post vou falar de como utilizar apps que est&atilde;o dispon&iacute;veis na store do SharePoint utilizando o SharePoint Online que est&aacute; no Office 365 Preview.</p>
<p><a class="more-link" href="https://fabiangehrke.com.br/2012/07/20/adicionando-apps-da-sharepoint-store-no-sharepoint-online-preview/#more-835">Leia o resto deste post &raquo;</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Fazendo a Configuração da Farm no Modo Automático no SharePoint 2013</title>
      <link>https://docs.microsoft.com/archive/blogs/fabiangehrke/fazendo-a-configurao-da-farm-no-modo-automtico-no-sharepoint-2013</link>
      <pubDate>Fri, 10 May 2013 12:46:29 GMT</pubDate>
      <dc:creator><![CDATA[fabiangehrke]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/fabiangehrke/2013/05/10/fazendo-a-configurao-da-farm-no-modo-automtico-no-sharepoint-2013/</guid>
      <description><![CDATA[Depois do SharePoint instalado e da Farm criada, o pr&oacute;ximo passo &eacute; fazer a...]]></description>
      <content:encoded><![CDATA[<p style="text-align: justify;" align="justify">Depois do SharePoint instalado e da Farm criada, o pr&oacute;ximo passo &eacute; fazer a configura&ccedil;&atilde;o dos aplicativos de servi&ccedil;o (Service Applications). S&atilde;o eles que nos possibilitam recursos como Busca, Excel Services, Access Services, Perfil de Usu&aacute;rios, Visio Services, entre outros.</p>
<p style="text-align: justify;" align="justify">Existem duas maneiras de criar os aplicativos de servi&ccedil;o: manualmente, criando servi&ccedil;o por servi&ccedil;o, onde o trabalho &eacute; maior mas o n&iacute;vel de controle tamb&eacute;m superior. Podemos informar quais usu&aacute;rios que ir&atilde;o executar o servi&ccedil;o, nome do banco de dados e outras, isso tudo depende do tipo do servi&ccedil;o de aplicativo. A outra forma &eacute; utilizar o wizard de configura&ccedil;&atilde;o da Farm, ele faz tudo com as configura&ccedil;&otilde;es padr&atilde;o e facilitam muito na configura&ccedil;&atilde;o da Farm. Mas &eacute; importante ressaltar que ele n&atilde;o deve ser usado em todos os ambientes, cen&aacute;rios mais simples s&atilde;o uma boa op&ccedil;&atilde;o, cen&aacute;rios m&eacute;dios deve ser considerado e cen&aacute;rios complexos muito dificilmente utiliza-se.</p>
<p style="text-align: justify;" align="justify">Neste post vamos ver mais detalhes sobre o wizard de configura&ccedil;&atilde;o da Farm no SharePoint 2013.</p>
<p><a class="more-link" href="https://fabiangehrke.com.br/2012/07/21/fazendo-a-configurao-da-farm-no-modo-automtico-no-sharepoint-2013-preview/#more-854">Leia o resto deste post &raquo;</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>