SharePoint 4 Developers

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

Business Connectivity Services – Parte IV

Entenda a estrutura hierárquica do modelo de metadados do BDC (Business Data Connectivity Model) e as novas ferramentas do Visual Studio 2010 para design de modelos do BDC (Parte IV)

Oi pessoal, tudo bem?

Essa é a quarta parte do artigo sobre as novidades de integração de dados externos com o Business Connectivity Services (BCS) no SharePoint 2010!

Apenas para recapitular, na parte I do artigo tivemos uma introdução ao funcionamento do BCS pela análise de sua arquitetura e componentes, na parte II tivemos a oportunidade de criar External Content Types (ECT) via Database e na parte III trabalhamos na criação de ECTs via Web Service.

A leitura da parte I é extremamente importante para o entendimento desta parte. Nesse artigo vou explicar a estrutura hierárquica do modelo de metadados do BDC (Business Data Connectivity Model) e dar uma introdução às novas ferramentas do Visual Studio 2010 na criação de objetos do BDC.

Boa leitura!

Entendendo o Modelo de Metadados do BDC

No exemplo desse artigo trabalharemos com um novo template do Visual Studio 2010 chamado Business Data Connectivity (BDC) Model, que permite a criação de Entidades (BDC Entities) também conhecidas como External Content Types, que já vimos na parte I.

As entidades são objetos que compõem o modelo de metadados do BDC, que representam o núcleo de funcionamento do BDC. Nessa abordagem quero ir um pouco mais a fundo nesse modelo, vejamos a Figura 1:

BDCModelFigura 1 - Modelo de Metadados do BDC

Agora fica claro onde os ECTs estão dentro do Modelo de Metadados do BDC, mas ainda não conhecemos em detalhes o papel de cada um desses objetos que compõem a Figura 1, apenas podemos notar que os objetos estão em uma estrutura hierárquica.

Para entendimento desses objetos veremos o detalhamento de cada um:

OBS: Esse conteúdo pode ser encontrado na seção referências, porém resolvi detalhar mais do que o conteúdo encontrado no MSDN. :)

  • Model - Esse é objeto principal, núcleo do funcionamento do BDC que mapeia os dados externos. Trata-se do agrupador de todos os objetos que compõem a hierarquia desse modelo.

  • LobSystem - Dentro do modelo figura como sendo a representação de um serviço externo que contém a lógica de negócio, simplesmente pelo fato de definir o tipo da fonte de dados externos que será utilizada, podendo ser:
  1. Database – Define o mapeamento de um banco de dados;
  2. DotNetAssembly – Define o mapeamento de um assembly .NET;
  3. Wcf – Define o mapeamento de um endpoint do serviço WCF;
  4. WebService – Define o mapeamento de um Web Service. Considerado “deprecated”, portanto utilize um serviço WCF;
  5. Custom – Define o mapeamento de um Conector customizado, implementado para gerenciar a conexão e a transferência de dados.
  • LobSystemInstance - Trata-se da implementação de um LobSystem. Contém todos os detalhes de conexão a um serviço externo para a criação da instância de um LobSystem.

  • Entity - Trata-se da representação dentro do modelo de metadados do BDC de um ECT do BCS, que conforme já visto na Parte I determina o schema de dados da entidade, utiliza-se de recursos de acesso a dados e disponibiliza um comportamento dentro do Office e SharePoint através de métodos.

  • Identifier - Um identificador funciona como uma chave primária nas entidades.

  • Method - Os métodos são os comportamentos de uma entidade. Dentro do modelo funciona como um agrupador das configurações (FilterDescriptor, Parameter, MethodInstance) do método que representa.

  • FilterDescriptor - Basicamente um filterdescriptor pode ser criado dentro de um método para selecionar tanto a entrada quanto o retorno de valores do mesmo. Diversos tipos de filtros podem ser utilizados (veja a seção referências).

  • Parameter - Define o tipo de parâmetro que será utilizado dentro do método, sendo:
  1. In – Utilizado para parâmetros de entrada;
  2. Out – Utilizado para parâmetros de saída, similar ao parâmetro "out" em C#.
  3. InOut – Representa um parâmetro que tem as duas funções (entrada / saída), similar ao parâmetro "ref" em C#.
  4. Return – Define o tipo para retorno de um método, no BDC isso é considerado como um parâmetro de retorno.
  • TypeDescriptor - Um typedescriptor é nada mais nada menos do que uma definição do tipo do parâmetro. Ex: Int32, String. É recursivo, pois permite que outro typedescriptor seja referenciado como sendo o tipo de um parâmetro.

  • MethodInstance - Trata-se da implementação de um Method. As operações Create, Update, ReadItem, ReadList e Delete já são pré-definidas para utilização.

  • Action - As ações possibilitam a adição de funcionalidades extras aos ECTs, pois funcionam como um link adicional aos dados externos. Por padrão as ações View Item, Edit Item, e Delete Item são adicionadas na interface do usuário (veja a seção referências) e qualquer nova ação adicionada, como por exemplo um link para abrir uma página, acompanha o ECT em qualquer parte do SharePoint.

  • ActionParameter - Define a URL da ação que se refere para o funcionamento do link criado. Utiliza-se de identificadores ou typedescriptors da entidade para a criação da URL.

  • AssociationGroup - Associações representam os relacionamentos entre as entidades, similar a um relacionamento de tabelas. Um AssociationGroup deve ser utilizado para amarrar métodos de associação que são aplicados em um relacionamento de entidades. Ex: Considerando duas entidades Cliente e Pedido, um AssociationGroup armazenaria métodos como ObterPedidosPorCliente e ObterClientePorPedido.

