SharePoint 4 Developers

Guia de referência adicional em desenvolvimento .NET / SharePoint

Configurando Formatação Condicional Programaticamente

Aprenda a como aplicar a formatação condicional em List Views manualmente e programaticamente usando o SharePoint Designer 2010 e Visual Studio 2010 respectivamente.

Oi pessoal,

Hoje quero falar um pouco sobre formatação condicional, que permite aplicarmos estilos HTML em views dependendo de critérios especificados. Isso não é algo novo no SharePoint, pois desde o MOSS 2007 isso já existia.

Nesse post vou demonstrar como aplicar formatação condicional de forma manual e programática. Fiquem ligados!

Formatação condicional no SharePoint Designer 2010

Tomemos como exemplo a lista de Grades (Notas) abaixo. Basicamente a idéia é implementar uma seleção de cores na coluna Grade para diferenciar as notas. Com base nessas notas as cores irão variar.

1_6804
Figura 1 – Lista de Grades (Notas)

Ao utilizar o SharePoint Designer 2010, essa customização fica fácil. Vá até a Lista de Grades no SharePoint Designer 2010 e abra a view chamada “All Items”, conforme Figura 2:

2_6804
Figura 2 – All Items view

O interessante é que a view pode ser visualizada de 2 maneiras (Design e Code), o que facilita nosso trabalho. Siga os passos conforme demonstrado na Figura 3 e a formatação condicional será aplicada na coluna Grade.

3_6804
Figura 3 – Formatação Condicional no SharePoint 2010

Logo após o passo 3 acima, um popup solicitará que você especifique um critério para sua condição, em outras palavras uma regra, que definirá quando aplicar as cores corretas na Lista de Grades (Notas).

44
Figura 4 – Condition Criteria

De acordo com a regr acima, defina a cor de fundo (background colour) para Verde.

OBS: Cores diferentes serão aplicadas a diferentes regras criadas.

54
Figura 5 – Background colour

Depois de configurar a regra, a formatação condicional pode ser visualizada pelas cores disponíveis, conforme Figura 6:

6_6804
Figura 6 – Cores da Formatação Condicional

A barra da formatação condicional é bastante clara, exibe todas as regras criadas. Isso permite que você configure os estilos a qualquer momento. Bastante útil!

No final obteremos a Lista de Grades desse jeito, conforme Figura 7:

7_6804
Figura 7 – Formatação Condicional aplicada à Lista de Grades (Notas)

Formatação condicional no Visual Studio 2010

Até o momento vimos como definir formatação condicional manualmente. Agora veremos como definí-la programaticamente!

Primeiro de tudo identifique a seção Xsl (da Figura 6), copie todo o conteúdo dessa seção em um arquivo xsl, conforme o código abaixo:

Code Snippet
  1. <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal" xmlns:o="urn:schemas-microsoft-com:office:office">
  2.   <xsl:include href="/_layouts/xsl/main.xsl"/>
  3.   <xsl:include href="/_layouts/xsl/internal.xsl"/>
  4.   <xsl:param name="AllRows" select="/dsQueryResponse/Rows/Row[$EntityName = '' or (position() &gt;= $FirstRow and position() &lt;= $LastRow)]"/>
  5.   <xsl:param name="dvt_apos">&apos;</xsl:param>
  6.   <xsl:template name="FieldRef_printTableCell_EcbAllowed.Grade" match="FieldRef[@Name='Grade']" mode="printTableCellEcbAllowed" ddwrt:dvt_mode="body" ddwrt:ghost="" xmlns:ddwrt2="urn:frontpage:internal">
  7.     <xsl:param name="thisNode" select="."/>
  8.     <xsl:param name="class" />
  9.     <td>
  10.       <xsl:attribute name="style">
  11.         <xsl:if test="normalize-space($thisNode/@Grade) = 'A'" ddwrt:cf_explicit="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">background-color: #009900;</xsl:if>
  12.         <xsl:if test="normalize-space($thisNode/@Grade) = 'B'" ddwrt:cf_explicit="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">background-color: #66FF33;</xsl:if>
  13.         <xsl:if test="normalize-space($thisNode/@Grade) = 'C'" ddwrt:cf_explicit="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">background-color: #FFFF00;</xsl:if>
  14.         <xsl:if test="normalize-space($thisNode/@Grade) = 'D'" ddwrt:cf_explicit="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">background-color: #FF9900;</xsl:if>
  15.         <xsl:if test="normalize-space($thisNode/@Grade) = 'E'" ddwrt:cf_explicit="1" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime">background-color: #FF0000;</xsl:if>
  16.       </xsl:attribute>
  17.  
  18.       <xsl:if test="@ClassInfo='Menu' or @ListItemMenu='TRUE'">
  19.         <xsl:attribute name="height">100%</xsl:attribute>
  20.         <xsl:attribute name="onmouseover">OnChildItem(this)</xsl:attribute>
  21.       </xsl:if>
  22.       <xsl:attribute name="class">
  23.         <xsl:call-template name="getTDClassValue">
  24.           <xsl:with-param name="class" select="$class" />
  25.           <xsl:with-param name="Type" select="@Type"/>
  26.           <xsl:with-param name="ClassInfo" select="@ClassInfo"/>
  27.         </xsl:call-template>
  28.       </xsl:attribute>
  29.       <xsl:apply-templates select="." mode="PrintFieldWithECB">
  30.         <xsl:with-param name="thisNode" select="$thisNode"/>
  31.       </xsl:apply-templates>
  32.     </td>
  33.   </xsl:template>
  34. </xsl:stylesheet>

