Codepoint

by Trentia Consulting

Undefined ‘g_ExpGorupXSLTQueue’ en vistas agrupadas en SP1 de SharePoint

El primer bug del SP1 de SharePoint 2010 ya ha aparecido. Nos hemos topado con un bug en los ficheros JS que afecta a las vistas agrupadas de listas y bibliotecas de documentos. En una vista con agrupaciones aparece el siguiente error, haciendo inservible la navegación en la vista.

image_2 (4)

La forma más fácil de solucionar el problema es copiar los ficheros INIT.JS y CORE.JS del hive 1033 (/TEMAPLATES/LAYOUTS/1033) en el hive correspondiente del idioma no inglés, en este caso el español (3082). Tras sustituir los ficheros y reiniciar el servicio de IIS todo vuelve a funcionar correctamente. No conocemos efectos laterales de la sustitución, pero os iremos informando.

Service Pack 1 de SharePoint 2010

image_thumbSí, por fín, el tan esperado SP1 de SharePoint 2010 está disponible. En http://support.microsoft.com/kb/2460045 encontrarís toda la información al respecto. Microsoft SharePoint Server 2010 Service Pack 1 (SP1) incluye todas las actualizaciones hasta Junio de 2011.

Además podéis consultar el siguiente enlace, con una relación de todos los cambios realizados por el Service Pack.

Cambios de Microsoft SharePoint Server 2010 Service Pack 1

Starter master page (versión extendida)

image_thumb (1)

Todos conocemos los beneficios de las versiones starter de las páginas maestras de SharePoint 2010, llamadas minimal master pages en la versión 2007. Se trata de una páginas maestras simplificadas para iniciar un diseño de cero, comentadas para ayudar en su desarrollo. Estas páginas maestras las encontramos en CodePlex en el proyecto Starter Master Pages for SharePoint 2010.

De la mano de Steve Ottenad nos llega una versión extendida o mejorada de estas páginas maestras, SharePoint 2010 Starter Master Page – Extended, que incluyen ciertas mejoras sobre las originales. En sus propias palabras:

  • A solid Starter Master page
  • A sticky footer
  • A concealed Ribbon (very useful)
  • An improved scroll fix that overrides the horrendous V4 one.
  • Lots and lots of compression

Lo que está claro es que sea con unas u otras cualquier proyecto que implique diseño en la presentación se beneficiará notablemente del uso de estas páginas maestras.

Error de “List not found” para un DataFormWebPart exportado a otro sitio