OBS: Na próxima parte dessa lição trabalharemos com a maioria desses objetos, e esse overview vai ser consolidado ao colocarmos a mão na massa, principalmente quando trabalharmos com o XML que está por trás dessas definições.

Ferramenta de Design para o Modelo de Metadados do BDC

O Visual Studio 2010 foi turbinado com várias novas ferramentas para design e o BDC não ficou de fora. Agora ficou mais fácil a criação de modelos no BDC, pois o mais trabalhoso (a criação da maioria dos objetos) pode ser feito visualmente e outros pequenos detalhes podem ser feitos manualmente no XML gerado.

A Figura 2 mostra os novos painéis que estão disponíveis no VS2010 para design de modelos no BDC:

NewDesignerFigura 2 - Painéis para design de modelos do BDC

Com exceção do painel de Propriedades, três (3) novos painéis foram incorporados ao VS2010. São eles:

  • BDC Designer - Possibilita a criação e edição de Entidades, Identificadores, Métodos e Associações entre as Entidades. Trata-se de uma área para design que permite a criação dos objetos via drag-and-drop da palheta Toolbox ou mesmo utilizando o menu de contexto (pelo botão direito do mouse).

  • BDC Method Details - Assim como o próprio nome diz, exibe os detalhes de configuração dos métodos. Permite a criação e edição de métodos, parâmetros, typedescriptors e filtros (conforme o modelo de metadados do BDC).

  • BDC Explorer - Organiza e exibe os objetos do modelo de metadados do BDC em uma tree view. Sua principal finalidade é o de apresentar os objetos numa estrutura hierárquica, porém também permite a criação de typedescriptors e validação dos objetos.

Durante o desenvolvimento na próxima parte veremos como manipular os objetos do Modelo de Metadados do BDC por esses painéis. Aguardem!

Referências:
http://msdn.microsoft.com/en-US/library/ee556378.aspx
http://msdn.microsoft.com/en-us/library/ee557835.aspx
http://msdn.microsoft.com/en-us/library/ee559393.aspx

[]’s

Marcel Medina

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

The required feature is not enabled for this column type

Segue mais uma dica de como contornar problemas que aparecem durante a utilização do SharePoint 2010. A mensagem: The required feature is not enabled for this column type, aparece na tentativa de criação de um Metadata Column.

Oi pessoal,

Segue mais uma dica de como contornar problemas que aparecem durante a utilização do SharePoint 2010. Esse caso acontece na tentativa de criação de um Metadata Column.

Problema

Em alguns casos você pode se deparar com a seguinte mensagem ao tentar criar Metadata Columns:

“The required feature is not enabled for this column type”

Conforme podemos ver na Figura 1:

mensagem

Figura 1 - Mensagem

O que está acontecendo é que o SharePoint 2010 está alertando para que a coluna seja disponibilizada, a ativação de uma feature é necessária. Mas qual feature?

Solução

A feature que necessita ser ativada é uma Site Collection Hidden Feature, ou seja, uma Site Collection Feature que não está disponível para ativação via UI. Precisa ser ativada via comando. A Figura 2 mostra a feature que precisa ser ativada:

SiteHiddenFeature

Figura 2 – Hidden Feature

Essa feature pode ser ativada via comando no PowerShell através da seguinte execução (repare que o Id é mesmo da Figura 2):

Enable-SPFeature -id "73ef14b1-13a9-416b-a9b5-ececa2b0604c" -Url <Site-Url>

Resultado

Após a ativação da feature, qualquer Metadata Column poderá ser criado sem problemas, conforme Figura 3:

resultado

Figura 3 – Criação do Metadata Column

Se a mensagem informasse qual fosse a feature para ativação, com certeza esse post não seria necessário, porém esse não é o caso…rs. Essa é mais uma das pegadinhas que nos fazem perder tempo em investigação.

