miércoles, 30 de junio de 2010

Metadatos administrados: Modelo de objetos y controles (I)

Mediante el servicio de metadatos podremos asociar a nuestro contenido metadatos con una estructura con sentido para nuestra organización. Además de la poder manejarlos desde la interfaz gráfica, dispondremos de un modelo de objetos para realizar el mantenimiento, consultas y visualizarlo mediante controles.

Modelo de objetos

SharePoint nos proporciona una serie de clases para manejar y navegar por la estructura de metadatos. Para obtener una referencia al conjunto de almacenes de términos definidos para una Colección de Sitios utilizaremos la clase TaxonomySession. Mediante la propiedad TermStores podremos obtener los distintos almacenes de términos del tipo TermStore que representa un almacén de grupos de términos.

Para obtener los grupos de términos utilizaremos la propiedad Groups de la clase TermStore que nos devolverá una colección de elementos del tipo Group.

Para obtener los conjuntos de términos de un grupo utilizaremos la propiedad TermSets.

Para ilustrar un ejemplo:

SPSite site = SPContext.Current.Site;
TaxonomySession session = new TaxonomySession(site);
TermStore termStore = session.TermStores["Servicio de metadatos administrados"]; // Almacén de términos
Group group = termStore.Groups["MiGrupo"]; // Grupo de términos
TermSet productsTermSet = group.TermSets["MiConjunto"]; // Conjunto de términos

Term termino = productsTermSet.Terms[“MiTérmino”]; // Término o palabra

Para manejar una columna de tipo “Metadatos administrados” disponemos de la clase TaxonomyField, con el método GetFieldValue() obtendremos una referencia del tipo TaxonomyFieldValue para manejar los valores almacenados en la columna.

De la clase TaxonomyFieldValue podemos obtener el identificador del término almacenado con la propiedad TermGuid y con la propiedad Label el texto del término.

SPList listaConMetadato = SPContext.Current.Site.RootWeb.Lists["NombreLista"];
SPListItem itemConMetdato = listaConMetadato.Items[0];
TaxonomyFieldValue valordeMetadato = new TaxonomyFieldValue((string)itemConMetdato["NombreColumna"]);
string idTermino = valordeMetadato.TermGuid;
string textoTermino = valordeMetadato.Label;

 

Controles

En la parte visual dispondremos de varios controles como:

  • TaxonomyFieldControl
  • TaxonomyWebTaggingControl

Ambos controles los encontraremos en la dll Microsoft.SharePoint.Taxonomy.dll en el namespace Microsoft.SharePoint.Taxonomy. Para registrar estos controles en una página o control utilizaremos:

<%@ Register Tagprefix="Taxonomy" Namespace="Microsoft.SharePoint.Taxonomy" Assembly="Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

 

El control TaxonomyFieldControl lo utilizaremos para poder asociar un elemento de una lista o biblioteca a un metadato, es el control que utilizará SharePoint al visualizar una columna de tipo “Metadatos administrados”. Por ejemplo las páginas wiki disponen de la opción de catalogar las páginas mediante una columna de tipo “Metadatos administrados” y en el layouts:

<Taxonomy:TaxonomyFieldControl FieldName="Wiki_x0020_Page_x0020_Categories" EmptyValueDescriptionForTargetTemplate="<%$Resources:cms,enterwiki_nocategories_assigned%>" DisableInputFieldLabel="true" runat="server" />

image

 

El control TaxonomyWebTaggingControl  lo utilizaremos para navegar por la estructura de metadatos. Para utilizarlo tendremos que indicarle que subconjunto del árbol de metadatos utilizará, por ejemplo:

taggingTaxonomy.SspId.Add(termStore.Id);
taggingTaxonomy.TermSetId.Add(productsTermSet.Id);
taggingTaxonomy.AllowFillIn = true; // Permite autocompletar
taggingTaxonomy.IsMulti = false; // Indica si permite multiselección