OBS: O SharePoint Designer 2010 cria uma subsection chamada xsl:attribute para armazenar a formatação condicional que você criou (Linhas 10 a 16).

Nesse exemplo criei uma feature para o deploy da Lista de Grades. Observe a estrutura da solução para você ter uma idéia do que ela é constituída:

94
Figura 8 – Solução da Formatação Condicional

OBS: Os arquivos xsl no SharePoint 2010 precisam ser disponibilizados no diretório Layouts\Xsl.

Para fazer o deploy da Lista de Grades, codifiquei o método FeatureActivated (disponível no Event Receiver da feature):

Code Snippet
  1. public override void FeatureActivated(SPFeatureReceiverProperties properties)
  2. {
  3.     SPWeb web = (SPWeb)properties.Feature.Parent;
  4.  
  5.     string grades = "Grades";
  6.  
  7.     if (web.Lists.TryGetList(grades) == null)
  8.     {
  9.         // Creating list
  10.         Guid listGuid = web.Lists.Add(grades, "", SPListTemplateType.GenericList);
  11.         SPList list = web.Lists[listGuid];
  12.         list.OnQuickLaunch = true;
  13.  
  14.         // Configuring fields
  15.         SPField title = list.Fields["Title"];
  16.         title.Title = "Name";
  17.         title.Update(true);
  18.  
  19.         list.Fields.Add("Grade", SPFieldType.Text, true);
  20.  
  21.         // Updating view
  22.         SPView mainView = list.Views[0];
  23.         mainView.ViewFields.DeleteAll();
  24.         mainView.ViewFields.Add("Attachments");
  25.         mainView.ViewFields.Add("LinkTitle");
  26.         mainView.ViewFields.Add("Grade");
  27.         mainView.XslLink = "ConditionalFormattingXsl/grades.xsl";
  28.         mainView.Update();
  29.  
  30.         // Saving changes
  31.         list.Update();
  32.     }
  33. }

OBS: Preste atenção na linha 27. Ela que faz o serviço! Sensacional.

Uma vez que a solução foi disponibilizada, ative-a e você obterá a Lista de Grades criada com a Formatação Condicional aplicada automaticamente.

8_6804
Figura 9 – Feature criada

Faça o download da solução aqui.

Para facilitar as coisas, sempre utilize o SharePoint Designer para criar formatação condicional em suas views. Então copie a seção Xsl e cole em um arquivo xsl. Evite dores de cabeça.

Espero que isso tenha te ajudado.

Referências:
http://stefan-stanev-sharepoint-blog.blogspot.com/2010/08/xsltlistviewwebpart-several-xslt-tips.html
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spview.xsllink.aspx
http://office.microsoft.com/en-us/sharepoint-designer-help/apply-conditional-formatting-to-a-data-view-HA010099624.aspx