Espero que esse post ajude.

[]’s

Marcel Medina

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

Configurando Taxonomy Field Values Programaticamente

A configura&#231;&#227;o de Taxonomy Field values pode ser comlicada, principalmente pela falta de documenta&#231;&#227;o. Nesse post eu mostro um exemplo de como se trabalhar com o novo modelo de objetos para a migra&#231;&#227;o de field values (Lookup fields X Taxonomy fields).

Oi pessoal,

Essa semana realizei a migração de Lookup Lists e Lookup fields. Fiquei impressionado pela falta de documentação e exemplos de como trabalhar com Taxonomy field values.

Nessa nota rápida vou mostrar a vocês um exemplo de como se trabalhar com o novo modelo de objetos para a migração de field values (Lookup fields X Taxonomy fields).

Premissa

Considere a seguinte Lookup List e Term Store nesse exemplo, que contém os jogadores da seleção da Copa de 2010, conforme Figura 1:

vs680 Figura 1 – Lookup List vs Taxonomy Term Store

OBS: Como você pode perceber, a decisão em migrar Lookup fields para Taxonomy fields é uma batalha. Será que vale a pena? No meu caso como estou criando um Content Type Hub, todos os Site Columns não podem possuir dependencias, então uma solução é se livrar dos Lookup fields.

Lookup fields X Taxonomy fields

Imagine uma Lista que contenha ambos os campos (fields), o primeiro mapeia a Lookup List e o segundo o Term Store. Nesse cenário o Lookup field contém valores, porém o Taxonomy field não, pois foi recentemente criado e precisa ser populado.

Como uma solução para isso, o código abaixo mapeia os Lookup field values para Taxonomy field values, também conhecido como Managed Metadata field values.

Code Snippet
  1. static void Main(string[] args)
  2. {
  3.     var url = ConfigurationManager.AppSettings["Url"].ToString();
  4.     var library = ConfigurationManager.AppSettings["Library"].ToString();
  5.  
  6.     // Leitura de XML, considere
  7.     // (key => lookup field,value => taxonomy field)
  8.     Dictionary<string, string> mappingFields = XMLHelper.ReadDictionaryXML("MappingFields.xml");
  9.  
  10.     using (SPSite site = new SPSite(url))
  11.     {
  12.         using (SPWeb web = site.RootWeb)
  13.         {
  14.             // Obtem a lista/library
  15.             SPList list = web.Lists[library];
  16.  
  17.             foreach (SPListItem item in list.Items)
  18.             {
  19.                 // Itera em todos os mapped fields
  20.                 foreach (var mappedField in mappingFields)
  21.                 {
  22.                     if (item.Fields.ContainsField(mappedField.Key))
  23.                     {
  24.                         // Atualiza sem deixar rastros
  25.                         web.Site.AllowUnsafeUpdates = true;
  26.  
  27.                         // Obtem a instancia do lookup field
  28.                         var lookupValueList = (item[mappedField.Key] as SPFieldLookupValueCollection).ToList();
  29.  
  30.                         // Obtem a instancia do taxonomy field
  31.                         TaxonomyField managedField = item[mappedField.Value] as TaxonomyField;
  32.  
  33.                         // Obtem a taxonomy session atual
  34.                         TaxonomySession session = new TaxonomySession(web.Site, false);
  35.  
  36.                         // Obtem o term store (pelo SspId)
  37.                         var termStoreCol = session.TermStores[managedField.SspId];
  38.  
  39.                         // Obtem os termos de um especifico term set (pelo TermSetId)
  40.                         var termCol = termStoreCol.GetTermSet(managedField.TermSetId).Terms;
  41.  
  42.                         var listTerms = new List<Term>();
  43.  
  44.                         // Itera em todos os lookup values
  45.                         foreach (var itemValue in lookupValueList)
  46.                         {
  47.                             string value = itemValue.LookupValue;
  48.  
  49.                             // Obtem o termo que corresponde a cada valor
  50.                             // encontrado na lista de lookup values
  51.                             var termToSet = termCol[value];
  52.  
  53.                             listTerms.Add(termToSet);
  54.                         }
  55.  
  56.                         // Define o field value utilisando a lista de termos
  57.                         managedField.SetFieldValue(item, listTerms);
  58.  
  59.                         // Salva o item
  60.                         item.SystemUpdate();
  61.  
  62.                         // Cancela unsafe updates
  63.                         web.Site.AllowUnsafeUpdates = false;
  64.                     }
  65.                 }
  66.             }
  67.         }
  68.     }
  69. }

OBS: O código acima está bem comentado, o que dispensa comentários.

Espero que essa nota rápida ajude.

Referência:
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.taxonomy.taxonomyfield.aspx

[]’s,

Marcel Medina

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