Para leer el metadato seleccionado, disponemos de la propiedad “Text” que devuelve los términos seleccionados con el formato “Término|GUID”. En este caso no podremos utilizar una clase del tipo TaxonomyFieldValue para extraer los valores por separado ya que el formato que devuelve la propiedad TaxonomyWebTaggingControl.Text no es compatible.

martes, 22 de junio de 2010

[SharePoint 2010] Scripts para máquina de desarrollo

Para poder trabajar con SharePoint 2010 necesitaremos de una gran cantidad de recursos que no siempre tendremos a la hora de desarrollar. Para aprovechar al máximo la máquina podemos parar con PowerShell todos los servicios de SharePoint que no nos sean necesarios e irlos arrancando según los vayamos necesitando.

En el post “Stop and Go with SharePoint 2010 on your workstation” encontramos algunos scripts de PowerShell con los que podemos parar/arrancar los servicios que utiliza SharePoint. En mi caso he adaptado estos scripts para que pare/arranque los servicios de windows imprescindibles y las instancias de las aplicaciones de servicio de SharePoint.

 

Para parar un servicio de windows podemos utilizar un comando del tipo:

$service = get-service “Nombre del servicio”
Stop-Service “Nombre del servicio” –Force

Para parar una instancia de una aplicación de servicio:

$serviceInstance = Get-SPServiceInstance {GUID}
Stop-SPServiceInstance $serviceInstance .Id -Confirm:$false

y para iniciar la instancia:

$serviceInstance .Provision()

 

Podéis descargaros los scripts completos: Scripts para desarrollo

lunes, 21 de junio de 2010

[Tips SharePoint 2010]Obtener la Base de datos de contenido con PowerShell

Para obtener la base de datos de contenidos de una Colección de sitios mediante PowerShell:

$site = Get-SPSite http://{Url de la Colección}
$site.ContentDatabase

image

Para obtener una referencia a la aplicación web que contiene la Colección de Sitios:

$site = Get-SPSite http://{Url de la Colección}
$webapp = $site.WebApplication

También podemos utilizar:

Get-SPWebApplication http://{Url de la Colección}

Para obtener todas las bases de datos de contenido de una aplicación web:

$webapp = Get-SPWebApplication http://{Url de la Colección}

$webapp.ContentDatabases

image

Error No se pueden cargar las acciones de flujo de trabajo del servidor

Al intentar crear desde SharePoint Designer 2010 un flujo de trabajo personalizado saltaba el error “No se pueden cargar las acciones de flujo de trabajo del servidor” (“Unable to load workflow actions from the server”).

image

Lo primero que hice fue verificar que no se habían modificado el fichero de acciones de WF “WSS.ACTIONS” como indica el artículo “Error al cargar el archivo de configuración del flujo de trabajo”.

Pero el problema persistía, después de mirar un rato los logs de SharePoint me fijé que aparecía un error del tipo:

Microsoft.SharePoint.SPException: Error al encontrar el archivo XML en la ubicación '14\Template\Features\ReportServer\feature.xml' …..

at Microsoft.SharePoint.SoapServer.WebPartPagesWebService.GetWorkflowActionsFromFeatureElements

 

Al buscar la feature “ReportServer” en el directorio físico del servidor no existía, lo que significaba que la base de datos de configuración tenía registrada la feature pero no se había copiado físicamente, por lo que al realizar la carga daba un error.

Mi solución fue la de quitar la feature mediante PowerShell y realizar un iisreset:

 

$farm = Get-SPFarm

$fuckfeature = $farm.FeatureDefinitions | where {$_.DisplayName -eq "ReportServer"}

$fuckfeature.Delete()

jueves, 17 de junio de 2010

Remote BLOB Storage para SharePoint 2010

Los BLOBS (Binary Large Object) consisten en conjuntos de datos no estructurados como ficheros de texto, imágenes o vídeos. En SharePoint los BLOB’s se almacenan en las bases de datos de contenido, pudiendo afectar al espacio consumido y velocidad. SqlServer 2008 R2 incorpora el proveedor FILESTREAM que permite almacenar los BLOBs como ficheros en el sistema de ficheros NTFS en lugar de la base de datos.