[]’s,

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.

Artigo publicado na Revista .net Magazine

O artigo mostrar&#225; ao leitor uma introdu&#231;&#227;o ao funcionamento de Web Parts e como desenvolver Visual Web Parts para deploy no SharePoint 2010, mostrando as novidades no desenvolvimento com o Visual Studio 2010 e como usufruir os recursos que a ferramenta oferece.
 capaOnline_net80small

Oi pessoal, tudo bem?

Gostaria de informar a todos que na Revista .net Magazine edição 80 meu artigo exclusivo sobre desenvolvimento de WebParts no SharePoint 2010 foi publicado. Seguem mais detalhes:

Do que trata o artigo

O artigo mostrará ao leitor uma introdução ao funcionamento de Web Parts e como desenvolver Visual Web Parts para deploy no SharePoint 2010, mostrando as novidades no desenvolvimento com o Visual Studio 2010 e como usufruir os recursos que a ferramenta oferece.

Para que serve

Uma maneira de customizar sites e portais no SharePoint é através da adição de Web Parts. O Visual Studio 2010 torna-se agora um poderoso aliado no desenvolvimento para o SharePoint 2010 e traz novos templates para desenvolvimento. Visual Web Parts estão entre esses novos templates que facilitam o trabalho do desenvolvedor.

Em que situação o tema é útil

Com o lançamento do SharePoint 2010 muitos desenvolvedores .NET podem iniciar o desenvolvimento nessa plataforma com mais facilidade e sem apuros, ao contrário das versões anteriores que dificultavam o acesso de novos desenvolvedores. Esse artigo traz uma abordagem para desenvolvedores .NET que desejam se beneficiar das novas funcionalidades do Visual Studio 2010 para o desenvolvimento no SharePoint 2010.

Acredito que vocês vão gostar! Já nas bancas!

Link para a revista: http://www.devmedia.com.br/post-18775-Revista--net-Magazine-Edicao-80.html

[]’s

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.

Business Connectivity Services – Parte III

Nessa abordagem aprenda a integrar servi&#231;os WCF no SharePoint 2010 pelo Business Connectivity Services. Essa &#233; uma abordagem bem interessante, pois permite que diferentes servi&#231;os (inclusive da nuvem) possam ser integrados no SharePoint 2010.

Oi pessoal, tudo bem?

Depois de umas mini-férias trago mais uma parte da série sobre o BCS, onde abordo como conectar a diferentes fontes de dados externos.

Nessa abordagem aprenda a integrar serviços WCF no SharePoint 2010 pelo Business Connectivity Services. Essa é uma abordagem bem interessante, pois permite que diferentes serviços (inclusive da nuvem) possam ser integrados no SharePoint 2010.

Para a apresentação desse artigo criaremos um serviço WCF, que servirá para a criação de um External Content Type (ECT).

Criação de ECTs via Web Service (WCF)

Para a criação de ECTs via Web Service necessitamos da utilização do SPD2010 e nesse caso, como iremos criar um Web Service, necessitamos do VS2010.

Esse tipo de abordagem é aplicado em ambientes que:

  • Façam integração com uma fonte de dados externos (ex: outros sistemas), quer seja em sua Intranet ou Internet;
  • Haja a necessidade de criação de regras de negócio, o que pode ser implementado durante a criação do Web Service;
  • Utilizem bancos de dados diferentes do SQL Server, o que pode ser implementado na camada de acesso a dados durante a criação do Web Service;

Caso você tenha esse cenário, essa implementação tem um nível maior de dificuldade pela criação do Web Service, que é demonstrado a seguir. Inicialmente trabalharemos com o VS2010 e em seguida finalizaremos a configuração com o SPD2010.

Trabalhando com o Visual Studio 2010

A criação do ECT em questão só é possível com a existência de um Web Service, para tal criaremos uma solução no VS2010. Conforme já mencionado no Bloco 1 da Arquitetura do BCS (Parte I), ambas as extensões .asmx (ASP.NET Web Service Application) e .svc (WCF Service Application) podem ser utilizadas na criação de ECTs e nessa demonstração vou utilizar um WCF Service Application.