En el anterior post (http://www.codepoint.es/archive/2011/07/11/como-crear-p%C3%A1ginas-para-gestionar-listas-en-un-sitio-distinto-al-que-se-alojan-.aspx) se comentaba como exportar un DataFormWebPart de SharePoint a otro sitio dentro de la colección para que siguiera accediendo a los datos de la lista alojada en otro sitio. Aún siguiendo las instrucciones en ocasiones puede ocurrir que SharePoint Designer visualice bien la información pero no así el explorador web, que nos devuelve un error de “List not found”.

Para solucionar este problema simplemente deberemos cambiar el atributo ViewFlag de laDataFormWebPart y ponerlo a “0”.

<WebPartPages:DataFormWebPart runat="server" IsIncluded="True" AsyncRefresh="True" FrameType="None" NoDefaultStyle="TRUE" ViewFlag="0" …

Espero que os ayude.

Como crear páginas para gestionar listas en un sitio distinto al que se alojan.

Desarrollando una web en Sharepoint 2010 me encontré con el siguiente problema:

Creé una lista de solicitudes en la raíz de la colección de sitios para que los usuarios anónimos pudiesen rellenar la información necesaria y enviarla desde la misma web (a modo de formulario).

La web era multi-idioma, y el formulario debía aparecer en un subsitio en concreto.

Bien, no había manera de hacer referencia a una lista que estaba situada en la raíz desde una página ubicada en un subsitio de la colección.

Ahí va la solución:

  1. Crear una página .aspx en la raíz (biblioteca de páginas).
  2. Desde SharePoint Designer, en el menú, hacer clic en: Insertar –> Formulario de nuevo elemento – > Formulario de lista personalizada.
  3. Estos pasos crean un DataFormWebPart. Debe copiarlo y pegarlo en la página del subsitio en la que desea que esté el formulario.
  4. Localizar el tag “SharePointWebControls:SPDataSource” y dentro de éste, en el tag “<SelectParameters>” añadir el parámetro siguiente:
<WebPartPages:DataFormParameter Name="WebURL" ParameterKey="WebURL" PropertyName="ParameterValues" DefaultValue="/"/>

Es decir, quedaría de la siguiente forma:

<SelectParameters><WebPartPages:DataFormParameter Name="WebURL"…

A partir de este momento el DataFormWebPart, sabe que la localización de la lista está en la raíz de la colección de sitios, y se muestra el formulario sin más problemas.

LINQPad, la herramienta para nuestras consultas LINQ

linkMuchos de vosotros conoceréis LINQPad , la herramienta que nos permite crear y ejecutar consultas LINQ de forma fácil y asistida. Las últimas versiones permiten conectar con orígenes diversos de datos y hacer LINQ contra objetos, SQL, Entity Framework, etc. Además incorpora una ayuda con muchísimos ejemplos preparados para ejecutar que nos permiten indagar y aprender los secretos más íntimos de esta tecnología.

Os animo a probarlo. Lo podéis descargar desde su web,http://www.linqpad.net. Sin coste alguno podéis descargar la herramienta básica que ya nos quita de muchos apuros. También podemos adquirir el producto profesional que nos ofrece algunas funcionalidades adicionales interesantes, como el autocompletado de las consultas.

link2

Gestionar ficheros de la GAC en Windows 2008

asasEn Windows 2008 y debido a las mejoras de seguridad UAC (User Account Control), resulta mucho más complejo el hecho de gestionar la GAC (Global Assembly Cache). Operaciones de instalación o desinstalación de emsamblados en la GAC se hacen ahora imposibles aunqué ejecutemos el explorador en modo de privilegios elevados.

La solución más segura y limpia que hemos encontrado despues de mucho investigar es la de hacer uso de gacutil.exe para este tipo de operaciones. No obstante Windows 2008 no dispone de esta herramienta, habitualmente instalada por las distintas versiones de Microsoft Visual Studio o el SDK del .NET Framework. Existe otra posibilidad, que es instalar Windows SDK for Windows Server 2008 and .NET Framework 3.5, que tambien incluye esta utilidad.

Alternativa a Redgate .NET Reflector

Desde principios de este año la archiconocida herramienta de inspección y desensamblado para ensamblados de .NET se debe pagar. Reflector ha dejado de ser una herramienta gratuita por lo que la comunidad rápidamente ha empezado a buscar alternativas. Si no quereis pagar los $35 que pide Redgate por .NET Reflector, la mejor alternativa que existe esILSpy. Se trata de una herramienta de características muy similares a Reflector y que seguro se hará popular en poco tiempo.

image_2 (5)

Mostrar XsltListViewWebPart de una lista alojada en otro site

En SharePoint Designer 2010 sabemos que podemos insertar vistas de datos de las listas que tenemos en nuestro site. Ahora bien: y si queremos mostrar al usuario los datos de una lista que no se encuentra en el site donde queremos mostrarla, sinó en otro distinto?

La solución es muy sencilla:

  1. Desde el navegador, editar cualquier página del sitio en el que se encuentra la lista. Una vez en modo de edición, ir a Insertar > Lista existente, y elegimos la lista que queremos. Esto inserta un XSLTListViewWebpart en la página.
  2. Abrir la página en la que acabamos de insertar la lista en SharePoint Designer 2010.
  3. Seleccionar el elemento web que muestra la lista.
    1
  4. Selecciona “Herramientas de la vista de lista” > “Elemento web” > “En galería del sitio”.
    2
  5. SharePoint Designer le hará la siguiente pregunta:
    3
    A la que debe contestar que sí, ya que entonces le mostrará la misma lista desde cualquier subsitio.
  6. 6. Desde el mismo SharePoint Designer, abrir la página en la que se quiere ver la lista (desde otro site) y editarla. En un lugar en el que se pueda insertar elementos web seleccionar “Insertar” > “Elemento web”. En el desplegable elegir el que acabamos de crear.
    4

Y ya está, se va a mostrar en nuestra página como si de cualquier elemento web se tratara.

LLamada a un Web Service de creación de usuarios de SharePoint a través de un ensamblado de SQL Server

Como es sabido, SQL Server 2008/2005 permite integración de ensamblados de .NET para interactuar entre otras, con fuentes externas.

Pues bién, esta entrada va a tratar la problematica de la creación de usuarios de SharePoint con autentificación por FBA. El motivo es simplemente que cuando queremos importar las tablas de usuario de ASP.NET desde una fuente externa, no podemos insertar los datos completos del usuario, esto únicamente se puede hacer desde SharePoint.

Manos a la obra, en primer lugar hemos de crear Web Service para la creación del usuario en SharePoint del siguiente estilo:

[WebMethod]
public void CreateUser(string Site, string UserProvider,string UserId, string UserName) 
{
	SPSecurity.RunWithElevatedPrivileges(delegate()
	   {
		   using (SPSite site = new SPSite(Site))
		   {
			   SPWeb web = site.RootWeb;
			   web.AllUsers.Add(UserProvider + "|" + UserId, "", UserName, "");
			   web.EnsureUser(UserProvider + "|" + UserId);
		   }
	   });
			
}

Una vez creado, hemos de crear un proxy del WebService a través de la utilidad WSDL.EXE(lo podéis encontrar en C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64)

La llamada será del estilo:

WSDL.exe /o MyServiceProxy.cs /n Trentia.SPUsers http://<URLdelWebService>

Con la clase resultante ya podemos insertarla en nuestro proyecto de biblioteca de clases de SQL Server.

El siguiente paso, es crear nuestra clase que será invocada a través de SQL:

[SqlProcedure]
public static void GetMessage(SqlString WSUrl, SqlString SiteURL, SqlString UserProvider, SqlString UserID, SqlString UserName
   , out SqlString strMessge)
{

	try
	{
		Service1 svc = new Service1();
		svc.Url = WSUrl.ToString();
		//svc.Credentials = CredentialCache.DefaultCredentials;
		// call web service method; return as a DataTable
		svc.CreateUser(SiteURL.ToString(), UserProvider.ToString(), UserID.ToString(), UserName.ToString());

		strMessge = "OK";
	}
	catch (Exception ex)
	{
		strMessge = ex.ToString();
	}
}

En algunas ocasiones, sobre todo cuando intentamos acceder a WebServices e intercambiar datos, hemos de generar una clases serializable del ensamblado.

Para ello, hemos de ejecutar otra utilidad llamada SGEN.exe ubicada también en C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64

La ejecución es la siguiente:

SGEN.exe /a: <RutaYEnsambladoDLL> /compiler:keyfile:<RutaYFicheroSNK>

Con el ensamblado generado por el Visual Studio y el ensamblado generado con la utilidad SGEN.exe, ya tenemos todo lo suficiente para realizar las llamadas a través del SQL Server.

Desde el SQL Server, en primer lugar hemos de habilitar una seria de parámetros en nuestra BBDD

sp_configure 'clr enabled', 1
GO
reconfigure
GO

ALTER DATABASE [DATABASENAME]
SET TRUSTWORTHY ON
GO

CREATE ASSEMBLY MSSQLTipsCLRLib 
FROM 'c:\Trentia.SQLAssemblySharePointUsers.dll'
WITH PERMISSION_SET = UNSAFE /* SI DA ERROR: EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false **/

CREATE ASSEMBLY [MSSQLTipsCLRLib.XmlSerializers]
FROM 'c:\Trentia.SQLAssemblySharePointUsers.XmlSerializers.dll'
WITH PERMISSION_SET = SAFE

 

Una vez tenemos los ensamblados cargados únicamente nos queda crear un PROCEDURE que será quien invoque el ensamblado.

Para ello:

CREATE PROCEDURE [dbo].[AddSPUser]

   @WSUrl NVARCHAR(200),
   @SiteURL NVARCHAR(200),
   @UserProvider NVARCHAR(200),
   @UserID NVARCHAR(200),
   @UserName NVARCHAR(200),
   @strMessge NVARCHAR(400) OUT
  

WITH EXECUTE AS CALLER
AS
EXTERNAL NAME MSSQLTipsCLRLib.SPCreateUserProfileSharePoint.GetMessage
GO

EXEC DBO.AddSPUser 'http:///_vti_bin/SPUser.asmx','HTTP:///','i:0#.f|proveedoraspnet','1019','juanito',''