SharePoint 2010 (Foundation y Server) se pueden aprovechar de los remote blobs activando el FILESTRIME provider para las bbdd de contenidos, de esta forma podremos almacenar grandes cantidades de datos como imágenes o vídeos sin afectar al volumen de la base de datos ni al rendimiento.

A continuación veremos los pasos para activar el RBS (Remote BLOB Storage) para SharePoint 2010 basado en el Virtual Lab: Configuring Remote Blob Storage FILESTREAM Provider for SharePoint Server 2010

 

Activar Remote BLOB para SharePoint 2010

Lo primero es necesario disponer de al menos SqlServer 2008, SqlServer 2008 R2 o SqlServer 2008 Express R2. Para activarlo accederemos al “SQL Server Configuration Manager” seleccionaremos la instancia de SQL y desde las propiedades accederemos a la pestaña “FILESTREAM” y activaremos: “Enable FILESTREAM for Transact-SQL access”, “Enable FILESTREAM for file I/O streaming access” y “Allow remote clients to have streaming access to FILESTREAM data” y a continuación aplicaremos.

image

Ejecutaremos desde el “SQL Server Management Studio” el comando:

EXEC sp_configure filestream_access_level, 2

RECONFIGURE

A continuación tendremos que indicar a Sql Server que utilice el FILESTREAM provider para almacenar los BLOB’s de la base de datos de contenido de nuestra Colección de Sitios. Para éllo primero tendremos que identificar el nombre de la bbdd de la Colección, en este caso lo veremos mediante PowerShell; desde la consola de PowerShell de SharePoint 2010 ejecutamos el comando:

$cdb = Get-SPContentDatabase –WebApplication http://intranet.contoso.com

$cdb

image

Desde el “SQL Server Management Studio” creamos una master key ejecutando:

use [WSS_Content_GUID]

if not exists (select * from sys.symmetric_keys where name = N'##MS_DatabaseMasterKey##')create master key encryption by password = N'Contraseña'

Donde “WSS_Content_GUID” representa el nombre de la base de datos de contenido.

Definimos un grupo de ficheros con el nombre “RBSFilestreamProvider” y lo asociamos al proveedor filestream:

use [WSS_Content_GUID]

if not exists (select groupname from sysfilegroups where groupname=N'RBSFilestreamProvider')alter database [WSS_Content_GUID]

add filegroup RBSFilestreamProvider contains filestream

Especificamos el fichero filestream “RBSFilestreamFile” y el directorio donde se almacenarán los BLOB’s

use [WSS_Content_GUID]

alter database [WSS_Content_GUID] add file (name = RBSFilestreamFile, filename = 'c:\Blobstore') to filegroup RBSFilestreamProvider

En este momento dispondremos de una nueva carpeta con permisos especiales para que el servicio de SqlServer pueda manejar los BLOB’s como ficheros:

image

Si accedemos ahora a las propiedades de la base de datos veremos el nombre de nuestro grupo de ficheros Filestream:

image

Ahora instalaremos el addin con las API de RBS en todos los servidores frontales y de aplicación de SharePoint que encontraremos en RBS_x64.msi. Para instalarlo lo haremos desde línea de comandos para que tenga en cuenta nuestros filegroups:

msiexec /qn /lvx* rbs_install_log.txt /i C:\RBSInstall\RBS.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="WSS_Content_GUID" DBINSTANCE="DEMO2010A" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1

Para indicar a SharePoint que debe utilizar el proveedor RBS FileStream, desde PowerShell obtendremos las propiedades de remote BLOB’s en la bbdd de contenidos:

$cdb = Get-SPContentDatabase –WebApplication http://intranet.contoso.com

$rbss = $cdb.RemoteBlobStorageSettings

Mediante la variable $rbss instalaremos el proveedor y lo activaremos para ser utilizado:

$rbss.Installed()

$rbss.Enable()

Al ejecutar la última instrucción, encontraremos un mensaje del tipo:

image

Por último indicaremos que el activo :