Inicie o VS2010, crie uma Blank Solution e adicione 3 projetos conforme a Figura 1:

solution

Figura 1 - Criação da Solução

OBS: Com relação aos arquivos *.cs e App.config disponibilizados por padrão quando da criação de novos projetos, favor excluí-los.

A solução foi separada em projetos que refletem as camadas de acesso a dados e negócio que veremos a seguir. É necessário antes que as seguintes referências sejam adicionadas entre os projetos conforme a Tabela 1:

Projeto Referência
ContactServices.Business ContactServices.Data
ContactServices.Host ContactServices.Business
Tabela 1 - Referências

OBS: Em todos os exemplos de código, meu objetivo é de mostrar apenas a funcionalidade na criação de um ECT no SharePoint 2010, portanto utilize o código como base e implemente os tratamentos que toda aplicação necessita possuir (ex: Logs, Exceções, Segurança, etc...). Recomendo a utilização do Enterprise Library.

Camada de Acesso a Dados

Para a criação do projeto ContactServices.Data precisamos adicionar alguns objetos que manipulem o banco de dados, e para fins de demonstração utilizo o LINQ to SQL por ser mais simples de implementar. Adicione esse objeto ao projeto e o nomeie de Dev.dbml, em seguida crie pelo Server Explorer uma nova conexão que utilize Windows Authentication, abra o database e arraste a tabela Contact (Parte II) conforme demonstrado na Figura 2:

LINQtoSQL

Figura 2 - Adição da tabela Contact

Para manipularmos os dados do objeto Contact é necessário criarmos uma classe que disponibilize métodos de um CRUD, para isso crie uma classe chamada ContactManager e adicione o código abaixo, cujos comentários são bem explicativos:

Code Snippet
  1. public class ContactManager
  2. {
  3.     /// <summary>
  4.     /// Obtem todos os Contatos
  5.     /// </summary>
  6.     /// <returns>Array de Contatos</returns>
  7.     public Contact[] GetContacts()
  8.     {
  9.         var contacts = new List<Contact>();
  10.  
  11.         using (DevDataContext dev = new DevDataContext())
  12.         {
  13.             contacts = (from cont in dev.Contacts
  14.                         select cont).ToList();
  15.         }
  16.         return contacts.ToArray();
  17.     }
  18.  
  19.     /// <summary>
  20.     /// Obtem um Contato especifico
  21.     /// </summary>
  22.     /// <param name="contactId">Id do Contato</param>
  23.     /// <returns>Retorna o Contato</returns>
  24.     public Contact GetContactById(int contactId)
  25.     {
  26.         var contact = new Contact();
  27.  
  28.         using (DevDataContext dev = new DevDataContext())
  29.         {
  30.             contact = (from cont in dev.Contacts
  31.                         where cont.ContactID == contactId
  32.                         select cont).First();
  33.         }
  34.         return contact;
  35.     }
  36.  
  37.     /// <summary>
  38.     /// Atualiza um Contato especifico
  39.     /// </summary>
  40.     /// <param name="contact">Contato para atualizacao</param>
  41.     public void UpdateContact(Contact contact)
  42.     {
  43.         var contactDB = new Contact();
  44.  
  45.         using (DevDataContext dev = new DevDataContext())
  46.         {
  47.             contactDB = (from cont in dev.Contacts
  48.                             where cont.ContactID == contact.ContactID
  49.                             select cont).First();
  50.  
  51.             // Alterando o objeto
  52.             contactDB.Address = contact.Address;
  53.             contactDB.City = contact.City;
  54.             contactDB.CompanyName = contact.CompanyName;
  55.             contactDB.ContactName = contact.ContactName;
  56.             contactDB.ContactTitle = contact.ContactTitle;
  57.             contactDB.Country = contact.Country;
  58.             contactDB.Email = contact.Email;
  59.             contactDB.Fax = contact.Fax;
  60.             contactDB.Phone = contact.Phone;
  61.             contactDB.PostalCode = contact.PostalCode;
  62.             contactDB.Region = contact.Region;
  63.  
  64.             dev.Refresh(System.Data.Linq.RefreshMode.KeepChanges, contactDB);
  65.             dev.SubmitChanges();
  66.         }
  67.     }
  68.  
  69.     /// <summary>
  70.     /// Adiciona um Contato
  71.     /// </summary>
  72.     /// <param name="contact">Novo Contato</param>
  73.     public void AddContact(Contact contact)
  74.     {
  75.         using (DevDataContext dev = new DevDataContext())
  76.         {
  77.             dev.Contacts.InsertOnSubmit(contact);
  78.             dev.SubmitChanges();
  79.         }
  80.     }
  81.  
  82.     /// <summary>
  83.     /// Apaga um Contato
  84.     /// </summary>
  85.     /// <param name="contactId">Id do Contato</param>
  86.     public void DeleteContact(int contactId)
  87.     {
  88.         using (DevDataContext dev = new DevDataContext())
  89.         {
  90.             var contact = (from cont in dev.Contacts
  91.                             where cont.ContactID == contactId
  92.                             select cont).First();
  93.             dev.Contacts.DeleteOnSubmit(contact);
  94.             dev.SubmitChanges();
  95.         }
  96.     }
  97. }

