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.

[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

[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 ’14TemplateFeaturesReportServerfeature.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()

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:RBSInstallRBS.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 :(

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

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.

Ejemplo portal público sobre SharePoint 2007

Recientemente en Renacimiento hemos terminado el portal www.icea.es basado en SharePoint 2007 y accesible. Todavía nos quedan algunos retoques (así que no seáis muy duros), entre las características de este portal podemos destacar:

  • Portal Accesible: Cumple con un alto porcentaje de las pautas de accesibilidad, recordar que SharePoint 2007 NO es accesible. Si desactiváis los estilos y el javascript podréis navegar por el contenido de forma sencilla y natural. Se ha realizado mucho esfuerzo para personalizar la parte pública del portal, como Masterpages, layouts, webparts y controles. Además se ha integrado un editor de contenido para facilitar la introducción de contenido que cumpla con las pautas de AA.
  • Almacén de datos: Consiste en una presentación jerarquizada y catalogada de una biblioteca con más de 3000 documentos.
  • Candado: Una cosa curiosa de ICEA es que puedes ver que tienen contenido privado sobre una determinada información pero no puedes ver el detalle a no ser que estés logado y tengas permiso para verlo.
  • Seguridad integrada: Toda la gestión de seguridad de contenidos se realiza desde SharePoint.
  • Buscadores por todos lados: se ha explotado mucho el motor de búsqueda se SharePoint para mostrar la información y ayudar a encontrarla.
  • Agenda de eventos: Agenda visual basada en distintos tipos de eventos publicados en el portal.

 

Si tuviera que destacar cuales han sido las claves del éxito del proyecto sin duda diría que ha sido la “estrecha relación con el cliente” el equipo ha formado parte de ICEA permitiendo una gran flexibilidad a la hora de hacer y definir, de hecho estamos sentados físicamente al lado de las personas que llevan el proyecto en ICEA.

image  imageimage image

 image image

Error Excel Services 2010: No se puede abrir el libro

Al abrir cualquier excel desde Excel Services se producía un error con el mensaje “No se puede abrir el libro” (“"The workbook cannot be opened"). Después de revisar que el fichero excel no tuviera nada raro, que el servicio estaba activo y bien configurado empecé a comprobar que en los logs me saltaban trazas del tipo: image

Cannot open database "WSS_Content" requested by the login. The login failed

"There is a compatibility range mismatch between the Web server and database"

Además comprobé que en log de sucesos de windows marcaba los siguientes tipos de error:

Error 3760

No se encontró la base de datos SQL ‘WSS_Content’ en la instancia de SQL Server ‘.SQLEXPRESS’. A continuación se incluye información adicional de SQL Server sobre el error.

Cannot open database "WSS_Content" requested by the login. The login failed.

Error 5586

Excepción de SQL desconocida 262. A continuación se incluye información adicional de SQL Server sobre el error.

CREATE TABLE permission denied in database ‘WSS_Content’.

Error 5617

Hay una discrepancia de intervalo de compatibilidad entre el servidor web y la base de datos "WSS_Content". Debido a esta incompatibilidad, las conexiones a los datos se han bloqueado. Esto puede suceder cuando una base de datos de contenido no se actualizó para estar dentro del intervalo de compatibilidad del servidor web o si la base de datos se actualizó a un nivel superior al del servidor web. El servidor web y la base de datos se deben actualizar a la misma versión y nivel de compilación para volver a estar dentro del intervalo de compatibilidad.

 

Al final la solución la encontré en el post "The workbook cannot be opened" Error with SharePoint Server 2010 (and TFS 2010)”, el problema ocurre cuando se crea el servicio de aplicaciones de Excel Services desde el asistente de instalación de la Administración Central, ya que el usuario que se utiliza como cuenta administrada para el servicio no dispone de los permisos suficientes en la base de datos de contenido que aloja el fichero Excel Services.

En mi caso desde la consola de Sql Management añadí al usuario los permisos: db_owner y public en la bbdd de contenidos.

image

SharePoint 2010: Error La dirección URL no es válida

Al agregar un documento a una biblioteca de documentos de SharePoint 2010 me mostraba el error “La dirección URL ‘{Url}’ no es válida. Puede que haga referencia a una carpeta o un archivo que no existe, o a una carpeta o un archivo válido que no está en el sitio web actual” (“The URL’’ is invalid). Lo curioso es que al intentar acceder desde Workspace indicaba que existía un error al acceder a la biblioteca de documentos.

imageimage 

El problema era que había definido una columna de sitio de tipo metadato administrado con un nombre que empezaba con mayúsculas y acentuada (“Área”). La solución fue crear de nueva la columna de sitio sin acento y cambiarle el nombre con acento una vez creada.