$rbss.SetActiveProviderName($rbss.GetProviderNames()[0]

Desde este momento cuando subamos un fichero a SharePoint éste se almacenará en el sistema de ficheros, en nuestro caso en la carpeta “c:\Blobstore”.

image

Si tuviéramos ficheros almacenados antes de activar el RBS éstos seguirán almacenados en la base de datos de contenidos, para pasarlos al sistema de ficheros utilizaremos el comando:

$rbss.Migrate()

Si quisiéramos almacenar el sistema de ficheros solo aquellos ficheros mayores de 1MB de tamaño:

$cdb.RemoteBlobStorageSettings.MinimumBlobStorageSize=1048576

 

Por último, si queremos desactivar el uso de RBS ejecutaremos:

$rbss.SetActiveProviderName("")

Esto solo lo desactivará para nuevos BLOB’s, si ahora queremos volver a sacar los ficheros del sistema de ficheros y volverlos a introducir en la base de datos de contenido tendremos que volver a migrarlos pero hacia la bbdd de contenidos, este caso no lo he podido probar :(

miércoles, 16 de junio de 2010

Libro "SharePoint 2010 de principio a fin"

Ya lo han comentado Gustavo y Juan Carlos González, la “criatura” ha salido a la luz de la mano de Krasis. He tenido el placer de escribir junto con estos dos cracks uno de los primeros libros en Español sobre SharePoint 2010.

El libro está orientado a personas que trabajen con SharePoint tanto para desarrolladores como administradores. Cada uno de los capítulos además de explicar los conceptos y funcionalidades, describe paso a paso los procedimientos desde la interfaz gráfica, el modelo de objetos y powershell.

Creo que es un libro ideal tanto para los que empiezan con SharePoint 2010 como los que ya han trabajado alguna vez con SharePoint en versiones pasadas.

Espero que os guste, y por supuesto comprarlo!!, el libro también estará disponible en breve para su compra en Amazon y Barnes & Noble, y el resumen de los contenidos es el siguiente:

  • Instalación, configuración y administración

  • Introducción a la programación de SharePoint, incluyendo el uso de Visual Studio 2010.

  • Configuración, programación y uso de los distintos elementos de la arquitectura de SharePoint: Aplicaciones Web, Colecciones de Sitios, Sitios, Bibliotecas y Listas, Tipos de Contenido y Columnas de Sitio.

  • El Modelo de Objetos en Cliente y su utilización.

  • Manejadores de Eventos, Trabajos de Temporizador, Flujos de Trabajo.

  • SharePoint Designer 2010.

  • Personalización de la Interfaz de Usuario y Creación de WebParts

  • Características y soluciones.

  • Gestión de contenidos para la web y gestión de contenidos empresariales.

  • Integración de datos de negocio y capacidades de inteligencia de negocio.

  • Formularios electrónicos con InfoPath e InfoPath Forms Services.

  • Otros servidores en SharePoint 2010 y capacidades de búsqueda.

 

libroSharepoint2010_Grande

lunes, 14 de junio de 2010

SharePoint 2010: Error el servicio de búsqueda se encuentra sin conexión

Al realizar una reinstalación de SharePoint 2010 sobre un servidor que tenía configurado previamente el servicio de búsqueda, nos encontramos que al entrar a configurar los orígenes de contenido de la aplicación de servicio del buscador nos mostraba el mensaje de error “El servicio de búsqueda se encuentra sin conexión. Vaya a la página Servicios del servidor de la Administración central de SharePoint para comprobar si el servicio está habilitado. Esto también puede deberse a que hay un movimiento del indizador en curso”.

image

Al intentar eliminar la aplicación de servicio de búsqueda para poder crearla de nuevo se quedaba procesando hasta dar un error de timeout.

La solución fue eliminar la aplicación de servicio de búsqueda mediante PowerSell para crearla después desde el asistente:

$searchapp = get-spenterprisesearchserviceapplication

$searchapp.Delete()

image

Podéis encontrar un post muy interesante sobre como configurar el servicio de búsqueda: SharePoint 2010 Configuring Search Service Application using PowerShell.