Camada de Negócio

No projeto ContactServices.Business devemos disponibilizar Interfaces e Classes que façam chamadas aos métodos do projeto ContactServices.Data. A criação de Interfaces é importante por 3 motivos na solução:

  • Definição de um contrato para os métodos;
  • Determina um comportamento nas classes que a implementam;
  • Utilização pelo WCF Service Application (projeto ContactServices.Host);

Para implementação do projeto, crie a interface IContactServices e a classe que a implementa chamada ContactServices, conforme os códigos abaixo respectivamente:

Code Snippet
  1. [ServiceContract]
  2. public interface IContactServices
  3. {
  4.     [OperationContract]
  5.     Contact[] GetContacts();
  6.  
  7.     [OperationContract]
  8.     Contact GetContactById(int contactId);
  9.  
  10.     [OperationContract]
  11.     void UpdateContact(Contact contact);
  12.  
  13.     [OperationContract]
  14.     void AddContact(Contact contact);
  15.  
  16.     [OperationContract]
  17.     void DeleteContact(int contactId);
  18. }

 

Code Snippet
  1. public class ContactServices : IContactServices
  2. {
  3.     #region IContactServices Members
  4.  
  5.     public Contact[] GetContacts()
  6.     {
  7.         // Implemente sua propria regra de negocio
  8.         return new ContactManager().GetContacts();
  9.     }
  10.  
  11.     public Contact GetContactById(int contactId)
  12.     {
  13.         // Implemente sua propria regra de negocio
  14.         return new ContactManager().GetContactById(contactId);
  15.     }
  16.  
  17.     public void UpdateContact(Contact contact)
  18.     {
  19.         // Implemente sua propria regra de negocio
  20.         new ContactManager().UpdateContact(contact);
  21.     }
  22.  
  23.     public void AddContact(Contact contact)
  24.     {
  25.         // Implemente sua propria regra de negocio
  26.         new ContactManager().AddContact(contact);
  27.     }
  28.  
  29.     public void DeleteContact(int contactId)
  30.     {
  31.         // Implemente sua propria regra de negocio
  32.         new ContactManager().DeleteContact(contactId);
  33.     }
  34.  
  35.     #endregion
  36. }

 

A classe ContactServices disponibiliza métodos de um CRUD que serão utilizados no BCS e falam por si só. Servem como uma “casquinha” para a manipulação de dados, pois chamam diretamente os métodos da classe ContactManager do projeto ContactServices.Data.

Nesse caso não foram implementadas regras de negócio, mas se você tiver necessidade faça a implementação nesses métodos.

Host do Serviço

O projeto ContactServices.Host servirá para fazer o host do serviço WCF, que vai disponibilizar os métodos para o BCS. Para isso renomeie o arquivo criado por padrão Service1.svc para ContactServices.svc e altere a referência do serviço na diretiva de página para:

Code Snippet
  1. <%@ ServiceHost Language="C#" Debug="true" Service="ContactServices.Business.ContactServices" %>

 

Essa alteração é necessária para o mapeamento da classe ContactServices implementada no projeto ContactServices.Business. Para que o serviço seja disponibilizado também é necessária a alteração do Web.config, que pode ser editado pelo WCF Service Configuration Editor (disponível no VS2010) ou diretamente no arquivo na seção system.serviceModel conforme o código abaixo:

Code Snippet
  1. <system.serviceModel>
  2.     <services>
  3.       <service behaviorConfiguration="ContactServicesBehavior" name="ContactServices.Business.ContactServices">
  4.         <endpoint binding="wsHttpBinding" bindingConfiguration="" contract="ContactServices.Business.IContactServices" />
  5.         <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="ContactServices.Business.IContactServices" />
  6.       </service>
  7.     </services>
  8.     <behaviors>
  9.       <serviceBehaviors>
  10.         <behavior name="ContactServicesBehavior">
  11.           <serviceMetadata httpGetEnabled="true" />
  12.           <serviceDebug includeExceptionDetailInFaults="true" />
  13.         </behavior>
  14.       </serviceBehaviors>
  15.     </behaviors>
  16.   </system.serviceModel>

OBS: O behavior serviceDebug contém o atributo includeExceptionDetailInFaults para listar em detalhes qualquer problema do Web Service no Log do SharePoint, o que é bastante útil durante os testes na integração do serviço WCF.

Ao final essa solução deve estar semelhante à exibida na Figura 3:

vstudio

Figura 3 - Solução Final

Faça o deploy da solução no IIS para que utilizemos um endereço fixo na criação do ECT, que veremos a seguir.

Trabalhando com o SharePoint Designer 2010

Nessa etapa já temos a solução criada e precisamos apenas criar o ECT, mapeando os métodos e parâmetros do Web Service. A Figura 1 (Parte II) nos mostra a etapa inicial de criação do ECT, em seguida adicione uma nova conexão (1) ao Web Service pela seleção do tipo do External Data Source (2), conforme Figura 4:

conexao

Figura 4 - Criação de uma nova conexão

Defina os parâmetros de conexão conforme a Figura 5:

WCF

Figura 5 - Detalhes da conexão

OBS: Algumas considerações importantes:

  • Os metadados do WCF podem ser obtidos pelo WSDL ou utilizando o endpoint Mex. Ambos podem ser informados em Service Metadata URL / Metadata Connection Mode e estão disponíveis na solução criada.
  • A identidade do usuário (User’s Identity) será utilizada para conectar no serviço do WCF e consequentemente no banco de dados, por isso utilizamos Windows Authentication na conexão.

Após a criação da conexão é necessário criarmos as operações do CRUD para o ECT, etapa essa onde os métodos e parâmetros do Web Service serão mapeados. Para cada figura que mapeia um método temos tabelas que definem seus parâmetros de entrada e retorno (quando aplicados):

addcontact

Figura 6 - Operação AddContact

A operação AddContact da Figura 6 possui os seguintes parâmetros de entrada exibidos nas Tabelas 2 e 3:

Element .NET Type Map to Identifier Identifier Field Display Name Foreign Identifier
ContactID System.Int32 TRUE ContactID ContactID ID  
Address System.String FALSE   Address Address  
City System.String FALSE   City City  
CompanyName System.String FALSE   CompanyName Company Name  
ContactName System.String FALSE   ContactName Contact Name  
ContactTitle System.String FALSE   ContactTitle Contact Title  
Country System.String FALSE   Country Country  
Email System.String FALSE   Email E-mail  
Fax System.String FALSE   Fax Fax  
Phone System.String FALSE   Phone Phone  
PostalCode System.String FALSE   PostalCode Postal Code  
Region System.String FALSE   Region Region  
Tabela 2 - Parâmetros de Entrada da Operação AddContact

Element Default Value Filter Element Path
ContactID <<None>>   contact.ContactID
Address <<None>>   contact.Address
City <<None>>   contact.City
CompanyName <<None>>   contact.CompanyName
ContactName <<None>>   contact.ContactName
ContactTitle <<None>>   contact.ContactTitle
Country <<None>>   contact.Country
Email <<None>>   contact.Email
Fax <<None>>   contact.Fax
Phone <<None>>   contact.Phone
PostalCode <<None>>   contact.PostalCode
Region <<None>>   contact.Region
Tabela 3 - Parâmetros de Entrada da Operação AddContact (Continuação)

Vale lembrar que nenhum parâmetro de retorno se aplica na operação AddContact, portanto simplesmente ignore a tela de configuração e finalize a criação do mapeamento.

deletecontact

Figura 7 - Operação DeleteContact

A operação DeleteContact da Figura 7 possui o seguinte parâmetro de entrada exibido na Tabela 4:

Element .NET Type Map to Identifier Identifier Display Name Default Value Filter Element Path
contactId System.Int32 TRUE ContactID ID <<None>>   contactId
Tabela 4 - Parâmetro de Entrada da Operação DeleteContact

getcontactbyid

Figura 8 - Operação GetContactById

A operação GetContactById da Figura 8 possui os seguintes parâmetros de entrada e retorno exibidos nas Tabelas 5, 6 e 7:

Element .NET Type Map to Identifier Identifier Display Name Default Value Filter Element Path
contactId System.Int32 TRUE ContactID ID <<None>>   contactId
Tabela 5 - Parâmetro de Entrada da Operação GetContactById

Data Source Element .NET Type Map to Identifier Identifier Field Display Name Foreign Identifier
ContactID System.Int32 TRUE ContactID ContactID ID  
Address System.String FALSE   Address Address  
City System.String FALSE   City City  
CompanyName System.String FALSE   CompanyName Company Name  
ContactName System.String FALSE   ContactName Contact Name  
ContactTitle System.String FALSE   ContactTitle Contact Title  
Country System.String FALSE   Country Country  
Email System.String FALSE   Email E-mail  
Fax System.String FALSE   Fax Fax  
Phone System.String FALSE   Phone Phone  
PostalCode System.String FALSE   PostalCode Postal Code  
Region System.String FALSE   Region Region  
Tabela 6 - Parâmetro de Retorno da Operação GetContactById

Data Source Element Element Path Required Read-Only Office Property
ContactID GetContactById.ContactID FALSE TRUE Custom Property
Address GetContactById.Address FALSE FALSE Business Address (BusinessAddress)
City GetContactById.City FALSE FALSE Business Address City (BusinessAddressCity)
CompanyName GetContactById.CompanyName FALSE FALSE Company Name (CompanyName)
ContactName GetContactById.ContactName TRUE FALSE Full Name (FullName)
ContactTitle GetContactById.ContactTitle FALSE FALSE Title (Title)
Country GetContactById.Country FALSE FALSE Business Address Country/Region (BusinessAddressCountry)
Email GetContactById.Email TRUE FALSE Email 1 Address (Email1Address)
Fax GetContactById.Fax FALSE FALSE Business Fax Number (BusinessFaxNumber)
Phone GetContactById.Phone TRUE FALSE Business Telephone Number (BusinessTelephoneNumber)
PostalCode GetContactById.PostalCode FALSE FALSE Business Address Postal Code (BusinessAddressPostalCode)
Region GetContactById.Region FALSE FALSE Business Address State (BusinessAddressState)
Tabela 7 - Parâmetro de Retorno da Operação GetContactById (Continuação)

getcontacts

Figura 9 - Operação GetContacts

A operação GetContacts da Figura 9 não possui parâmetros de entrada a serem configurados, porém possui os seguintes parâmetros de retorno exibidos nas Tabelas 8 e 9:

Element .NET Type Map to Identifier Identifier Field Display Name Foreign Identifier
ContactID System.Int32 TRUE ContactID ContactID ID  
Address System.String FALSE   Address Address  
City System.String FALSE   City City  
CompanyName System.String FALSE   CompanyName Company Name  
ContactName System.String FALSE   ContactName Contact Name  
ContactTitle System.String FALSE   ContactTitle Contact Title  
Country System.String FALSE   Country Country  
Email System.String FALSE   Email E-mail  
Fax System.String FALSE   Fax Fax  
Phone System.String FALSE   Phone Phone  
PostalCode System.String FALSE   PostalCode Postal Code  
Region System.String FALSE   Region Region  
Tabela 8 - Parâmetro de Retorno da Operação GetContacts

Element Element Path Required Read-Only Show in Picker Timestamp Field
ContactID GetContacts.GetContactsElement.ContactID FALSE TRUE FALSE FALSE
Address GetContacts.GetContactsElement.Address FALSE FALSE FALSE FALSE
City GetContacts.GetContactsElement.City FALSE FALSE FALSE FALSE
CompanyName GetContacts.GetContactsElement.CompanyName FALSE FALSE FALSE FALSE
ContactName GetContacts.GetContactsElement.ContactName TRUE FALSE FALSE FALSE
ContactTitle GetContacts.GetContactsElement.ContactTitle FALSE FALSE FALSE FALSE
Country GetContacts.GetContactsElement.Country FALSE FALSE FALSE FALSE
Email GetContacts.GetContactsElement.Email TRUE FALSE FALSE FALSE
Fax GetContacts.GetContactsElement.Fax FALSE FALSE FALSE FALSE
Phone GetContacts.GetContactsElement.Phone TRUE FALSE FALSE FALSE
PostalCode GetContacts.GetContactsElement.PostalCode FALSE FALSE FALSE FALSE
Region GetContacts.GetContactsElement.Region FALSE FALSE FALSE FALSE
Tabela 9 - Parâmetro de Retorno da Operação GetContacts (Continuação)

updatecontact

Figura 10 - Operação UpdateContact

A operação UpdateContact da Figura 10 possui os seguintes parâmetros de entrada exibidos nas Tabelas 10 e 11:

Element .NET Type Map to Identifier Identifier Field Display Name Foreign Identifier
ContactID System.Int32 TRUE ContactID ContactID ID  
Address System.String FALSE   Address Address  
City System.String FALSE   City City  
CompanyName System.String FALSE   CompanyName Company Name  
ContactName System.String FALSE   ContactName Contact Name  
ContactTitle System.String FALSE   ContactTitle Contact Title  
Country System.String FALSE   Country Country  
Email System.String FALSE   Email E-mail  
Fax System.String FALSE   Fax Fax  
Phone System.String FALSE   Phone Phone  
PostalCode System.String FALSE   PostalCode Postal Code  
Region System.String FALSE   Region Region  
Tabela 10 - Parâmetros de Entrada da Operação UpdateContact

Element Default Value Filter Element Path
ContactID <<None>>   contact.ContactID
Address <<None>>   contact.Address
City <<None>>   contact.City
CompanyName <<None>>   contact.CompanyName
ContactName <<None>>   contact.ContactName
ContactTitle <<None>>   contact.ContactTitle
Country <<None>>   contact.Country
Email <<None>>   contact.Email
Fax <<None>>   contact.Fax
Phone <<None>>   contact.Phone
PostalCode <<None>>   contact.PostalCode
Region <<None>>   contact.Region
Tabela 11 - Parâmetros de Entrada da Operação UpdateContact (Continuação)

OBS: Reparem que na maior parte dos casos apenas a nomenclatura dos parâmetros de configuração (colunas) muda, porém os dados são os mesmos. Resolvi criar tabelas de configuração para cada operação no intuito de facilitar o mapeamento com operações separadas.

Uma vez que todas as colunas foram definidas, salve o ECT (1) e observe as operações criadas (2), as quais podem ser editadas a qualquer momento, conforme Figura 11:

savingECT

Figura 11 - Salvando o ECT

Nesse momento já é possível a criação de um External List que fará a interface visual com os dados externos no SharePoint 2010. Na mesma tela de External Content Types, visualize o menu de contexto (botão direito) e selecione a opção External List. Nomeie para “Contacts”, conforme Figura 12:

createECT

Figura 12 - Criação de um External List

Com a finalização da External List, chegamos ao propósito desse artigo. Cabe a você agora testar a External List, o que já foi explicado na Parte II do BCS. Reaproveite o mesmo teste e aplique aqui, pois ele foi criado para esse fim.

O fato de podermos utilizar um Web Service para a integração no SharePoint 2010 mostra que podemos conectar dados de qualquer sistema que disponibilize essa interface. Unifique os dados de diferentes sistemas no SharePoint 2010! Agora você sabe como fazê-lo!

Referência:
http://msdn.microsoft.com/en-us/library/ee556826(v=office.14).aspx

[]’s

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.